diff --git a/docs/VCS_TIER2_SUPERBLOCK_V2_COMPLETE_HANDOFF_2026-08-16.md b/docs/VCS_TIER2_SUPERBLOCK_V2_COMPLETE_HANDOFF_2026-08-16.md new file mode 100644 index 0000000..4bacadc --- /dev/null +++ b/docs/VCS_TIER2_SUPERBLOCK_V2_COMPLETE_HANDOFF_2026-08-16.md @@ -0,0 +1,235 @@ +# VCS Tier-2 SUPERBLOCK V2 COMPLETE — Handoff + +Date: 2026-08-16 +Base: `PSPRecomp-VCS-TIER2-SUPERBLOCK-V1-PYFIX-2026-08-16` +Target: VCSNative / PSPRecomp / Windows DirectX 12 + +## Purpose + +V1 proved that scheduler-safe second-layer AOT can boot and run, but a single 0154↔0155 trace was too small to move whole-frame performance. V2 replaces that experiment with a profile-guided multi-cluster second layer covering the dominant guest/AOT hotspots measured by `GUESTHOT_UNIT` / `GUESTHOT_PC`. + +This is not the rejected GPR cache A/B and not the neutral leaf-inline A/B. The original generated AOT remains the semantic fallback. V2 cold-splits measured hot control-flow closures into smaller host translation units and fuses selected cross-unit direct calls/tail transfers inside those closures while preserving Runtime chain-depth and starvation/scheduler accounting. + +## Final V2 coverage + +Static generated second-layer corpus: + +- 7 profile-guided clusters +- 1,060 selected hot basic blocks +- 17,660 generated cluster source lines (generator-reported) +- 49 static cross-unit/direct call sites fused +- 13 static tail-transfer sites fused +- 25 entry hooks across 10 generated units +- 9 explicit cold exits in the Entity cluster +- all cold/external paths retain the original AOT fallback + +Clusters: + +| Bit | Mask | Cluster | Units / purpose | Blocks | Fused calls | Fused tails | Hooks | +|---:|---:|---|---|---:|---:|---:|---:| +| 0 | `0x01` | Entity | 0152/0153 accessors + 0154/0155 entity loop | 94 | 13 | 8 | 5 | +| 1 | `0x02` | Geometry | 0084/0085 geometry/collision | 379 | 33 | 0 | 4 | +| 2 | `0x04` | Boundary | 0085/0086 boundary loop | 62 | 0 | 4 | 5 | +| 3 | `0x08` | Matrix | 0044 matrix/VFPU hot function | 73 | 0 | 0 | 1 | +| 4 | `0x10` | Physics | 0129 transform/physics hot function | 15 | 0 | 0 | 1 | +| 5 | `0x20` | World | 0157/0158 world/streaming hot functions | 402 | 1 | 0 | 6 | +| 6 | `0x40` | Edge43 | 0043/0044 boundary | 35 | 2 | 1 | 3 | +| | `0x7F` | **ALL** | | **1,060** | **49** | **13** | **25** | + +The 0157 side was added in the final pass because unit 0157 was the sixth-largest unit hotspot in the original profiler. Its measured roots are now in the same World cluster as 0158 rather than leaving half of that hot pair in first-layer AOT. + +## Runtime architecture + +### Multi-cluster hot CFGs + +`profiles/vcs/tools/build_tier2_superblocks.py` parses the generated AOT blocks, computes bounded local control-flow closures from measured PC roots, emits cluster-local labels, and patches only the measured entry PCs in the original units. + +Each enabled hook calls a dedicated second-layer function. Local control flow stays in that function. Selected `invoke_chained_direct` calls whose target is inside the same cluster become local second-layer transfers. + +### Scheduler / chain-depth preservation + +Removed native `invoke_chained_direct` stack frames are retained as logical Runtime frames through the existing scheduler-safe Tier-2 helpers. Fused calls/tails therefore continue to obey chain-depth limits and starvation boundaries. If an external/cold path is required, pending logical frames are completed before returning to normal AOT. + +### Original AOT fallback + +The original generated unit body remains directly below each hook. Disabling a cluster immediately restores first-layer execution at that PC without rebuilding. Cold exits with known original entry IDs resume the original generated entry function rather than entering a generic PC dispatcher. + +## Runtime switches (no rebuild) + +Global off: + +```bat +set PSPRECOMP_TIER2_SUPERBLOCKS=0 +``` + +Global on/default: + +```bat +set PSPRECOMP_TIER2_SUPERBLOCKS=1 +``` + +Cluster mask (default all = `0x7F`): + +```bat +set PSPRECOMP_TIER2_CLUSTER_MASK=0x7F +``` + +Useful masks: + +- Entity `0x01` +- Geometry `0x02` +- Boundary `0x04` +- Matrix `0x08` +- Physics `0x10` +- World `0x20` +- Edge43 `0x40` + +Masks can be combined with bitwise OR, e.g. Entity+Geometry = `0x03`. + +The mask is read once per process. Restart VCSNative after changing it. + +## Coverage telemetry + +V2 fixes a major blind spot from V1: every PERF interval now emits a `TIER2` line. + +Header expected: + +```text +stage=tier2-superblock-v2-complete-2026-08-16 +perf_telemetry=1 interval_vblanks=60 +tier2_superblocks=1 version=2 clusters=7 mask=0x7f hot_blocks=1060 static_fused_calls=49 static_fused_tail=13 hooks=25 +``` + +Per PERF window, expect fields such as: + +```text +TIER2 window=60 vblank=... entity_e=... entity_x=... geometry_e=... geometry_x=... ... total_entries=... fused_tail=... fused_calls=... cold=... fallback=... sampled=... sampled_us=... +``` + +`*_e` = dynamic second-layer entries in that 60-vblank window. + +`*_x` = dynamic fused call + tail edges actually executed, not static site count. + +`sampled_us` is low-overhead 1/256 sampled inclusive cluster time. It is for coverage/ranking, not an exclusive CPU-time sum. + +Counters are thread-local to avoid atomics on hot edges. If a future runtime changes Allegrex execution/reporting to different threads and the TIER2 lines unexpectedly remain zero, the counters must be moved to runtime-owned or atomic aggregation. + +## Build integration + +`BUILD_VCS_NINJA.bat` now: + +1. runs future-timestamp repair; +2. reapplies BOOTFIX-safe transforms only; +3. detects Python 3 using `py -3`, then `python`; +4. regenerates V2 clusters idempotently; +5. invalidates only V2 hook/cluster objects on the first V2 revision build; +6. configures/builds VCSNative and the normal regression/probe targets. + +The first V2 revision invalidates units: + +`0043 0044 0084 0085 0086 0129 0154 0155 0157 0158` + +No manual `.obj` deletion is required. + +MSVC cluster flags are kept independent from the giant generated corpus: + +- `/O2` +- `/Ob3` +- `/bigobj` +- `/GL-` + +A final CMake audit fixed an option-property overwrite: host `/Ob3` is now appended instead of replacing the cluster `/O2 /bigobj /GL-` options. + +## Generator correctness / idempotence + +Final second execution reports: + +```text +host_changed=0 +hook_units_changed=0 +blocks=1060 +lines=17660 +fused_calls=49 +fused_tail=13 +cold_exits=9 +``` + +CFG audit: + +- 7/7 cluster files: every `goto SB_*` resolves to a label in the same TU +- zero raw `goto LOCAL_DISPATCH` remains in cluster files +- 25 V2 hooks found across exactly 10 generated units +- zero V1 hook markers remain in generated units + +BOOTFIX-safe pass on the final generated corpus with `--check`: + +```text +files=0 +caps_2048_to_256=0 +unaligned_fastview=0 +fpu_set_inline=0 +fpu_get_inline=0 +hot VFPU changed=0 +local_cap_2048=0 tail_chain=0 gpr_cache=0 fpr_cache=0 +``` + +So the real Windows build order is idempotent. + +## Validation performed + +Final tests: + +- `psprecomp_tests`: PASS +- `vcs_profile_tests`: PASS +- `vfpu_tier2_tests`: PASS + +`vcs_profile_tests` now explicitly tests Tier-2 multi-cluster counter snapshot/reset semantics in addition to the existing scheduler/callback/framebuffer suite. + +Actual VCSNative-target object compilation (not only syntax checking): + +- 7/7 V2 cluster `.cpp` objects compiled +- 10/10 hooked generated-unit objects compiled: 0043, 0044, 0084, 0085, 0086, 0129, 0154, 0155, 0157, 0158 + +A full Linux `VCSNative` link was attempted, but `runtime.hpp`/CMake dependency changes made Ninja schedule ~250 generated/host objects and the container execution window interrupted the whole-target build after host compilation had begun. No source/compiler diagnostic was emitted before interruption. Do **not** interpret that as a completed full link. Windows/Ninja remains the authoritative complete build for this profile. + +## What is deliberately NOT in V2 + +The following previously failed or neutral experiments are not reintroduced: + +- global/local-cap 2048 change +- EXTREME cross-unit tail-chain semantics +- aggressive GPR/FPR architectural-state promotion +- OPT1 dirty GPR block cache +- GPR read-only A/B +- leaf-inline A/B +- forced GE async / forced vertex-parallel defaults + +V2 obtains its structural gain by hot CFG extraction and call/tail fusion while leaving architectural state semantics on the known-good SAFE path. + +## Windows test procedure + +Apply the V2 overlay over the current V1 PYFIX tree and run: + +```bat +profiles\vcs\BUILD_VCS_NINJA.bat +``` + +Do not delete `.obj` manually. + +Then play the same heavy city route for roughly 3–5 minutes and provide the new `VCSNative.log`. + +The next analysis should compare both `PERF` and `TIER2` lines. Most important questions: + +1. How many dynamic entries/edges does each cluster actually cover? +2. Does `guest_cpu_us_avg` fall for comparable draw/texture/transfer loads? +3. Which cluster has the best sampled cost-to-entry ratio? +4. If performance or correctness regresses, can the offending cluster be isolated immediately by `PSPRECOMP_TIER2_CLUSTER_MASK`? + +## Status / progress estimate + +- Overall VCS recomp project: ~88% +- Tier-2 performance work: ~86% +- Second-layer architecture/implementation: ~85% +- Performance success against the 160–200 FPS aspiration: **not yet verified**; real Windows gameplay data is still required. + +The implementation is complete enough to test as a multi-cluster second layer, but the optimization target is not considered achieved until the runtime logs demonstrate a material reduction in guest CPU time. diff --git a/docs/VCS_TIER2_SUPERBLOCK_V2_COMPLETE_STATS_2026-08-16.json b/docs/VCS_TIER2_SUPERBLOCK_V2_COMPLETE_STATS_2026-08-16.json new file mode 100644 index 0000000..51cc1f7 --- /dev/null +++ b/docs/VCS_TIER2_SUPERBLOCK_V2_COMPLETE_STATS_2026-08-16.json @@ -0,0 +1,153 @@ +{ + "release": "PSPRecomp-VCS-TIER2-SUPERBLOCK-V2-COMPLETE-2026-08-16", + "base": "PSPRecomp-VCS-TIER2-SUPERBLOCK-V1-PYFIX-2026-08-16", + "architecture": { + "clusters": 7, + "hot_blocks": 1060, + "generated_cluster_lines": 17660, + "static_fused_calls": 49, + "static_fused_tail_edges": 13, + "cold_exits": 9, + "hooks": 25, + "hooked_units": [ + "0043", + "0044", + "0084", + "0085", + "0086", + "0129", + "0154", + "0155", + "0157", + "0158" + ], + "cluster_mask_all": "0x7f", + "global_kill_switch": "PSPRECOMP_TIER2_SUPERBLOCKS=0", + "cluster_mask_env": "PSPRECOMP_TIER2_CLUSTER_MASK" + }, + "clusters": { + "entity": { + "mask": "0x01", + "units": [ + "0152", + "0153", + "0154", + "0155" + ], + "blocks": 94, + "fused_calls": 13, + "fused_tail": 8, + "hooks": 5 + }, + "geometry": { + "mask": "0x02", + "units": [ + "0084", + "0085" + ], + "blocks": 379, + "fused_calls": 33, + "fused_tail": 0, + "hooks": 4 + }, + "boundary": { + "mask": "0x04", + "units": [ + "0085", + "0086" + ], + "blocks": 62, + "fused_calls": 0, + "fused_tail": 4, + "hooks": 5 + }, + "matrix": { + "mask": "0x08", + "units": [ + "0044" + ], + "blocks": 73, + "fused_calls": 0, + "fused_tail": 0, + "hooks": 1 + }, + "physics": { + "mask": "0x10", + "units": [ + "0129" + ], + "blocks": 15, + "fused_calls": 0, + "fused_tail": 0, + "hooks": 1 + }, + "world": { + "mask": "0x20", + "units": [ + "0157", + "0158" + ], + "blocks": 402, + "fused_calls": 1, + "fused_tail": 0, + "hooks": 6 + }, + "edge43": { + "mask": "0x40", + "units": [ + "0043", + "0044" + ], + "blocks": 35, + "fused_calls": 2, + "fused_tail": 1, + "hooks": 3 + } + }, + "telemetry": { + "perf_interval_vblanks": 60, + "tier2_line_per_perf_window": true, + "entry_timing_sample_stride": 256, + "fields": [ + "cluster entries", + "cluster fused edges", + "total_entries", + "fused_tail", + "fused_calls", + "cold", + "fallback", + "sampled", + "sampled_us" + ] + }, + "validation": { + "psprecomp_tests": "PASS", + "vcs_profile_tests": "PASS incl. Tier2 counter snapshot/reset", + "vfpu_tier2_tests": "PASS", + "cluster_object_compile": "7/7 PASS with actual VCSNative target flags", + "hooked_unit_object_compile": "10/10 PASS with actual VCSNative target flags", + "generator_idempotence": "PASS: host_changed=0, hook_units_changed=0", + "cfg_audit": "PASS: zero unresolved SB gotos, zero raw LOCAL_DISPATCH", + "bootfix_check": "PASS: zero changes", + "full_linux_vcsnative_link": "NOT COMPLETED: whole target rebuild exceeded container execution window; no compiler/source diagnostic before interruption" + }, + "msvc": { + "cluster_options": [ + "/O2", + "/Ob3", + "/bigobj", + "/GL-" + ], + "cmake_property_overwrite_fix": true, + "python_detection": [ + "py -3", + "python" + ] + }, + "performance_status": "UNMEASURED on Windows for V2; runtime log required", + "progress_estimate": { + "overall_project_percent": 88, + "tier2_percent": 86, + "second_layer_architecture_percent": 85 + } +} \ No newline at end of file diff --git a/profiles/vcs/CMakeLists.txt b/profiles/vcs/CMakeLists.txt index fa99dd0..bfcd2b9 100644 --- a/profiles/vcs/CMakeLists.txt +++ b/profiles/vcs/CMakeLists.txt @@ -151,21 +151,36 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") set_source_files_properties("${VCS_PROFILE_DIR}/host/vcs_profile.cpp" PROPERTIES COMPILE_OPTIONS "-O2") endif() -# Tier-2 V1 is deliberately a compact hot-region superblock (~1.1k lines), -# not a full-unit mega-TU. Give this host-side trace normal aggressive host -# optimization while keeping the 234 generated AOT units on their measured -# per-source policy above. +# Tier-2 V2 keeps each profile-guided cluster in its own translation unit. +# This is the actual second AOT layer: hot functions/loops are cold-split from +# the giant generated units and selected cross-unit edges are fused locally. +# /GL- on these sources avoids re-inflating them into a giant LTCG partition; +# their hot paths are already visible to the normal /O2+/Ob3 optimizer. +set(VCS_TIER2_CLUSTER_SOURCES + host/vcs_tier2_cluster_entity.cpp + host/vcs_tier2_cluster_geometry.cpp + host/vcs_tier2_cluster_boundary.cpp + host/vcs_tier2_cluster_matrix.cpp + host/vcs_tier2_cluster_physics.cpp + host/vcs_tier2_cluster_world.cpp + host/vcs_tier2_cluster_edge43.cpp +) if(MSVC) - set_source_files_properties("${VCS_PROFILE_DIR}/host/vcs_tier2_superblocks.cpp" PROPERTIES - COMPILE_OPTIONS "/O2;/Ob3;/bigobj") + set_source_files_properties( + "${VCS_PROFILE_DIR}/host/vcs_tier2_superblocks.cpp" + ${VCS_TIER2_CLUSTER_SOURCES} + PROPERTIES COMPILE_OPTIONS "/O2;/Ob3;/bigobj;/GL-") elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") - set_source_files_properties("${VCS_PROFILE_DIR}/host/vcs_tier2_superblocks.cpp" PROPERTIES - COMPILE_OPTIONS "-O3;-g0") + set_source_files_properties( + "${VCS_PROFILE_DIR}/host/vcs_tier2_superblocks.cpp" + ${VCS_TIER2_CLUSTER_SOURCES} + PROPERTIES COMPILE_OPTIONS "-O3;-g0") endif() set(VCS_GPU_BACKEND_SOURCE host/ge_gpu_backend_dx12.cpp) set(VCS_HDR_POST_SOURCE host/vcs_hdr_post_dx12_stub.cpp) set(VCS_HOST_SOURCES + host/vcs_tier2_superblocks.cpp host/vcs_bootstrap_paths.cpp host/vcs_profile.cpp host/vcs_native_fast_paths.cpp @@ -234,7 +249,7 @@ endif() add_executable(VCSNative ${VCS_APP_RESOURCES} host/main.cpp - host/vcs_tier2_superblocks.cpp + ${VCS_TIER2_CLUSTER_SOURCES} ${VCS_HOST_SOURCES} ${VCS_GENERATED} ) @@ -248,8 +263,11 @@ if(MSVC) # (MSVC reports this as "D9025: overriding '/Ob0' with '/Ob3'"). Apply it to # the host sources only. target_compile_options(VCSNative PRIVATE ${PSPRECOMP_MSVC_MP_FLAG}) - set_source_files_properties(host/main.cpp host/vcs_tier2_superblocks.cpp ${VCS_HOST_SOURCES} - DIRECTORY "${VCS_PROFILE_DIR}" PROPERTIES COMPILE_OPTIONS + # APPEND is required here: Tier-2 cluster sources already carry /O2, + # /bigobj and /GL-. Replacing COMPILE_OPTIONS would silently drop those + # flags on MSVC and make the Windows build differ from the validated one. + set_property(SOURCE host/main.cpp ${VCS_TIER2_CLUSTER_SOURCES} ${VCS_HOST_SOURCES} + DIRECTORY "${VCS_PROFILE_DIR}" APPEND PROPERTY COMPILE_OPTIONS "$<$:/Ob3>;$<$:/Ob3>") target_link_options(VCSNative PRIVATE /STACK:67108864) if(PSPRECOMP_LTO) diff --git a/profiles/vcs/generated/generated_unit_0043.cpp b/profiles/vcs/generated/generated_unit_0043.cpp index 6b9b943..e6ed12b 100644 --- a/profiles/vcs/generated/generated_unit_0043.cpp +++ b/profiles/vcs/generated/generated_unit_0043.cpp @@ -1,5 +1,6 @@ #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_tier2_superblocks.hpp" #include #include #include @@ -9480,6 +9481,12 @@ L_088B3FC8: ctx.gpr[30] = (0u | 0u); goto L_088B3FCC; L_088B3FCC: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Edge43)) { + vcs::tier2_superblock_edge43(rt, ctx, aot_mem, 0x088B3FCCu); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(68))); ctx.gpr[18] = (ctx.gpr[18] + ctx.gpr[30]); ctx.gpr[5] = (ctx.gpr[29] + static_cast(16)); diff --git a/profiles/vcs/generated/generated_unit_0044.cpp b/profiles/vcs/generated/generated_unit_0044.cpp index 9dff3b4..8ac0648 100644 --- a/profiles/vcs/generated/generated_unit_0044.cpp +++ b/profiles/vcs/generated/generated_unit_0044.cpp @@ -1,5 +1,6 @@ #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_tier2_superblocks.hpp" #include #include #include @@ -877,6 +878,12 @@ LOCAL_DISPATCH: } } L_088B4004: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Edge43)) { + vcs::tier2_superblock_edge43(rt, ctx, aot_mem, 0x088B4004u); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[17] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[18] + static_cast(6)))))); ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[18] + static_cast(14)))))); ctx.gpr[4] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[17]) ? 1u : 0u); @@ -979,6 +986,12 @@ L_088B40F4: ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(48))); goto L_088B40F8; L_088B40F8: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Edge43)) { + vcs::tier2_superblock_edge43(rt, ctx, aot_mem, 0x088B40F8u); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(52))); ctx.gpr[30] = (ctx.gpr[30] + static_cast(16)); @@ -1819,6 +1832,12 @@ L_088B4708: ctx.pc = jump_target; return; L_088B4738: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Matrix)) { + vcs::tier2_superblock_matrix(rt, ctx, aot_mem, 0x088B4738u); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[29] = (ctx.gpr[29] + static_cast(-352)); aot_mem.aot_store32(ctx.gpr[29] + static_cast(296), std::bit_cast(ctx.fpr[20])); aot_mem.aot_store32(ctx.gpr[29] + static_cast(300), ctx.gpr[16]); diff --git a/profiles/vcs/generated/generated_unit_0084.cpp b/profiles/vcs/generated/generated_unit_0084.cpp index 79afbed..f3b5851 100644 --- a/profiles/vcs/generated/generated_unit_0084.cpp +++ b/profiles/vcs/generated/generated_unit_0084.cpp @@ -1,5 +1,6 @@ #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_tier2_superblocks.hpp" #include #include #include @@ -3649,6 +3650,12 @@ L_0895543C: ctx.pc = jump_target; return; L_08955444: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Geometry)) { + vcs::tier2_superblock_geometry(rt, ctx, aot_mem, 0x08955444u); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[9] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(11768))); ctx.set_vfpu_scalar_bits_ct<12u>(aot_mem.aot_load32(ctx.gpr[5] + static_cast(4))); ctx.set_vfpu_scalar_bits_ct<44u>(aot_mem.aot_load32(ctx.gpr[5] + static_cast(8))); @@ -3716,6 +3723,12 @@ L_089554A0: ctx.pc = jump_target; return; L_089554A8: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Geometry)) { + vcs::tier2_superblock_geometry(rt, ctx, aot_mem, 0x089554A8u); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[29] = (ctx.gpr[29] + static_cast(-64)); aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), std::bit_cast(ctx.fpr[20])); aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[16]); diff --git a/profiles/vcs/generated/generated_unit_0085.cpp b/profiles/vcs/generated/generated_unit_0085.cpp index 1c13dcc..ba200c6 100644 --- a/profiles/vcs/generated/generated_unit_0085.cpp +++ b/profiles/vcs/generated/generated_unit_0085.cpp @@ -1,5 +1,6 @@ #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_tier2_superblocks.hpp" #include #include #include @@ -2460,6 +2461,12 @@ L_08958CF8: ctx.pc = jump_target; return; L_08958D28: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Geometry)) { + vcs::tier2_superblock_geometry(rt, ctx, aot_mem, 0x08958D28u); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[29] = (ctx.gpr[29] + static_cast(-624)); aot_mem.aot_store32(ctx.gpr[29] + static_cast(576), std::bit_cast(ctx.fpr[20])); aot_mem.aot_store32(ctx.gpr[29] + static_cast(580), ctx.gpr[16]); @@ -5787,6 +5794,12 @@ L_0895A72C: ctx.pc = jump_target; return; L_0895A760: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Geometry)) { + vcs::tier2_superblock_geometry(rt, ctx, aot_mem, 0x0895A760u); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[29] = (ctx.gpr[29] + static_cast(-144)); aot_mem.aot_store32(ctx.gpr[29] + static_cast(72), std::bit_cast(ctx.fpr[20])); aot_mem.aot_store32(ctx.gpr[29] + static_cast(76), std::bit_cast(ctx.fpr[22])); @@ -8395,6 +8408,12 @@ L_0895BF04: aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); goto L_0895BF3C; L_0895BF3C: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Boundary)) { + vcs::tier2_superblock_boundary(rt, ctx, aot_mem, 0x0895BF3Cu); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[4] = (0u | 0u); aot_mem.aot_store8(ctx.gpr[29] + static_cast(120), static_cast(ctx.gpr[4])); ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); @@ -8419,6 +8438,12 @@ L_0895BF5C: aot_mem.aot_store32(ctx.gpr[29] + static_cast(108), ctx.gpr[4]); goto L_0895BF7C; L_0895BF7C: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Boundary)) { + vcs::tier2_superblock_boundary(rt, ctx, aot_mem, 0x0895BF7Cu); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[18] = (ctx.gpr[20] | 0u); { const bool branch_taken = ctx.gpr[30] == 0u; ctx.gpr[4] = (15u << 16u); diff --git a/profiles/vcs/generated/generated_unit_0086.cpp b/profiles/vcs/generated/generated_unit_0086.cpp index 50ad29d..4cdb036 100644 --- a/profiles/vcs/generated/generated_unit_0086.cpp +++ b/profiles/vcs/generated/generated_unit_0086.cpp @@ -1,5 +1,6 @@ #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_tier2_superblocks.hpp" #include #include #include @@ -759,6 +760,12 @@ LOCAL_DISPATCH: } } L_0895C000: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Boundary)) { + vcs::tier2_superblock_boundary(rt, ctx, aot_mem, 0x0895C000u); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[5]); @@ -772,6 +779,12 @@ L_0895C000: goto L_0895C01C; } L_0895C01C: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Boundary)) { + vcs::tier2_superblock_boundary(rt, ctx, aot_mem, 0x0895C01Cu); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[18] + static_cast(6))); ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(92))); ctx.gpr[19] = (0u | 0u); @@ -1022,6 +1035,12 @@ L_0895C28C: ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[8] + static_cast(8))); goto L_0895C2A8; L_0895C2A8: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Boundary)) { + vcs::tier2_superblock_boundary(rt, ctx, aot_mem, 0x0895C2A8u); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(104))); ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); ctx.gpr[20] = (ctx.gpr[20] + static_cast(48)); diff --git a/profiles/vcs/generated/generated_unit_0129.cpp b/profiles/vcs/generated/generated_unit_0129.cpp index 9434d6a..535e281 100644 --- a/profiles/vcs/generated/generated_unit_0129.cpp +++ b/profiles/vcs/generated/generated_unit_0129.cpp @@ -1,5 +1,6 @@ #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_tier2_superblocks.hpp" #include #include #include @@ -3859,6 +3860,12 @@ L_08A09AD0: ctx.pc = jump_target; return; L_08A09B2C: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Physics)) { + vcs::tier2_superblock_physics(rt, ctx, aot_mem, 0x08A09B2Cu); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[29] = (ctx.gpr[29] + static_cast(-16)); aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[16]); aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[17]); diff --git a/profiles/vcs/generated/generated_unit_0154.cpp b/profiles/vcs/generated/generated_unit_0154.cpp index 0dbd1fe..4add547 100644 --- a/profiles/vcs/generated/generated_unit_0154.cpp +++ b/profiles/vcs/generated/generated_unit_0154.cpp @@ -6792,12 +6792,12 @@ L_08A6E828: aot_mem.aot_store32(ctx.gpr[29] + static_cast(1584), ctx.gpr[6]); goto L_08A6E894; L_08A6E894: -// TIER2_SUPERBLOCK_V1_HOOK_BEGIN - if (vcs::tier2_superblocks_enabled()) { - vcs::tier2_superblock_154_155(rt, ctx, aot_mem, 0x08A6E894u); +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Entity)) { + vcs::tier2_superblock_entity(rt, ctx, aot_mem, 0x08A6E894u); return; } -// TIER2_SUPERBLOCK_V1_HOOK_END +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1600))); ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); { const bool branch_taken = ctx.gpr[4] == 0u; @@ -6808,12 +6808,12 @@ L_08A6E894: goto L_08A6E8A4; } L_08A6E8A4: -// TIER2_SUPERBLOCK_V1_HOOK_BEGIN - if (vcs::tier2_superblocks_enabled()) { - vcs::tier2_superblock_154_155(rt, ctx, aot_mem, 0x08A6E8A4u); +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Entity)) { + vcs::tier2_superblock_entity(rt, ctx, aot_mem, 0x08A6E8A4u); return; } -// TIER2_SUPERBLOCK_V1_HOOK_END +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1576))); ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); diff --git a/profiles/vcs/generated/generated_unit_0155.cpp b/profiles/vcs/generated/generated_unit_0155.cpp index b9e5fe2..c80a3a9 100644 --- a/profiles/vcs/generated/generated_unit_0155.cpp +++ b/profiles/vcs/generated/generated_unit_0155.cpp @@ -3417,12 +3417,12 @@ L_08A710F8: goto L_08A71100; } L_08A71100: -// TIER2_SUPERBLOCK_V1_HOOK_BEGIN - if (vcs::tier2_superblocks_enabled()) { - vcs::tier2_superblock_154_155(rt, ctx, aot_mem, 0x08A71100u); +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Entity)) { + vcs::tier2_superblock_entity(rt, ctx, aot_mem, 0x08A71100u); return; } -// TIER2_SUPERBLOCK_V1_HOOK_END +// TIER2_SUPERBLOCK_V2_HOOK_END { const bool branch_taken = ctx.gpr[4] != 0u; // nop if (branch_taken) { @@ -3596,12 +3596,12 @@ L_08A711D4: if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 104u, 0x08A68CDCu>(ctx, &aot_mem) && ctx.pc == 0x08A711E0u) goto L_08A711E0; return; L_08A711E0: -// TIER2_SUPERBLOCK_V1_HOOK_BEGIN - if (vcs::tier2_superblocks_enabled()) { - vcs::tier2_superblock_154_155(rt, ctx, aot_mem, 0x08A711E0u); +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Entity)) { + vcs::tier2_superblock_entity(rt, ctx, aot_mem, 0x08A711E0u); return; } -// TIER2_SUPERBLOCK_V1_HOOK_END +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1576))); { const bool branch_taken = ctx.gpr[4] != 0u; // nop @@ -3611,12 +3611,12 @@ L_08A711E0: goto L_08A711EC; } L_08A711EC: -// TIER2_SUPERBLOCK_V1_HOOK_BEGIN - if (vcs::tier2_superblocks_enabled()) { - vcs::tier2_superblock_154_155(rt, ctx, aot_mem, 0x08A711ECu); +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::Entity)) { + vcs::tier2_superblock_entity(rt, ctx, aot_mem, 0x08A711ECu); return; } -// TIER2_SUPERBLOCK_V1_HOOK_END +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1600))); ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1596))); diff --git a/profiles/vcs/generated/generated_unit_0157.cpp b/profiles/vcs/generated/generated_unit_0157.cpp index 4006168..12ac8d6 100644 --- a/profiles/vcs/generated/generated_unit_0157.cpp +++ b/profiles/vcs/generated/generated_unit_0157.cpp @@ -1,5 +1,6 @@ #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_tier2_superblocks.hpp" #include #include #include @@ -4358,6 +4359,12 @@ L_08A79DEC: ctx.pc = jump_target; return; L_08A79DF8: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::World)) { + vcs::tier2_superblock_world(rt, ctx, aot_mem, 0x08A79DF8u); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[29] = (ctx.gpr[29] + static_cast(-32)); aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[17]); ctx.gpr[17] = (2238u << 16u); @@ -5478,6 +5485,12 @@ L_08A7A658: ctx.pc = jump_target; return; L_08A7A664: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::World)) { + vcs::tier2_superblock_world(rt, ctx, aot_mem, 0x08A7A664u); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[29] = (ctx.gpr[29] + static_cast(-32)); ctx.gpr[5] = (ctx.gpr[5] & 255u); aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[16]); @@ -5877,6 +5890,12 @@ L_08A7A928: ctx.pc = jump_target; return; L_08A7A94C: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::World)) { + vcs::tier2_superblock_world(rt, ctx, aot_mem, 0x08A7A94Cu); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[29] = (ctx.gpr[29] + static_cast(-80)); ctx.gpr[4] = (2236u << 16u); aot_mem.aot_store32(ctx.gpr[29] + static_cast(56), ctx.gpr[20]); @@ -7468,6 +7487,12 @@ L_08A7B5A0: ctx.pc = jump_target; return; L_08A7B5A8: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::World)) { + vcs::tier2_superblock_world(rt, ctx, aot_mem, 0x08A7B5A8u); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END jump_target = ctx.gpr[31]; // nop local_pc = jump_target; diff --git a/profiles/vcs/generated/generated_unit_0158.cpp b/profiles/vcs/generated/generated_unit_0158.cpp index 4000ebd..ac85940 100644 --- a/profiles/vcs/generated/generated_unit_0158.cpp +++ b/profiles/vcs/generated/generated_unit_0158.cpp @@ -1,5 +1,6 @@ #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_tier2_superblocks.hpp" #include #include #include @@ -6336,6 +6337,12 @@ L_08A7EC20: ctx.pc = jump_target; return; L_08A7EC68: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::World)) { + vcs::tier2_superblock_world(rt, ctx, aot_mem, 0x08A7EC68u); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[29] = (ctx.gpr[29] + static_cast(-80)); ctx.gpr[5] = (0u | 12u); ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-7080))); @@ -6884,6 +6891,12 @@ L_08A7F048: ctx.pc = jump_target; return; L_08A7F080: +// TIER2_SUPERBLOCK_V2_HOOK_BEGIN + if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::World)) { + vcs::tier2_superblock_world(rt, ctx, aot_mem, 0x08A7F080u); + return; + } +// TIER2_SUPERBLOCK_V2_HOOK_END ctx.gpr[29] = (ctx.gpr[29] + static_cast(-80)); ctx.gpr[5] = (0u | 12u); ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-7080))); diff --git a/profiles/vcs/host/vcs_profile.cpp b/profiles/vcs/host/vcs_profile.cpp index e7c7243..320a3dd 100644 --- a/profiles/vcs/host/vcs_profile.cpp +++ b/profiles/vcs/host/vcs_profile.cpp @@ -14,6 +14,7 @@ #include "savedata_utility_ui.hpp" #include "vcs_texture_replacement.hpp" #include "vcs_runtime_log.hpp" +#include "vcs_tier2_superblocks.hpp" #include "psprecomp/common.hpp" #include "psprecomp/deflate.hpp" @@ -7618,6 +7619,44 @@ void install_profile(psprecomp::Runtime &runtime, std::uint32_t user_arena_start << " fence_us=" << (d(r.perf_wait_for_frame_ns, o.perf_wait_for_frame_ns) / 1000u) << " finish_us=" << (d(r.perf_finish_frame_ns, o.perf_finish_frame_ns) / 1000u); runtime_log_line(t.str()); + + // Tier-2 V2 coverage is reported at the same 60-vblank cadence as + // PERF. Counters are thread-local to the Allegrex execution thread, + // so there are no atomics on the hot superblock edges. + if (tier2_superblocks_enabled()) { + const Tier2CountersSnapshot tier2 = consume_tier2_counters(); + std::uint64_t total_entries = 0u; + std::uint64_t total_tail = 0u; + std::uint64_t total_calls = 0u; + std::uint64_t total_cold = 0u; + std::uint64_t total_fallback = 0u; + std::uint64_t total_sample_ns = 0u; + std::uint64_t total_sample_entries = 0u; + std::ostringstream tier2_line; + tier2_line << "TIER2 window=" << n << " vblank=" << display_vblank_index; + for (std::size_t i = 0; i < kTier2ClusterCount; ++i) { + const auto id = static_cast(i); + const Tier2ClusterCounters &c = tier2.cluster[i]; + total_entries += c.entries; + total_tail += c.fused_tail_edges; + total_calls += c.fused_calls; + total_cold += c.cold_exits; + total_fallback += c.fallbacks; + total_sample_ns += c.sampled_ns; + total_sample_entries += c.sampled_entries; + tier2_line << ' ' << tier2_cluster_name(id) << "_e=" << c.entries + << ' ' << tier2_cluster_name(id) << "_x=" + << (c.fused_tail_edges + c.fused_calls); + } + tier2_line << " total_entries=" << total_entries + << " fused_tail=" << total_tail + << " fused_calls=" << total_calls + << " cold=" << total_cold + << " fallback=" << total_fallback + << " sampled=" << total_sample_entries + << " sampled_us=" << (total_sample_ns / 1000u); + runtime_log_line(tier2_line.str()); + } if (vcs_configuration().diagnostics.guest_hotspot_profile && ++guest_hotspot_perf_windows >= 5u) { report_guest_hotspot_window(display_vblank_index); diff --git a/profiles/vcs/host/vcs_runtime_log.cpp b/profiles/vcs/host/vcs_runtime_log.cpp index 6aa97e1..add5f3e 100644 --- a/profiles/vcs/host/vcs_runtime_log.cpp +++ b/profiles/vcs/host/vcs_runtime_log.cpp @@ -1,5 +1,6 @@ #include "vcs_runtime_log.hpp" #include "vcs_config.hpp" +#include "vcs_tier2_superblocks.hpp" #include #include @@ -62,7 +63,7 @@ void runtime_log_initialize(const VcsConfiguration &configuration) { return; } s.file << "VCSNative runtime log\n"; - s.file << "stage=tier2-superblock-v1-2026-08-16\n"; + s.file << "stage=tier2-superblock-v2-unwind-hotfix-2026-08-16\n"; s.file << "config=" << configuration.source_path.string() << '\n'; s.file << "started=" << timestamp_now() << '\n'; s.file << "perf_telemetry=" << (configuration.diagnostics.perf_telemetry ? 1 : 0) @@ -70,7 +71,9 @@ void runtime_log_initialize(const VcsConfiguration &configuration) { << "\n"; s.file << "guest_hotspot=" << (configuration.diagnostics.guest_hotspot_profile ? 1 : 0) << " sample_stride=256 interval_vblanks=300\n"; - s.file << "tier2_superblocks=1 cluster=0154+0155 hot_region_edges=8 cold_exits=3\n\n"; + s.file << "tier2_superblocks=" << (tier2_superblocks_enabled() ? 1 : 0) + << " version=2 clusters=7 mask=0x" << std::hex << tier2_cluster_mask() << std::dec + << " hot_blocks=1060 static_fused_calls=49 static_fused_tail=13 hooks=25 unwind_fix=1 reentry_guard=1\n\n"; if (s.flush_every_line) s.file.flush(); } diff --git a/profiles/vcs/host/vcs_tier2_cluster_boundary.cpp b/profiles/vcs/host/vcs_tier2_cluster_boundary.cpp new file mode 100644 index 0000000..3047bf4 --- /dev/null +++ b/profiles/vcs/host/vcs_tier2_cluster_boundary.cpp @@ -0,0 +1,1250 @@ +// AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. +// Tier-2 SUPERBLOCK V2 cluster: boundary +#include "vcs_tier2_superblocks.hpp" +#include "psprecomp/runtime.hpp" +#include "generated_units.hpp" + +#include + +namespace vcs { +using namespace psprecomp; + +void tier2_superblock_boundary(psprecomp::Runtime &rt, + psprecomp::AllegrexContext &ctx, + psprecomp::GuestMemory::AotFastView &aot_mem, + std::uint32_t entry_pc) { + tier2_detail::SampleScope tier2_scope(Tier2ClusterId::Boundary); + auto &tier2_stats = tier2_scope.stats(); + 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; + +#define TIER2_SB_RETURN() do { 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)rt.tier2_complete_fused_transfers(ctx, tier2_tail_count_); --tier2_return_depth; (void)rt.tier2_complete_fused_transfers(ctx, 1u); } if (tier2_pending_transfers != 0u) { (void)rt.tier2_complete_fused_transfers(ctx, tier2_pending_transfers); tier2_pending_transfers = 0u; } return; } while (false) + + goto TIER2_ENTRY_DISPATCH; + +TIER2_FUSED_RETURN_DISPATCH: + switch (tier2_resume_pc) { + case 0x0895BF3Cu: goto SB_L_0895BF3C; + case 0x0895BF5Cu: goto SB_L_0895BF5C; + case 0x0895BF7Cu: goto SB_L_0895BF7C; + case 0x0895BF88u: goto SB_L_0895BF88; + case 0x0895BFBCu: goto SB_L_0895BFBC; + case 0x0895C000u: goto SB_L_0895C000; + case 0x0895C01Cu: goto SB_L_0895C01C; + case 0x0895C044u: goto SB_L_0895C044; + case 0x0895C04Cu: goto SB_L_0895C04C; + case 0x0895C058u: goto SB_L_0895C058; + case 0x0895C064u: goto SB_L_0895C064; + case 0x0895C074u: goto SB_L_0895C074; + case 0x0895C080u: goto SB_L_0895C080; + case 0x0895C08Cu: goto SB_L_0895C08C; + case 0x0895C098u: goto SB_L_0895C098; + case 0x0895C0A4u: goto SB_L_0895C0A4; + case 0x0895C0A8u: goto SB_L_0895C0A8; + case 0x0895C118u: goto SB_L_0895C118; + case 0x0895C1B4u: goto SB_L_0895C1B4; + case 0x0895C1D4u: goto SB_L_0895C1D4; + case 0x0895C1E0u: goto SB_L_0895C1E0; + case 0x0895C1FCu: goto SB_L_0895C1FC; + case 0x0895C208u: goto SB_L_0895C208; + case 0x0895C214u: goto SB_L_0895C214; + case 0x0895C220u: goto SB_L_0895C220; + case 0x0895C244u: goto SB_L_0895C244; + case 0x0895C28Cu: goto SB_L_0895C28C; + case 0x0895C2A8u: goto SB_L_0895C2A8; + case 0x0895C2C0u: goto SB_L_0895C2C0; + case 0x0895C2C8u: goto SB_L_0895C2C8; + case 0x0895C318u: goto SB_L_0895C318; + case 0x0895C324u: goto SB_L_0895C324; + case 0x0895C34Cu: goto SB_L_0895C34C; + case 0x0895C54Cu: goto SB_L_0895C54C; + case 0x0895C564u: goto SB_L_0895C564; + case 0x0895C570u: goto SB_L_0895C570; + case 0x0895C640u: goto SB_L_0895C640; + case 0x0895C658u: goto SB_L_0895C658; + case 0x0895C694u: goto SB_L_0895C694; + case 0x0895C6B8u: goto SB_L_0895C6B8; + case 0x0895C6C4u: goto SB_L_0895C6C4; + case 0x0895C6D0u: goto SB_L_0895C6D0; + case 0x0895C6DCu: goto SB_L_0895C6DC; + case 0x0895C6E4u: goto SB_L_0895C6E4; + case 0x0895C6F0u: goto SB_L_0895C6F0; + case 0x0895C6FCu: goto SB_L_0895C6FC; + case 0x0895C708u: goto SB_L_0895C708; + case 0x0895C710u: goto SB_L_0895C710; + case 0x0895C734u: goto SB_L_0895C734; + case 0x0895C748u: goto SB_L_0895C748; + case 0x0895C760u: goto SB_L_0895C760; + case 0x0895C764u: goto SB_L_0895C764; + case 0x0895C800u: goto SB_L_0895C800; + case 0x0895C848u: goto SB_L_0895C848; + case 0x0895C864u: goto SB_L_0895C864; + case 0x0895C868u: goto SB_L_0895C868; + case 0x0895C878u: goto SB_L_0895C878; + case 0x0895C884u: goto SB_L_0895C884; + case 0x0895C88Cu: goto SB_L_0895C88C; + case 0x0895C8C4u: goto SB_L_0895C8C4; + case 0x0895C918u: goto SB_L_0895C918; + case 0x0895C934u: goto SB_L_0895C934; + default: break; + } + switch (tier2_resume_unit) { + + default: break; + } + ctx.pc = tier2_resume_pc; + TIER2_SB_RETURN(); + +TIER2_LOCAL_DISPATCH_U0085: + 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 (!rt.tier2_complete_fused_transfers(ctx, tier2_nested_tail)) + tier2_same_context = false; + } + --tier2_return_depth; + if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + tier2_same_context = false; + if (!tier2_same_context) TIER2_SB_RETURN(); + goto TIER2_FUSED_RETURN_DISPATCH; + } + switch (local_pc) { + case 0x0895BF3Cu: goto SB_L_0895BF3C; + case 0x0895BF5Cu: goto SB_L_0895BF5C; + case 0x0895BF7Cu: goto SB_L_0895BF7C; + case 0x0895BF88u: goto SB_L_0895BF88; + case 0x0895BFBCu: goto SB_L_0895BFBC; + default: + ctx.pc = local_pc; + TIER2_SB_RETURN(); + } + +TIER2_LOCAL_DISPATCH_U0086: + 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 (!rt.tier2_complete_fused_transfers(ctx, tier2_nested_tail)) + tier2_same_context = false; + } + --tier2_return_depth; + if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + tier2_same_context = false; + if (!tier2_same_context) TIER2_SB_RETURN(); + goto TIER2_FUSED_RETURN_DISPATCH; + } + switch (local_pc) { + case 0x0895C000u: goto SB_L_0895C000; + case 0x0895C01Cu: goto SB_L_0895C01C; + case 0x0895C044u: goto SB_L_0895C044; + case 0x0895C04Cu: goto SB_L_0895C04C; + case 0x0895C058u: goto SB_L_0895C058; + case 0x0895C064u: goto SB_L_0895C064; + case 0x0895C074u: goto SB_L_0895C074; + case 0x0895C080u: goto SB_L_0895C080; + case 0x0895C08Cu: goto SB_L_0895C08C; + case 0x0895C098u: goto SB_L_0895C098; + case 0x0895C0A4u: goto SB_L_0895C0A4; + case 0x0895C0A8u: goto SB_L_0895C0A8; + case 0x0895C118u: goto SB_L_0895C118; + case 0x0895C1B4u: goto SB_L_0895C1B4; + case 0x0895C1D4u: goto SB_L_0895C1D4; + case 0x0895C1E0u: goto SB_L_0895C1E0; + case 0x0895C1FCu: goto SB_L_0895C1FC; + case 0x0895C208u: goto SB_L_0895C208; + case 0x0895C214u: goto SB_L_0895C214; + case 0x0895C220u: goto SB_L_0895C220; + case 0x0895C244u: goto SB_L_0895C244; + case 0x0895C28Cu: goto SB_L_0895C28C; + case 0x0895C2A8u: goto SB_L_0895C2A8; + case 0x0895C2C0u: goto SB_L_0895C2C0; + case 0x0895C2C8u: goto SB_L_0895C2C8; + case 0x0895C318u: goto SB_L_0895C318; + case 0x0895C324u: goto SB_L_0895C324; + case 0x0895C34Cu: goto SB_L_0895C34C; + case 0x0895C54Cu: goto SB_L_0895C54C; + case 0x0895C564u: goto SB_L_0895C564; + case 0x0895C570u: goto SB_L_0895C570; + case 0x0895C640u: goto SB_L_0895C640; + case 0x0895C658u: goto SB_L_0895C658; + case 0x0895C694u: goto SB_L_0895C694; + case 0x0895C6B8u: goto SB_L_0895C6B8; + case 0x0895C6C4u: goto SB_L_0895C6C4; + case 0x0895C6D0u: goto SB_L_0895C6D0; + case 0x0895C6DCu: goto SB_L_0895C6DC; + case 0x0895C6E4u: goto SB_L_0895C6E4; + case 0x0895C6F0u: goto SB_L_0895C6F0; + case 0x0895C6FCu: goto SB_L_0895C6FC; + case 0x0895C708u: goto SB_L_0895C708; + case 0x0895C710u: goto SB_L_0895C710; + case 0x0895C734u: goto SB_L_0895C734; + case 0x0895C748u: goto SB_L_0895C748; + case 0x0895C760u: goto SB_L_0895C760; + case 0x0895C764u: goto SB_L_0895C764; + case 0x0895C800u: goto SB_L_0895C800; + case 0x0895C848u: goto SB_L_0895C848; + case 0x0895C864u: goto SB_L_0895C864; + case 0x0895C868u: goto SB_L_0895C868; + case 0x0895C878u: goto SB_L_0895C878; + case 0x0895C884u: goto SB_L_0895C884; + case 0x0895C88Cu: goto SB_L_0895C88C; + case 0x0895C8C4u: goto SB_L_0895C8C4; + case 0x0895C918u: goto SB_L_0895C918; + case 0x0895C934u: goto SB_L_0895C934; + default: + ctx.pc = local_pc; + TIER2_SB_RETURN(); + } + + +TIER2_ENTRY_DISPATCH: + switch (entry_pc) { + case 0x0895BF3Cu: goto SB_L_0895BF3C; + case 0x0895BF7Cu: goto SB_L_0895BF7C; + case 0x0895C000u: goto SB_L_0895C000; + case 0x0895C01Cu: goto SB_L_0895C01C; + case 0x0895C2A8u: goto SB_L_0895C2A8; + default: + ctx.pc = entry_pc; + ++tier2_stats.fallbacks; + TIER2_SB_RETURN(); + } + +SB_L_0895BF3C: + ctx.gpr[4] = (0u | 0u); + aot_mem.aot_store8(ctx.gpr[29] + static_cast(120), static_cast(ctx.gpr[4])); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + ctx.gpr[5] = (0u | 0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + ctx.gpr[4] = (ctx.gpr[5] < ctx.gpr[4] ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(104), ctx.gpr[5]); + if (branch_taken) { + if (!rt.tier2_enter_fused_transfer<86u, 0x0895C2C0u>(ctx)) { + ctx.pc = 0x0895C2C0u; + TIER2_SB_RETURN(); + } + ++tier2_pending_transfers; + ++tier2_stats.fused_tail_edges; + goto SB_L_0895C2C0; + } + goto SB_L_0895BF5C; + } + +SB_L_0895BF5C: + ctx.gpr[23] = (10752u << 16u); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + ctx.gpr[21] = (256u << 16u); + ctx.gpr[21] = (ctx.gpr[21] + static_cast(-1)); + ctx.gpr[22] = (2560u << 16u); + ctx.gpr[20] = (ctx.gpr[20] + static_cast(72)); + ctx.gpr[4] = (ctx.gpr[17] + static_cast(29552)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(108), ctx.gpr[4]); + goto SB_L_0895BF7C; + +SB_L_0895BF7C: + ctx.gpr[18] = (ctx.gpr[20] | 0u); + { const bool branch_taken = ctx.gpr[30] == 0u; + ctx.gpr[4] = (15u << 16u); + if (branch_taken) { + if (!rt.tier2_enter_fused_transfer<86u, 0x0895C01Cu>(ctx)) { + ctx.pc = 0x0895C01Cu; + TIER2_SB_RETURN(); + } + ++tier2_pending_transfers; + ++tier2_stats.fused_tail_edges; + goto SB_L_0895C01C; + } + goto SB_L_0895BF88; + } + +SB_L_0895BF88: + ctx.gpr[5] = (ctx.gpr[30] >> 8u); + ctx.gpr[4] = (ctx.gpr[5] & ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(108))); + ctx.gpr[6] = (4096u << 16u); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(20), ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = (0u | 0u); + ctx.gpr[2] = (0u | 0u); + goto SB_L_0895BFBC; + +SB_L_0895BFBC: + ctx.gpr[5] = (ctx.gpr[20] + ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[5] + static_cast(40))); + ctx.gpr[6] = (ctx.gpr[2] | ctx.gpr[23]); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + aot_mem.aot_store32(ctx.gpr[7] + static_cast(0), ctx.gpr[6]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[6]); + ctx.gpr[7] = (ctx.gpr[5] << 4u); + ctx.gpr[7] = (ctx.gpr[7] - ctx.gpr[5]); + ctx.gpr[7] = (ctx.gpr[7] - ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[7] - ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[5] << 2u); + ctx.gpr[5] = (ctx.gpr[30] + ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[5] & ctx.gpr[21]); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[22]); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.pc = 0x0895C000u; TIER2_SB_RETURN(); +SB_L_0895C000: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + ctx.gpr[5] = (ctx.gpr[4] < static_cast(8) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[5] != 0u; + ctx.gpr[2] = (ctx.gpr[2] + static_cast(12)); + if (branch_taken) { + if (!rt.tier2_enter_fused_transfer<85u, 0x0895BFBCu>(ctx)) { + ctx.pc = 0x0895BFBCu; + TIER2_SB_RETURN(); + } + ++tier2_pending_transfers; + ++tier2_stats.fused_tail_edges; + goto SB_L_0895BFBC; + } + goto SB_L_0895C01C; + } + +SB_L_0895C01C: + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[18] + static_cast(6))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(92))); + ctx.gpr[19] = (0u | 0u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(12))); + ctx.gpr[4] = (ctx.gpr[4] << 2u); + ctx.gpr[4] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + if (ctx.gpr[4] == 0u) { + aot_mem.aot_store32(ctx.gpr[29] + static_cast(132), ctx.gpr[21]); + goto SB_L_0895C04C; + } + goto SB_L_0895C044; + +SB_L_0895C044: + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(132), ctx.gpr[21]); + goto SB_L_0895C04C; + +SB_L_0895C04C: + ctx.gpr[21] = (ctx.gpr[16] | 0u); + ctx.gpr[31] = (0x0895C058u); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0206_entry, 206u, 498u, 0x08B3E084u>(ctx, &aot_mem) && ctx.pc == 0x0895C058u) goto SB_L_0895C058; + TIER2_SB_RETURN(); + +SB_L_0895C058: + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[2] + static_cast(0))); + ctx.gpr[31] = (0x0895C064u); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0206_entry, 206u, 499u, 0x08B3E08Cu>(ctx, &aot_mem) && ctx.pc == 0x0895C064u) goto SB_L_0895C064; + TIER2_SB_RETURN(); + +SB_L_0895C064: + ctx.gpr[5] = (ctx.gpr[2] & 2u); + ctx.gpr[4] = (0u | 1u); + { const bool branch_taken = ctx.gpr[5] == 0u; + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(132))); + if (branch_taken) { + goto SB_L_0895C0A4; + } + goto SB_L_0895C074; + } + +SB_L_0895C074: + ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-17675))); + { const bool branch_taken = ctx.gpr[5] != 0u; + ctx.gpr[5] = (21760u << 16u); + if (branch_taken) { + goto SB_L_0895C0A8; + } + goto SB_L_0895C080; + } + +SB_L_0895C080: + ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-19663))); + { const bool branch_taken = ctx.gpr[5] != 0u; + ctx.gpr[5] = (21760u << 16u); + if (branch_taken) { + goto SB_L_0895C0A8; + } + goto SB_L_0895C08C; + } + +SB_L_0895C08C: + ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-17674))); + { const bool branch_taken = ctx.gpr[5] == 0u; + aot_mem.aot_store8(ctx.gpr[29] + static_cast(120), static_cast(ctx.gpr[4])); + if (branch_taken) { + goto SB_L_0895C0A4; + } + goto SB_L_0895C098; + } + +SB_L_0895C098: + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + { const bool branch_taken = 0u == 0u; + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast(8))); + if (branch_taken) { + goto SB_L_0895C2A8; + } + goto SB_L_0895C0A4; + } + +SB_L_0895C0A4: + ctx.gpr[5] = (21760u << 16u); + goto SB_L_0895C0A8; + +SB_L_0895C0A8: + ctx.gpr[6] = (ctx.gpr[16] & ctx.gpr[21]); + ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + aot_mem.aot_store32(ctx.gpr[7] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + ctx.gpr[7] = (22528u << 16u); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[5]); + ctx.gpr[8] = (ctx.gpr[16] >> 24u); + ctx.gpr[7] = (ctx.gpr[8] | ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[7]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[7] = (22016u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[5]); + ctx.gpr[7] = (ctx.gpr[6] | ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[7]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[7] = (22272u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[5]); + ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[5]); + { const bool branch_taken = ctx.gpr[19] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895C1D4; + } + goto SB_L_0895C118; + } + +SB_L_0895C118: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[18] + static_cast(8))); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[19] + static_cast(10)))))); + ctx.gpr[5] = (ctx.gpr[5] & 63u); + ctx.gpr[4] = (ctx.gpr[4] << (ctx.gpr[5] & 31u)); + ctx.fpr[13] = std::bit_cast(ctx.gpr[4]); + ctx.fpr[13] = static_cast(static_cast(std::bit_cast(ctx.fpr[13]))); + { const float fs = ctx.fpr[12]; const float ft = ctx.fpr[13]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[12] = std::bit_cast(0x7FC00000u); else ctx.fpr[12] = fs * ft; } + ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(8412))); + { const float fs = ctx.fpr[12]; const float ft = ctx.fpr[14]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[12] = std::bit_cast(0x7FC00000u); else ctx.fpr[12] = fs * ft; } + ctx.gpr[4] = (53248u << 16u); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[18] + static_cast(12))); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[18] + static_cast(16))); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[6] = (18432u << 16u); + ctx.gpr[7] = (std::bit_cast(ctx.fpr[13])); + ctx.gpr[7] = (ctx.gpr[7] >> 8u); + ctx.gpr[6] = (ctx.gpr[7] | ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[6]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[6] = (18688u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[19] | 0u); + ctx.gpr[31] = (0x0895C1B4u); + ctx.fpr[12] = std::bit_cast(std::bit_cast(ctx.fpr[20])); + if (rt.invoke_chained_direct<&recomp_unit_0199_entry, 199u, 283u, 0x08B217D4u>(ctx, &aot_mem) && ctx.pc == 0x0895C1B4u) goto SB_L_0895C1B4; + TIER2_SB_RETURN(); + +SB_L_0895C1B4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + ctx.gpr[19] = (aot_mem.aot_load16(ctx.gpr[18] + static_cast(4))); + ctx.gpr[19] = (ctx.gpr[19] + static_cast(2)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(64))); + ctx.gpr[7] = (ctx.gpr[4] + ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + { const bool branch_taken = 0u == 0u; + ctx.gpr[7] = (ctx.gpr[7] + ctx.gpr[4]); + if (branch_taken) { + goto SB_L_0895C1FC; + } + goto SB_L_0895C1D4; + } + +SB_L_0895C1D4: + ctx.gpr[4] = (ctx.gpr[19] | 0u); + ctx.gpr[31] = (0x0895C1E0u); + ctx.fpr[12] = std::bit_cast(std::bit_cast(ctx.fpr[20])); + if (rt.invoke_chained_direct<&recomp_unit_0199_entry, 199u, 283u, 0x08B217D4u>(ctx, &aot_mem) && ctx.pc == 0x0895C1E0u) goto SB_L_0895C1E0; + TIER2_SB_RETURN(); + +SB_L_0895C1E0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + ctx.gpr[19] = (aot_mem.aot_load16(ctx.gpr[18] + static_cast(4))); + ctx.gpr[19] = (ctx.gpr[19] + static_cast(2)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(64))); + ctx.gpr[7] = (ctx.gpr[4] + ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + ctx.gpr[7] = (ctx.gpr[7] + ctx.gpr[4]); + goto SB_L_0895C1FC; + +SB_L_0895C1FC: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[29] + static_cast(128))); + if (ctx.gpr[4] == 0u) { + ctx.gpr[8] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + goto SB_L_0895C220; + } + goto SB_L_0895C208; + +SB_L_0895C208: + ctx.gpr[4] = (ctx.gpr[7] | 0u); + ctx.gpr[31] = (0x0895C214u); + ctx.gpr[5] = (ctx.gpr[19] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0129_entry, 129u, 246u, 0x08A09B2Cu>(ctx, &aot_mem) && ctx.pc == 0x0895C214u) goto SB_L_0895C214; + TIER2_SB_RETURN(); + +SB_L_0895C214: + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + { const bool branch_taken = 0u == 0u; + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast(8))); + if (branch_taken) { + goto SB_L_0895C2A8; + } + goto SB_L_0895C220; + } + +SB_L_0895C220: + ctx.gpr[4] = (4608u << 16u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[8] + static_cast(4))); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + { const bool branch_taken = ctx.gpr[7] == 0u; + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_0895C28C; + } + goto SB_L_0895C244; + } + +SB_L_0895C244: + ctx.gpr[5] = (15u << 16u); + ctx.gpr[6] = (ctx.gpr[7] >> 8u); + ctx.gpr[5] = (ctx.gpr[6] & ctx.gpr[5]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(108))); + ctx.gpr[9] = (4096u << 16u); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(20), ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[9]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + ctx.gpr[5] = (256u << 16u); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[6] = (ctx.gpr[7] & ctx.gpr[21]); + ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + goto SB_L_0895C28C; + +SB_L_0895C28C: + ctx.gpr[5] = (1028u << 16u); + ctx.gpr[5] = (ctx.gpr[19] | ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[8] + static_cast(8))); + goto SB_L_0895C2A8; + +SB_L_0895C2A8: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(104))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + ctx.gpr[20] = (ctx.gpr[20] + static_cast(48)); + ctx.gpr[5] = (ctx.gpr[4] < ctx.gpr[7] ? 1u : 0u); + { const bool branch_taken = ctx.gpr[5] != 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(104), ctx.gpr[4]); + if (branch_taken) { + if (!rt.tier2_enter_fused_transfer<85u, 0x0895BF7Cu>(ctx)) { + ctx.pc = 0x0895BF7Cu; + TIER2_SB_RETURN(); + } + ++tier2_pending_transfers; + ++tier2_stats.fused_tail_edges; + goto SB_L_0895BF7C; + } + goto SB_L_0895C2C0; + } + +SB_L_0895C2C0: + ctx.gpr[31] = (0x0895C2C8u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0044_entry, 44u, 671u, 0x088B7BC0u>(ctx, &aot_mem) && ctx.pc == 0x0895C2C8u) goto SB_L_0895C2C8; + TIER2_SB_RETURN(); + +SB_L_0895C2C8: + ctx.gpr[4] = (18432u << 16u); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[20])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (18688u << 16u); + ctx.gpr[6] = (std::bit_cast(ctx.fpr[20])); + ctx.gpr[6] = (ctx.gpr[6] >> 8u); + ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[29] + static_cast(120))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895C934; + } + goto SB_L_0895C318; + } + +SB_L_0895C318: + ctx.gpr[4] = (0u | 11u); + ctx.gpr[31] = (0x0895C324u); + ctx.gpr[5] = (0u | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 179u, 0x088614B4u>(ctx, &aot_mem) && ctx.pc == 0x0895C324u) goto SB_L_0895C324; + TIER2_SB_RETURN(); + +SB_L_0895C324: + ctx.gpr[16] = (0u < ctx.gpr[2] ? 1u : 0u); + ctx.gpr[4] = (8704u << 16u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = (0u | 11u); + ctx.gpr[31] = (0x0895C34Cu); + ctx.gpr[5] = (0u | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 203u, 0x08861668u>(ctx, &aot_mem) && ctx.pc == 0x0895C34Cu) goto SB_L_0895C34C; + TIER2_SB_RETURN(); + +SB_L_0895C34C: + ctx.gpr[4] = (22016u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(-1)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (22528u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(255)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (22272u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(-1)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (22528u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(-1)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (24320u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(-17664))); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[6] = (25344u << 16u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(-17660))); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[13])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[6] = (25600u << 16u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(-17656))); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[6] = (25856u << 16u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (37120u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(-1)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (6144u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(1)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (24576u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(-17648))); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[6] = (26112u << 16u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(-17644))); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[13])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[6] = (26368u << 16u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(-17640))); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[6] = (26624u << 16u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (37888u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(-1)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (6400u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(1)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (49152u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(2)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (49408u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(256)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-17676))); + { const bool branch_taken = ctx.gpr[4] == 0u; + aot_mem.aot_store8(ctx.gpr[29] + static_cast(129), static_cast(ctx.gpr[16])); + if (branch_taken) { + goto SB_L_0895C564; + } + goto SB_L_0895C54C; + } + +SB_L_0895C54C: + ctx.gpr[4] = (8960u << 16u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + goto SB_L_0895C564; + +SB_L_0895C564: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-17680))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895C640; + } + goto SB_L_0895C570; + } + +SB_L_0895C570: + ctx.gpr[4] = (7680u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (49664u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (49920u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (51968u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-17680))); + ctx.gpr[7] = (ctx.gpr[6] >> 8u); + ctx.gpr[8] = (256u << 16u); + ctx.gpr[8] = (ctx.gpr[8] + static_cast(-1)); + ctx.gpr[6] = (ctx.gpr[6] & ctx.gpr[8]); + ctx.gpr[8] = (40960u << 16u); + ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[8]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[6]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[6] = (255u << 16u); + ctx.gpr[6] = (ctx.gpr[7] & ctx.gpr[6]); + ctx.gpr[7] = (43008u << 16u); + ctx.gpr[7] = (ctx.gpr[7] + static_cast(64)); + ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[6]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[6] = (47104u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(1542)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[6]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + goto SB_L_0895C640; + +SB_L_0895C640: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + ctx.gpr[21] = (0u | 0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + ctx.gpr[4] = (ctx.gpr[21] < ctx.gpr[4] ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895C878; + } + goto SB_L_0895C658; + } + +SB_L_0895C658: + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + ctx.gpr[19] = (ctx.gpr[19] + static_cast(72)); + ctx.gpr[4] = (16128u << 16u); + ctx.fpr[22] = std::bit_cast(ctx.gpr[4]); + ctx.fpr[24] = std::bit_cast(0u); + ctx.gpr[4] = (17279u << 16u); + ctx.fpr[26] = std::bit_cast(ctx.gpr[4]); + ctx.gpr[22] = (1u << 16u); + ctx.gpr[22] = (ctx.gpr[22] + static_cast(257)); + ctx.gpr[20] = (256u << 16u); + ctx.gpr[20] = (ctx.gpr[20] + static_cast(-1)); + ctx.gpr[30] = (57344u << 16u); + ctx.gpr[23] = (57600u << 16u); + ctx.gpr[4] = (ctx.gpr[17] + static_cast(29552)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(108), ctx.gpr[4]); + goto SB_L_0895C694; + +SB_L_0895C694: + ctx.gpr[18] = (ctx.gpr[19] | 0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(92))); + ctx.gpr[5] = (aot_mem.aot_load16(ctx.gpr[18] + static_cast(6))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(12))); + ctx.gpr[5] = (ctx.gpr[5] << 2u); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[5]); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[31] = (0x0895C6B8u); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0206_entry, 206u, 499u, 0x08B3E08Cu>(ctx, &aot_mem) && ctx.pc == 0x0895C6B8u) goto SB_L_0895C6B8; + TIER2_SB_RETURN(); + +SB_L_0895C6B8: + ctx.gpr[4] = (ctx.gpr[2] & 2u); + if (ctx.gpr[4] == 0u) { + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + goto SB_L_0895C864; + } + goto SB_L_0895C6C4; + +SB_L_0895C6C4: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-19663))); + if (ctx.gpr[4] != 0u) { + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + goto SB_L_0895C864; + } + goto SB_L_0895C6D0; + +SB_L_0895C6D0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-17680))); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_0895C708; + } + goto SB_L_0895C6DC; + } + +SB_L_0895C6DC: + ctx.gpr[31] = (0x0895C6E4u); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0206_entry, 206u, 524u, 0x08B3E260u>(ctx, &aot_mem) && ctx.pc == 0x0895C6E4u) goto SB_L_0895C6E4; + TIER2_SB_RETURN(); + +SB_L_0895C6E4: + ctx.gpr[4] = (ctx.gpr[2] | 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_0895C6FC; + } + goto SB_L_0895C6F0; + } + +SB_L_0895C6F0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + { const bool branch_taken = 0u == 0u; + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + if (branch_taken) { + goto SB_L_0895C868; + } + goto SB_L_0895C6FC; + } + +SB_L_0895C6FC: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[31] = (0x0895C708u); + ctx.fpr[12] = std::bit_cast(std::bit_cast(ctx.fpr[20])); + if (rt.invoke_chained_direct<&recomp_unit_0199_entry, 199u, 283u, 0x08B217D4u>(ctx, &aot_mem) && ctx.pc == 0x0895C708u) goto SB_L_0895C708; + TIER2_SB_RETURN(); + +SB_L_0895C708: + ctx.gpr[31] = (0x0895C710u); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0206_entry, 206u, 523u, 0x08B3E254u>(ctx, &aot_mem) && ctx.pc == 0x0895C710u) goto SB_L_0895C710; + TIER2_SB_RETURN(); + +SB_L_0895C710: + { const float fs = ctx.fpr[0]; const float ft = ctx.fpr[22]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[12] = std::bit_cast(0x7FC00000u); else ctx.fpr[12] = fs * ft; } + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(7632))); + { const float fs = ctx.fpr[12]; const float ft = ctx.fpr[13]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[12] = std::bit_cast(0x7FC00000u); else ctx.fpr[12] = fs * ft; } + ctx.fpr[13] = std::bit_cast(std::bit_cast(ctx.fpr[24])); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[13])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = ((ctx.fcr31 & 0x00800000u) != 0u); + ctx.gpr[8] = (0u | 255u); + if (branch_taken) { + goto SB_L_0895C748; + } + goto SB_L_0895C734; + } + +SB_L_0895C734: + ctx.fpr[13] = std::bit_cast(std::bit_cast(ctx.fpr[12])); + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[13] <= ctx.fpr[20])) ? 0x00800000u : 0u); + // nop + if (!((ctx.fcr31 & 0x00800000u) != 0u)) { + ctx.fpr[13] = std::bit_cast(std::bit_cast(ctx.fpr[20])); + goto SB_L_0895C748; + } + goto SB_L_0895C748; + +SB_L_0895C748: + { const float fs = ctx.fpr[13]; const float ft = ctx.fpr[26]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[12] = std::bit_cast(0x7FC00000u); else ctx.fpr[12] = fs * ft; } + ctx.fpr[12] = std::bit_cast(ctx.fpu_float_to_word_ct<1u>(ctx.fpr[12])); + ctx.gpr[4] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-17674))); + { const bool branch_taken = ctx.gpr[5] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895C764; + } + goto SB_L_0895C760; + } + +SB_L_0895C760: + ctx.gpr[4] = (ctx.gpr[8] | 0u); + goto SB_L_0895C764; + +SB_L_0895C764: + { const std::int64_t product = static_cast(static_cast(ctx.gpr[4])) * static_cast(static_cast(ctx.gpr[22])); ctx.lo = static_cast(product); ctx.hi = static_cast(static_cast(product) >> 32u); } + ctx.gpr[5] = (ctx.lo); + ctx.gpr[4] = (ctx.gpr[8] - ctx.gpr[4]); + // nop + { const std::int64_t product = static_cast(static_cast(ctx.gpr[4])) * static_cast(static_cast(ctx.gpr[22])); ctx.lo = static_cast(product); ctx.hi = static_cast(static_cast(product) >> 32u); } + ctx.gpr[4] = (ctx.lo); + ctx.gpr[6] = (57088u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(170)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[6]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[6]); + ctx.gpr[5] = (ctx.gpr[5] & ctx.gpr[20]); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[30]); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[20]); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[23]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[5] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[18] + static_cast(4))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(2)); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(64))); + ctx.gpr[7] = (ctx.gpr[6] + ctx.gpr[7]); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + ctx.gpr[18] = (ctx.gpr[7] + ctx.gpr[18]); + ctx.gpr[7] = (4608u << 16u); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(4))); + ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[16] = (ctx.gpr[16] + static_cast(4)); + { const bool branch_taken = ctx.gpr[18] == 0u; + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[16]); + if (branch_taken) { + goto SB_L_0895C848; + } + goto SB_L_0895C800; + } + +SB_L_0895C800: + ctx.gpr[5] = (15u << 16u); + ctx.gpr[6] = (ctx.gpr[18] >> 8u); + ctx.gpr[5] = (ctx.gpr[6] & ctx.gpr[5]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(108))); + ctx.gpr[7] = (4096u << 16u); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(20), ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + ctx.gpr[6] = (256u << 16u); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[5]); + ctx.gpr[7] = (ctx.gpr[18] & ctx.gpr[20]); + ctx.gpr[6] = (ctx.gpr[7] | ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[16] = (ctx.gpr[16] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[16]); + goto SB_L_0895C848; + +SB_L_0895C848: + ctx.gpr[5] = (1028u << 16u); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + goto SB_L_0895C864; + +SB_L_0895C864: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + goto SB_L_0895C868; + +SB_L_0895C868: + ctx.gpr[21] = (ctx.gpr[21] + static_cast(1)); + ctx.gpr[4] = (ctx.gpr[21] < ctx.gpr[4] ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[19] = (ctx.gpr[19] + static_cast(48)); + if (branch_taken) { + goto SB_L_0895C694; + } + goto SB_L_0895C878; + } + +SB_L_0895C878: + ctx.gpr[4] = (0u | 0u); + ctx.gpr[31] = (0x0895C884u); + ctx.fpr[12] = std::bit_cast(std::bit_cast(ctx.fpr[20])); + if (rt.invoke_chained_direct<&recomp_unit_0199_entry, 199u, 283u, 0x08B217D4u>(ctx, &aot_mem) && ctx.pc == 0x0895C884u) goto SB_L_0895C884; + TIER2_SB_RETURN(); + +SB_L_0895C884: + ctx.gpr[31] = (0x0895C88Cu); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 200u, 0x088615BCu>(ctx, &aot_mem) && ctx.pc == 0x0895C88Cu) goto SB_L_0895C88C; + TIER2_SB_RETURN(); + +SB_L_0895C88C: + ctx.gpr[4] = (6144u << 16u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (6400u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[29] + static_cast(129))); + ctx.gpr[31] = (0x0895C8C4u); + ctx.gpr[4] = (0u | 11u); + if (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 203u, 0x08861668u>(ctx, &aot_mem) && ctx.pc == 0x0895C8C4u) goto SB_L_0895C8C4; + TIER2_SB_RETURN(); + +SB_L_0895C8C4: + ctx.gpr[4] = (8704u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (49152u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[5] = (49408u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(256)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-17676))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895C934; + } + goto SB_L_0895C918; + } + +SB_L_0895C918: + ctx.gpr[4] = (8960u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + goto SB_L_0895C934; + +SB_L_0895C934: + ctx.gpr[2] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(96))); + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(136))); + ctx.fpr[22] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(140))); + ctx.fpr[24] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(144))); + ctx.fpr[26] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(148))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(152))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(156))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(160))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(164))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(168))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(172))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(176))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(180))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(184))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(188))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(192)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0086; + + +#undef TIER2_SB_RETURN +} + +} // namespace vcs diff --git a/profiles/vcs/host/vcs_tier2_cluster_edge43.cpp b/profiles/vcs/host/vcs_tier2_cluster_edge43.cpp new file mode 100644 index 0000000..2dbffd7 --- /dev/null +++ b/profiles/vcs/host/vcs_tier2_cluster_edge43.cpp @@ -0,0 +1,894 @@ +// AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. +// Tier-2 SUPERBLOCK V2 cluster: edge43 +#include "vcs_tier2_superblocks.hpp" +#include "psprecomp/runtime.hpp" +#include "generated_units.hpp" + +#include + +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(); + 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; + +#define TIER2_SB_RETURN() do { 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)rt.tier2_complete_fused_transfers(ctx, tier2_tail_count_); --tier2_return_depth; (void)rt.tier2_complete_fused_transfers(ctx, 1u); } if (tier2_pending_transfers != 0u) { (void)rt.tier2_complete_fused_transfers(ctx, 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 (!rt.tier2_complete_fused_transfers(ctx, tier2_nested_tail)) + tier2_same_context = false; + } + --tier2_return_depth; + if (!rt.tier2_complete_fused_transfers(ctx, 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 (!rt.tier2_complete_fused_transfers(ctx, tier2_nested_tail)) + tier2_same_context = false; + } + --tier2_return_depth; + if (!rt.tier2_complete_fused_transfers(ctx, 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(); + } + +SB_L_088B1780: + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(16); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[5] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[5] + static_cast(16); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + 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); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<12u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<13u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] + vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<12u, 3u>(vfpu_d); } + ctx.execute_vfpu_vcmp_ct<12u, 28u, 3u, 7u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 4u) & 1u) != 0u; + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<5u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<4u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] + vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<15u, 3u>(vfpu_d); } + if (branch_taken) { + goto SB_L_088B180C; + } + goto SB_L_088B17B4; + } + +SB_L_088B17B4: + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<1u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] + vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<14u, 3u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<5u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<4u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<8u, 3u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<1u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<12u, 3u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<15u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<14u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<9u, 3u>(vfpu_d); } + 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 + ctx.gpr[4] = (ctx.vfpu_scalar_bits_ct<131u>()); + ctx.gpr[2] = (ctx.gpr[4] & 16u); + jump_target = ctx.gpr[31]; + ctx.gpr[2] = (ctx.gpr[2] < static_cast(1) ? 1u : 0u); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0043; + +SB_L_088B18EC: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-128)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(84), ctx.gpr[16]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(88), ctx.gpr[17]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(92), ctx.gpr[18]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(96), ctx.gpr[19]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(100), ctx.gpr[20]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(104), ctx.gpr[21]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(108), ctx.gpr[22]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(112), ctx.gpr[23]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(116), ctx.gpr[31]); + ctx.gpr[16] = (ctx.gpr[8] | 0u); + ctx.gpr[17] = (ctx.gpr[7] | 0u); + ctx.gpr[18] = (ctx.gpr[6] | 0u); + ctx.gpr[21] = (ctx.gpr[4] | 0u); + ctx.gpr[22] = (ctx.gpr[29] + static_cast(16)); + ctx.gpr[23] = (ctx.gpr[29] + static_cast(32)); + ctx.gpr[4] = (ctx.gpr[18] | 0u); + ctx.gpr[6] = (ctx.gpr[29] | 0u); + ctx.gpr[7] = (ctx.gpr[22] | 0u); + ctx.gpr[31] = (0x088B1940u); + ctx.gpr[8] = (ctx.gpr[23] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0163_entry, 163u, 44u, 0x08A9061Cu>(ctx, &aot_mem) && ctx.pc == 0x088B1940u) goto SB_L_088B1940; + TIER2_SB_RETURN(); + +SB_L_088B1940: + ctx.gpr[20] = (ctx.gpr[29] + static_cast(48)); + ctx.gpr[19] = (ctx.gpr[29] + static_cast(64)); + ctx.gpr[10] = (ctx.gpr[29] + static_cast(80)); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[5] = (ctx.gpr[29] | 0u); + ctx.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] = (ctx.gpr[19] | 0u); + goto SB_L_088B1B74; + +SB_L_088B1B74: + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(16); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[5] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[6] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[7] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<5u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<4u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<9u, 3u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<6u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<4u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<10u, 3u>(vfpu_d); } + ctx.execute_vfpu_cross_quat_ct<17u, 10u, 9u, 3u>(); + ctx.execute_vfpu_vdot_ct<110u, 17u, 17u, 3u>(); + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<110u, 1u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = 1.0f / std::sqrt(vfpu_s[i]); + ctx.write_vfpu_vector_with_destination_prefix_ct<110u, 1u>(vfpu_d); } + 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: + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<2u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<1u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<3u, 3u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<103u, 1u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<24u, 1u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<24u, 1u>(vfpu_d); } + ctx.execute_vfpu_vdot_ct<56u, 3u, 7u, 3u>(); + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<56u, 1u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = 1.0f / vfpu_s[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<56u, 1u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<24u, 1u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<56u, 1u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = vfpu_s[i] * vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<24u, 1u>(vfpu_d); } + ctx.execute_vfpu_vscl_ct<8u, 3u, 24u, 3u>(); + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<8u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<1u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] + vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<1u, 3u>(vfpu_d); } + { float vfpu_value[4]{}; + ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_value); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<4u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<5u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<8u, 3u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<6u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<5u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<11u, 3u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<1u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<4u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<12u, 3u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<1u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<5u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<13u, 3u>(vfpu_d); } + 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(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<7u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[9] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + aot_mem.aot_store32(ctx.gpr[10] + static_cast(0), ctx.vfpu_scalar_bits_ct<24u>()); + jump_target = ctx.gpr[31]; + ctx.gpr[2] = (0u + static_cast(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] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(68))); + ctx.gpr[18] = (ctx.gpr[18] + ctx.gpr[30]); + ctx.gpr[5] = (ctx.gpr[29] + static_cast(16)); + { const std::uint32_t vfpu_address = ctx.gpr[18] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + 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>(); + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_ct<0u, 3u>(vfpu_s); + ctx.apply_vfpu_source_prefix_ct<3u, 0u>(vfpu_s); + const float vfpu_scale = std::ldexp(1.0f, -static_cast(23u)); + for (std::uint32_t vfpu_i = 0; vfpu_i < 3u; ++vfpu_i) { + const auto vfpu_integer = static_cast(std::bit_cast(vfpu_s[vfpu_i])); + vfpu_d[vfpu_i] = static_cast(vfpu_integer) * vfpu_scale; + } + ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_ct<1u, 3u>(vfpu_s); + ctx.apply_vfpu_source_prefix_ct<3u, 0u>(vfpu_s); + const float vfpu_scale = std::ldexp(1.0f, -static_cast(23u)); + for (std::uint32_t vfpu_i = 0; vfpu_i < 3u; ++vfpu_i) { + const auto vfpu_integer = static_cast(std::bit_cast(vfpu_s[vfpu_i])); + vfpu_d[vfpu_i] = static_cast(vfpu_integer) * vfpu_scale; + } + ctx.write_vfpu_vector_with_destination_prefix_ct<1u, 3u>(vfpu_d); } + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[5] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<1u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[5] + static_cast(16); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.gpr[31] = (0x088B3FFCu); + ctx.gpr[4] = (ctx.gpr[20] | 0u); + goto SB_L_088B1780; + +SB_L_088B4004: + ctx.gpr[17] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[18] + static_cast(6)))))); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[18] + static_cast(14)))))); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[17]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[16] = (ctx.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: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(76))); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[16]); + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(6))); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + ctx.gpr[5] = (ctx.gpr[4] ^ 7u); + ctx.gpr[5] = (ctx.gpr[5] < static_cast(1) ? 1u : 0u); + ctx.gpr[6] = (ctx.gpr[4] ^ 8u); + ctx.gpr[6] = (ctx.gpr[6] < static_cast(1) ? 1u : 0u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + ctx.gpr[6] = (ctx.gpr[4] ^ 16u); + ctx.gpr[6] = (ctx.gpr[6] < static_cast(1) ? 1u : 0u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + ctx.gpr[6] = (ctx.gpr[4] ^ 31u); + ctx.gpr[6] = (ctx.gpr[6] < static_cast(1) ? 1u : 0u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + ctx.gpr[4] = (ctx.gpr[4] ^ 12u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.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: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(76))); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[16]); + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(6))); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + ctx.gpr[5] = (ctx.gpr[4] ^ 8u); + ctx.gpr[5] = (ctx.gpr[5] < static_cast(1) ? 1u : 0u); + ctx.gpr[6] = (ctx.gpr[4] ^ 16u); + ctx.gpr[6] = (ctx.gpr[6] < static_cast(1) ? 1u : 0u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + ctx.gpr[6] = (ctx.gpr[4] ^ 31u); + ctx.gpr[6] = (ctx.gpr[6] < static_cast(1) ? 1u : 0u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + ctx.gpr[4] = (ctx.gpr[4] ^ 12u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_088B40E0; + } + goto SB_L_088B40C4; + } + +SB_L_088B40C4: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(72))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(76))); + ctx.gpr[6] = (ctx.gpr[6] + ctx.gpr[16]); + ctx.gpr[4] = (ctx.gpr[20] | 0u); + ctx.gpr[7] = (ctx.gpr[23] | 0u); + ctx.gpr[31] = (0x088B40E0u); + ctx.gpr[8] = (ctx.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 (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 210u, 0x088B18ECu>(ctx, &aot_mem) && ctx.pc == 0x088B40E0u) goto SB_L_088B40E0; + TIER2_SB_RETURN(); + +SB_L_088B40E0: + ctx.gpr[17] = (ctx.gpr[17] + static_cast(1)); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[18] + static_cast(14)))))); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[17]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[16] = (ctx.gpr[16] + static_cast(8)); + if (branch_taken) { + goto SB_L_088B4018; + } + goto SB_L_088B40F4; + } + +SB_L_088B40F4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(48))); + goto SB_L_088B40F8; + +SB_L_088B40F8: + ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(52))); + ctx.gpr[30] = (ctx.gpr[30] + static_cast(16)); + ctx.gpr[5] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[5] != 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(48), ctx.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); + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[19] + static_cast(50))); + ctx.gpr[4] = (static_cast(ctx.gpr[16]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.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: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(76))); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[17]); + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(6))); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + ctx.gpr[5] = (ctx.gpr[4] ^ 7u); + ctx.gpr[5] = (ctx.gpr[5] < static_cast(1) ? 1u : 0u); + ctx.gpr[6] = (ctx.gpr[4] ^ 8u); + ctx.gpr[6] = (ctx.gpr[6] < static_cast(1) ? 1u : 0u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + ctx.gpr[6] = (ctx.gpr[4] ^ 16u); + ctx.gpr[6] = (ctx.gpr[6] < static_cast(1) ? 1u : 0u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + ctx.gpr[6] = (ctx.gpr[4] ^ 31u); + ctx.gpr[6] = (ctx.gpr[6] < static_cast(1) ? 1u : 0u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + ctx.gpr[4] = (ctx.gpr[4] ^ 12u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.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: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(76))); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[17]); + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(6))); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + ctx.gpr[5] = (ctx.gpr[4] ^ 8u); + ctx.gpr[5] = (ctx.gpr[5] < static_cast(1) ? 1u : 0u); + ctx.gpr[6] = (ctx.gpr[4] ^ 16u); + ctx.gpr[6] = (ctx.gpr[6] < static_cast(1) ? 1u : 0u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + ctx.gpr[6] = (ctx.gpr[4] ^ 31u); + ctx.gpr[6] = (ctx.gpr[6] < static_cast(1) ? 1u : 0u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + ctx.gpr[4] = (ctx.gpr[4] ^ 12u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_088B41F4; + } + goto SB_L_088B41D8; + } + +SB_L_088B41D8: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(72))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(76))); + ctx.gpr[6] = (ctx.gpr[6] + ctx.gpr[17]); + ctx.gpr[4] = (ctx.gpr[20] | 0u); + ctx.gpr[7] = (ctx.gpr[23] | 0u); + ctx.gpr[31] = (0x088B41F4u); + ctx.gpr[8] = (ctx.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 (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 210u, 0x088B18ECu>(ctx, &aot_mem) && ctx.pc == 0x088B41F4u) goto SB_L_088B41F4; + TIER2_SB_RETURN(); + +SB_L_088B41F4: + ctx.gpr[16] = (ctx.gpr[16] + static_cast(1)); + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[19] + static_cast(50))); + ctx.gpr[4] = (static_cast(ctx.gpr[16]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[17] = (ctx.gpr[17] + static_cast(8)); + if (branch_taken) { + goto SB_L_088B412C; + } + goto SB_L_088B4208; + } + +SB_L_088B4208: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(56))); + goto SB_L_088B420C; + +SB_L_088B420C: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(0))); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(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(aot_mem.aot_load32(ctx.gpr[29] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), std::bit_cast(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: + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(60))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(64))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(68))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(72))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(76))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(80))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(84))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(88))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(92))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(96))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(112)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0044; + + +#undef TIER2_SB_RETURN +} + +} // namespace vcs diff --git a/profiles/vcs/host/vcs_tier2_cluster_entity.cpp b/profiles/vcs/host/vcs_tier2_cluster_entity.cpp new file mode 100644 index 0000000..5b8b88d --- /dev/null +++ b/profiles/vcs/host/vcs_tier2_cluster_entity.cpp @@ -0,0 +1,1799 @@ +// AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. +// Tier-2 SUPERBLOCK V2 cluster: entity +#include "vcs_tier2_superblocks.hpp" +#include "psprecomp/runtime.hpp" +#include "generated_units.hpp" + +#include + +namespace vcs { +using namespace psprecomp; + +void tier2_superblock_entity(psprecomp::Runtime &rt, + psprecomp::AllegrexContext &ctx, + psprecomp::GuestMemory::AotFastView &aot_mem, + std::uint32_t entry_pc) { + tier2_detail::SampleScope tier2_scope(Tier2ClusterId::Entity); + auto &tier2_stats = tier2_scope.stats(); + 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; + +#define TIER2_SB_RETURN() do { 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)rt.tier2_complete_fused_transfers(ctx, tier2_tail_count_); --tier2_return_depth; (void)rt.tier2_complete_fused_transfers(ctx, 1u); } if (tier2_pending_transfers != 0u) { (void)rt.tier2_complete_fused_transfers(ctx, 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 (!rt.tier2_complete_fused_transfers(ctx, tier2_nested_tail)) + tier2_same_context = false; + } + --tier2_return_depth; + if (!rt.tier2_complete_fused_transfers(ctx, 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 (!rt.tier2_complete_fused_transfers(ctx, tier2_nested_tail)) + tier2_same_context = false; + } + --tier2_return_depth; + if (!rt.tier2_complete_fused_transfers(ctx, 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 (!rt.tier2_complete_fused_transfers(ctx, tier2_nested_tail)) + tier2_same_context = false; + } + --tier2_return_depth; + if (!rt.tier2_complete_fused_transfers(ctx, 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 (!rt.tier2_complete_fused_transfers(ctx, tier2_nested_tail)) + tier2_same_context = false; + } + --tier2_return_depth; + if (!rt.tier2_complete_fused_transfers(ctx, 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(); + } + +SB_L_08A65EA0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[2] = (ctx.gpr[4] ^ 6u); + jump_target = ctx.gpr[31]; + ctx.gpr[2] = (ctx.gpr[2] < static_cast(1) ? 1u : 0u); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0152; + +SB_L_08A65EB4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[2] = (ctx.gpr[4] ^ 8u); + jump_target = ctx.gpr[31]; + ctx.gpr[2] = (ctx.gpr[2] < static_cast(1) ? 1u : 0u); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0152; + +SB_L_08A68CBC: + jump_target = ctx.gpr[31]; + ctx.gpr[2] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(444))); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0153; + +SB_L_08A68CC4: + jump_target = ctx.gpr[31]; + aot_mem.aot_store32(ctx.gpr[4] + static_cast(444), ctx.gpr[5]); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0153; + +SB_L_08A68CCC: + jump_target = ctx.gpr[31]; + ctx.gpr[2] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(448))); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0153; + +SB_L_08A68CD4: + jump_target = ctx.gpr[31]; + ctx.gpr[2] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(2116))); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0153; + +SB_L_08A68CDC: + jump_target = ctx.gpr[31]; + aot_mem.aot_store32(ctx.gpr[4] + static_cast(2116), ctx.gpr[5]); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0153; + +SB_L_08A6E894: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1600))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + { const bool branch_taken = ctx.gpr[4] == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(1576), ctx.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: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1576))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(8428))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(1576), ctx.gpr[4]); + ctx.gpr[5] = (0u | 3u); + ctx.gpr[4] = (48972u << 16u); + ctx.gpr[4] = (ctx.gpr[4] | 52429u); + ctx.fpr[20] = std::bit_cast(ctx.gpr[4]); + ctx.gpr[8] = (0u | 58u); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1588))); + ctx.gpr[9] = (0u + static_cast(-2)); + ctx.gpr[10] = (0u | 311u); + ctx.gpr[4] = (16168u << 16u); + ctx.gpr[4] = (ctx.gpr[4] | 62915u); + { const bool branch_taken = ctx.gpr[19] == ctx.gpr[6]; + ctx.fpr[12] = std::bit_cast(ctx.gpr[4]); + if (branch_taken) { + goto SB_L_08A6E8F4; + } + goto SB_L_08A6E8E8; + } + +SB_L_08A6E8E8: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(8428))); + { const bool branch_taken = ctx.gpr[17] != ctx.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: + ctx.gpr[4] = (ctx.gpr[23] | 0u); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(72))); + ctx.gpr[6] = (ctx.gpr[6] & 512u); + ctx.gpr[6] = (0u < ctx.gpr[6] ? 1u : 0u); + ctx.gpr[6] = (ctx.gpr[6] & 255u); + { const bool branch_taken = ctx.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: + ctx.gpr[6] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(84))); + ctx.gpr[7] = (aot_mem.aot_load16(ctx.gpr[28] + static_cast(-25492))); + { const bool branch_taken = ctx.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 = ctx.gpr[17] == ctx.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: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(86)))))); + ctx.gpr[4] = (ctx.gpr[4] << 2u); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); + ctx.gpr[4] = (ctx.gpr[6] + ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(20))); + { const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast(16); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast(32); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast(48); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<3u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + 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); } + ctx.gpr[4] = (ctx.gpr[29] + static_cast(32)); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<8u, 4u>(vfpu_value); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix_ct<32u, 4u>(vfpu_matrix); + ctx.read_vfpu_vector_ct<4u, 4u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 4u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix_ct<5u, 4u>(vfpu_result); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<100u, 1u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<104u, 1u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = vfpu_s[i] + vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<100u, 1u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<100u, 1u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<100u, 1u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = vfpu_s[i] * vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<100u, 1u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<8u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<5u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<5u, 3u>(vfpu_d); } + ctx.execute_vfpu_vdot_ct<4u, 5u, 5u, 3u>(); + ctx.execute_vfpu_vcmp_ct<4u, 100u, 1u, 7u>(); + ctx.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: + ctx.gpr[4] = (0u + static_cast(1)); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + goto SB_L_08A6E998; + +SB_L_08A6E998: + ctx.gpr[6] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.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: + ctx.gpr[4] = (0u + static_cast(-4097)); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(236))); + ctx.gpr[4] = (ctx.gpr[6] & ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[19] + static_cast(236), ctx.gpr[4]); + ctx.gpr[18] = (0u | 0u); + ctx.gpr[20] = (0u | 0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 2u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.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(); psprecomp::recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); + } + goto SB_L_08A6E9E0; + } + +SB_L_08A6E9E0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 8u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A6EA78; + } + goto SB_L_08A6E9FC; + } + +SB_L_08A6E9FC: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[19] + static_cast(483)))))); + ctx.gpr[4] = (ctx.gpr[4] & 2u); + ctx.gpr[4] = (0u < ctx.gpr[4] ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A6EA78; + } + goto SB_L_08A6EA14; + } + +SB_L_08A6EA14: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 4u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + if (ctx.gpr[4] != 0u) { + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[19] + static_cast(40))); + goto SB_L_08A6EA50; + } + goto SB_L_08A6EA30; + +SB_L_08A6EA30: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 6u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A6EA78; + } + goto SB_L_08A6EA4C; + } + +SB_L_08A6EA4C: + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[19] + static_cast(40))); + goto SB_L_08A6EA50; + +SB_L_08A6EA50: + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[13] < ctx.fpr[12])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); + // nop + if (branch_taken) { + goto SB_L_08A6EA78; + } + goto SB_L_08A6EA60; + } + +SB_L_08A6EA60: + ctx.gpr[18] = (ctx.gpr[23] | 0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(236))); + ctx.gpr[4] = (ctx.gpr[4] | 4096u); + aot_mem.aot_store32(ctx.gpr[19] + static_cast(236), ctx.gpr[4]); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store32(ctx.gpr[19] + static_cast(444), ctx.gpr[17]); + if (branch_taken) { + ++tier2_stats.cold_exits; tier2_scope.finish(); psprecomp::recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); + } + goto SB_L_08A6EA78; + } + +SB_L_08A6EA78: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 8u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A6EB10; + } + goto SB_L_08A6EA94; + } + +SB_L_08A6EA94: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[17] + static_cast(483)))))); + ctx.gpr[4] = (ctx.gpr[4] & 2u); + ctx.gpr[4] = (0u < ctx.gpr[4] ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A6EB10; + } + goto SB_L_08A6EAAC; + } + +SB_L_08A6EAAC: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 4u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + if (ctx.gpr[4] != 0u) { + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(40))); + goto SB_L_08A6EAE8; + } + goto SB_L_08A6EAC8; + +SB_L_08A6EAC8: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 6u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A6EB10; + } + goto SB_L_08A6EAE4; + } + +SB_L_08A6EAE4: + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(40))); + goto SB_L_08A6EAE8; + +SB_L_08A6EAE8: + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[13] < ctx.fpr[12])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); + // nop + if (branch_taken) { + goto SB_L_08A6EB10; + } + goto SB_L_08A6EAF8; + } + +SB_L_08A6EAF8: + ctx.gpr[18] = (ctx.gpr[23] | 0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(236))); + ctx.gpr[4] = (ctx.gpr[4] | 4096u); + aot_mem.aot_store32(ctx.gpr[19] + static_cast(236), ctx.gpr[4]); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store32(ctx.gpr[17] + static_cast(444), ctx.gpr[19]); + if (branch_taken) { + ++tier2_stats.cold_exits; tier2_scope.finish(); psprecomp::recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); + } + goto SB_L_08A6EB10; + } + +SB_L_08A6EB10: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 8u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A6EB78; + } + goto SB_L_08A6EB2C; + } + +SB_L_08A6EB2C: + ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[19] + static_cast(474))); + ctx.gpr[4] = (0u | 4u); + { const bool branch_taken = ctx.gpr[6] != ctx.gpr[4]; + // nop + if (branch_taken) { + goto SB_L_08A6EB78; + } + goto SB_L_08A6EB3C; + } + +SB_L_08A6EB3C: + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(72))); + ctx.gpr[6] = (ctx.gpr[6] & 14u); + ctx.gpr[6] = (ctx.gpr[6] ^ 8u); + ctx.gpr[6] = (ctx.gpr[6] < static_cast(1) ? 1u : 0u); + ctx.gpr[6] = (ctx.gpr[6] & 255u); + { const bool branch_taken = ctx.gpr[6] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A6EB78; + } + goto SB_L_08A6EB58; + } + +SB_L_08A6EB58: + ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(474))); + { const bool branch_taken = ctx.gpr[6] != ctx.gpr[4]; + // nop + if (branch_taken) { + goto SB_L_08A6EB78; + } + goto SB_L_08A6EB64; + } + +SB_L_08A6EB64: + ctx.gpr[18] = (ctx.gpr[23] | 0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(236))); + ctx.gpr[4] = (ctx.gpr[4] | 4096u); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store32(ctx.gpr[19] + static_cast(236), ctx.gpr[4]); + if (branch_taken) { + ++tier2_stats.cold_exits; tier2_scope.finish(); psprecomp::recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); + } + goto SB_L_08A6EB78; + } + +SB_L_08A6EB78: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 8u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + ++tier2_stats.cold_exits; tier2_scope.finish(); psprecomp::recomp_unit_0154_entry(rt, ctx, 301u, aot_mem); TIER2_SB_RETURN(); + } + goto SB_L_08A6EB94; + } + +SB_L_08A6EB94: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 4u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + ++tier2_stats.cold_exits; tier2_scope.finish(); psprecomp::recomp_unit_0154_entry(rt, ctx, 301u, aot_mem); TIER2_SB_RETURN(); + } + goto SB_L_08A6EBB0; + } + +SB_L_08A6EBB0: + ctx.gpr[16] = (ctx.gpr[19] | 0u); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + { const bool branch_taken = ctx.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: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(476))); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A6EC1C; + } + goto SB_L_08A6EBD4; + } + +SB_L_08A6EBD4: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[16] + static_cast(482)))))); + ctx.gpr[4] = (ctx.gpr[4] & 64u); + ctx.gpr[4] = (0u < ctx.gpr[4] ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[23]; + // nop + if (branch_taken) { + goto SB_L_08A6EC1C; + } + goto SB_L_08A6EBEC; + } + +SB_L_08A6EBEC: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[5] = (ctx.gpr[5] & 2048u); + { const bool branch_taken = ctx.gpr[5] != 0u; + ctx.gpr[4] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A6EC0C; + } + goto SB_L_08A6EBFC; + } + +SB_L_08A6EBFC: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[5] = (ctx.gpr[5] & 2048u); + { const bool branch_taken = ctx.gpr[5] == 0u; + ctx.gpr[4] = (ctx.gpr[4] & 255u); + if (branch_taken) { + goto SB_L_08A6EC14; + } + goto SB_L_08A6EC0C; + } + +SB_L_08A6EC0C: + ctx.gpr[4] = (ctx.gpr[23] | 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + goto SB_L_08A6EC14; + +SB_L_08A6EC14: + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A6ED90; + } + goto SB_L_08A6EC1C; + } + +SB_L_08A6EC1C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(444))); + { const bool branch_taken = ctx.gpr[4] != ctx.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: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(473))); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < 3 ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A6ED90; + } + goto SB_L_08A6EC40; + } + +SB_L_08A6EC40: + aot_mem.aot_store32(ctx.gpr[29] + static_cast(128), 0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(136))); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[9]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(136), ctx.gpr[4]); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[19] + static_cast(86)))))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); + ctx.gpr[6] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[6]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[6] == 0u; + ctx.gpr[5] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A6EC74; + } + goto SB_L_08A6EC64; + } + +SB_L_08A6EC64: + ctx.gpr[4] = (ctx.gpr[4] << 2u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); + ctx.gpr[4] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + goto SB_L_08A6EC74; + +SB_L_08A6EC74: + ctx.gpr[8] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(20))); + ctx.gpr[8] = (ctx.gpr[8] + static_cast(32)); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[19] + static_cast(86)))))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); + ctx.gpr[6] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[6]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[6] == 0u; + ctx.gpr[5] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A6ECA0; + } + goto SB_L_08A6EC90; + } + +SB_L_08A6EC90: + ctx.gpr[4] = (ctx.gpr[4] << 2u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); + ctx.gpr[4] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + goto SB_L_08A6ECA0; + +SB_L_08A6ECA0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(20))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(16)); + { const std::uint32_t vfpu_address = ctx.gpr[8] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<1u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } + ctx.gpr[21] = (ctx.gpr[29] + static_cast(144)); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + { const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast(16); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast(32); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast(48); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix_ct<36u, 3u>(vfpu_matrix); + ctx.read_vfpu_vector_ct<1u, 3u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 3u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_result); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<7u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] + vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } + ctx.gpr[4] = (ctx.gpr[29] + static_cast(48)); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(152))); + ctx.gpr[4] = (ctx.gpr[17] + static_cast(48)); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[13])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); + // nop + if (branch_taken) { + goto SB_L_08A6ED10; + } + goto SB_L_08A6ED04; + } + +SB_L_08A6ED04: + ctx.gpr[18] = (ctx.gpr[23] | 0u); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store32(ctx.gpr[16] + static_cast(444), ctx.gpr[17]); + if (branch_taken) { + goto SB_L_08A6ED6C; + } + goto SB_L_08A6ED10; + } + +SB_L_08A6ED10: + ctx.gpr[30] = (ctx.gpr[29] + static_cast(64)); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + ctx.gpr[31] = (0x08A6ED20u); + ctx.gpr[5] = (ctx.gpr[30] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0022_entry, 22u, 934u, 0x0885FE8Cu>(ctx, &aot_mem) && ctx.pc == 0x08A6ED20u) goto SB_L_08A6ED20; + TIER2_SB_RETURN(); + +SB_L_08A6ED20: + ctx.gpr[4] = (ctx.gpr[30] | 0u); + ctx.gpr[31] = (0x08A6ED2Cu); + ctx.gpr[5] = (ctx.gpr[2] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 7u, 0x08860358u>(ctx, &aot_mem) && ctx.pc == 0x08A6ED2Cu) goto SB_L_08A6ED2C; + TIER2_SB_RETURN(); + +SB_L_08A6ED2C: + { const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast(16); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast(32); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast(48); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix_ct<36u, 3u>(vfpu_matrix); + ctx.read_vfpu_vector_ct<1u, 3u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 3u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_result); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<7u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] + vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } + ctx.gpr[4] = (ctx.gpr[29] + static_cast(160)); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(168))); + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[26])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); + // nop + if (branch_taken) { + goto SB_L_08A6ED6C; + } + goto SB_L_08A6ED64; + } + +SB_L_08A6ED64: + ctx.gpr[18] = (ctx.gpr[23] | 0u); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(444), ctx.gpr[17]); + goto SB_L_08A6ED6C; + +SB_L_08A6ED6C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(136))); + ctx.gpr[4] = (ctx.gpr[4] & 1u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A6ED90; + } + goto SB_L_08A6ED7C; + } + +SB_L_08A6ED7C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(128))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A6ED90; + } + goto SB_L_08A6ED88; + } + +SB_L_08A6ED88: + ctx.gpr[31] = (0x08A6ED90u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(128))); + if (rt.invoke_chained_direct<&recomp_unit_0117_entry, 117u, 129u, 0x089D89E0u>(ctx, &aot_mem) && 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(); psprecomp::recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); + } + ++tier2_stats.cold_exits; tier2_scope.finish(); psprecomp::recomp_unit_0154_entry(rt, ctx, 301u, aot_mem); TIER2_SB_RETURN(); + } + +SB_L_08A71100: + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A711E0; + } + goto SB_L_08A71108; + } + +SB_L_08A71108: + ctx.gpr[31] = (0x08A71110u); + ctx.gpr[4] = (ctx.gpr[19] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<152u, 0x08A65EB4u>(ctx)) { + ctx.pc = 0x08A65EB4u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08A71110u; + tier2_return_unit[tier2_return_depth] = 155u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08A65EB4; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0152_entry, 152u, 433u, 0x08A65EB4u>(ctx, &aot_mem) && ctx.pc == 0x08A71110u) goto SB_L_08A71110; + TIER2_SB_RETURN(); + +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); + ctx.gpr[4] = (ctx.gpr[19] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CBCu>(ctx)) { + ctx.pc = 0x08A68CBCu; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08A71120u; + tier2_return_unit[tier2_return_depth] = 155u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08A68CBC; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 100u, 0x08A68CBCu>(ctx, &aot_mem) && ctx.pc == 0x08A71120u) goto SB_L_08A71120; + TIER2_SB_RETURN(); + +SB_L_08A71120: + { const bool branch_taken = ctx.gpr[2] != ctx.gpr[17]; + // nop + if (branch_taken) { + goto SB_L_08A7113C; + } + goto SB_L_08A71128; + } + +SB_L_08A71128: + ctx.gpr[4] = (ctx.gpr[19] | 0u); + ctx.gpr[31] = (0x08A71134u); + ctx.gpr[5] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CC4u>(ctx)) { + ctx.pc = 0x08A68CC4u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08A71134u; + tier2_return_unit[tier2_return_depth] = 155u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08A68CC4; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 101u, 0x08A68CC4u>(ctx, &aot_mem) && ctx.pc == 0x08A71134u) goto SB_L_08A71134; + TIER2_SB_RETURN(); + +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); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<152u, 0x08A65EB4u>(ctx)) { + ctx.pc = 0x08A65EB4u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08A71144u; + tier2_return_unit[tier2_return_depth] = 155u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08A65EB4; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0152_entry, 152u, 433u, 0x08A65EB4u>(ctx, &aot_mem) && ctx.pc == 0x08A71144u) goto SB_L_08A71144; + TIER2_SB_RETURN(); + +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); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CBCu>(ctx)) { + ctx.pc = 0x08A68CBCu; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08A71154u; + tier2_return_unit[tier2_return_depth] = 155u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08A68CBC; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 100u, 0x08A68CBCu>(ctx, &aot_mem) && ctx.pc == 0x08A71154u) goto SB_L_08A71154; + TIER2_SB_RETURN(); + +SB_L_08A71154: + { const bool branch_taken = ctx.gpr[2] != ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_08A71180; + } + goto SB_L_08A7115C; + } + +SB_L_08A7115C: + ctx.gpr[31] = (0x08A71164u); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CCCu>(ctx)) { + ctx.pc = 0x08A68CCCu; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08A71164u; + tier2_return_unit[tier2_return_depth] = 155u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08A68CCC; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 102u, 0x08A68CCCu>(ctx, &aot_mem) && ctx.pc == 0x08A71164u) goto SB_L_08A71164; + TIER2_SB_RETURN(); + +SB_L_08A71164: + { const bool branch_taken = ctx.gpr[2] == ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_08A71180; + } + goto SB_L_08A7116C; + } + +SB_L_08A7116C: + ctx.gpr[4] = (ctx.gpr[17] | 0u); + ctx.gpr[31] = (0x08A71178u); + ctx.gpr[5] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CC4u>(ctx)) { + ctx.pc = 0x08A68CC4u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08A71178u; + tier2_return_unit[tier2_return_depth] = 155u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08A68CC4; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 101u, 0x08A68CC4u>(ctx, &aot_mem) && ctx.pc == 0x08A71178u) goto SB_L_08A71178; + TIER2_SB_RETURN(); + +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); + ctx.gpr[4] = (ctx.gpr[19] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<152u, 0x08A65EA0u>(ctx)) { + ctx.pc = 0x08A65EA0u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08A71188u; + tier2_return_unit[tier2_return_depth] = 155u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08A65EA0; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0152_entry, 152u, 432u, 0x08A65EA0u>(ctx, &aot_mem) && ctx.pc == 0x08A71188u) goto SB_L_08A71188; + TIER2_SB_RETURN(); + +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); + ctx.gpr[4] = (ctx.gpr[19] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CD4u>(ctx)) { + ctx.pc = 0x08A68CD4u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08A71198u; + tier2_return_unit[tier2_return_depth] = 155u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08A68CD4; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 103u, 0x08A68CD4u>(ctx, &aot_mem) && ctx.pc == 0x08A71198u) goto SB_L_08A71198; + TIER2_SB_RETURN(); + +SB_L_08A71198: + { const bool branch_taken = ctx.gpr[2] != ctx.gpr[17]; + // nop + if (branch_taken) { + goto SB_L_08A711B4; + } + goto SB_L_08A711A0; + } + +SB_L_08A711A0: + ctx.gpr[4] = (ctx.gpr[19] | 0u); + ctx.gpr[31] = (0x08A711ACu); + ctx.gpr[5] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CDCu>(ctx)) { + ctx.pc = 0x08A68CDCu; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08A711ACu; + tier2_return_unit[tier2_return_depth] = 155u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08A68CDC; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 104u, 0x08A68CDCu>(ctx, &aot_mem) && ctx.pc == 0x08A711ACu) goto SB_L_08A711AC; + TIER2_SB_RETURN(); + +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); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<152u, 0x08A65EA0u>(ctx)) { + ctx.pc = 0x08A65EA0u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08A711BCu; + tier2_return_unit[tier2_return_depth] = 155u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08A65EA0; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0152_entry, 152u, 432u, 0x08A65EA0u>(ctx, &aot_mem) && ctx.pc == 0x08A711BCu) goto SB_L_08A711BC; + TIER2_SB_RETURN(); + +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); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CD4u>(ctx)) { + ctx.pc = 0x08A68CD4u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08A711CCu; + tier2_return_unit[tier2_return_depth] = 155u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08A68CD4; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 103u, 0x08A68CD4u>(ctx, &aot_mem) && ctx.pc == 0x08A711CCu) goto SB_L_08A711CC; + TIER2_SB_RETURN(); + +SB_L_08A711CC: + { const bool branch_taken = ctx.gpr[2] != ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_08A711E0; + } + goto SB_L_08A711D4; + } + +SB_L_08A711D4: + ctx.gpr[4] = (ctx.gpr[17] | 0u); + ctx.gpr[31] = (0x08A711E0u); + ctx.gpr[5] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CDCu>(ctx)) { + ctx.pc = 0x08A68CDCu; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08A711E0u; + tier2_return_unit[tier2_return_depth] = 155u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08A68CDC; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 104u, 0x08A68CDCu>(ctx, &aot_mem) && ctx.pc == 0x08A711E0u) goto SB_L_08A711E0; + TIER2_SB_RETURN(); + +SB_L_08A711E0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1576))); + { const bool branch_taken = ctx.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: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1600))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1596))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(1600), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1604))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(-1)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(1596), ctx.gpr[4]); + { const bool branch_taken = ctx.gpr[5] != 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(1604), ctx.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(); psprecomp::recomp_unit_0155_entry(rt, ctx, 269u, aot_mem); TIER2_SB_RETURN(); + + +#undef TIER2_SB_RETURN +} + +} // namespace vcs diff --git a/profiles/vcs/host/vcs_tier2_cluster_geometry.cpp b/profiles/vcs/host/vcs_tier2_cluster_geometry.cpp new file mode 100644 index 0000000..3a72b98 --- /dev/null +++ b/profiles/vcs/host/vcs_tier2_cluster_geometry.cpp @@ -0,0 +1,7035 @@ +// AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. +// Tier-2 SUPERBLOCK V2 cluster: geometry +#include "vcs_tier2_superblocks.hpp" +#include "psprecomp/runtime.hpp" +#include "generated_units.hpp" + +#include + +namespace vcs { +using namespace psprecomp; + +void tier2_superblock_geometry(psprecomp::Runtime &rt, + psprecomp::AllegrexContext &ctx, + psprecomp::GuestMemory::AotFastView &aot_mem, + std::uint32_t entry_pc) { + tier2_detail::SampleScope tier2_scope(Tier2ClusterId::Geometry); + auto &tier2_stats = tier2_scope.stats(); + 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; + +#define TIER2_SB_RETURN() do { 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)rt.tier2_complete_fused_transfers(ctx, tier2_tail_count_); --tier2_return_depth; (void)rt.tier2_complete_fused_transfers(ctx, 1u); } if (tier2_pending_transfers != 0u) { (void)rt.tier2_complete_fused_transfers(ctx, tier2_pending_transfers); tier2_pending_transfers = 0u; } return; } while (false) + + goto TIER2_ENTRY_DISPATCH; + +TIER2_FUSED_RETURN_DISPATCH: + switch (tier2_resume_pc) { + case 0x08955444u: goto SB_L_08955444; + case 0x08955474u: goto SB_L_08955474; + case 0x089554A0u: goto SB_L_089554A0; + case 0x089554A8u: goto SB_L_089554A8; + case 0x089554E0u: goto SB_L_089554E0; + case 0x089554ECu: goto SB_L_089554EC; + case 0x08955518u: goto SB_L_08955518; + case 0x08955534u: goto SB_L_08955534; + case 0x0895553Cu: goto SB_L_0895553C; + case 0x08955544u: goto SB_L_08955544; + case 0x0895554Cu: goto SB_L_0895554C; + case 0x08955570u: goto SB_L_08955570; + case 0x08955604u: goto SB_L_08955604; + case 0x08955608u: goto SB_L_08955608; + case 0x08955674u: goto SB_L_08955674; + case 0x08955684u: goto SB_L_08955684; + case 0x0895568Cu: goto SB_L_0895568C; + case 0x0895569Cu: goto SB_L_0895569C; + case 0x089556B4u: goto SB_L_089556B4; + case 0x089556D0u: goto SB_L_089556D0; + case 0x089556D4u: goto SB_L_089556D4; + case 0x08955700u: goto SB_L_08955700; + case 0x0895570Cu: goto SB_L_0895570C; + case 0x08955744u: goto SB_L_08955744; + case 0x08955758u: goto SB_L_08955758; + case 0x08955764u: goto SB_L_08955764; + case 0x0895576Cu: goto SB_L_0895576C; + case 0x089557B4u: goto SB_L_089557B4; + case 0x089557E8u: goto SB_L_089557E8; + case 0x089557F4u: goto SB_L_089557F4; + case 0x08955AC4u: goto SB_L_08955AC4; + case 0x08955ACCu: goto SB_L_08955ACC; + case 0x08955AD8u: goto SB_L_08955AD8; + case 0x08955D48u: goto SB_L_08955D48; + case 0x08956F20u: goto SB_L_08956F20; + case 0x08956F40u: goto SB_L_08956F40; + case 0x08957228u: goto SB_L_08957228; + case 0x089572E8u: goto SB_L_089572E8; + case 0x08957300u: goto SB_L_08957300; + case 0x0895731Cu: goto SB_L_0895731C; + case 0x08957320u: goto SB_L_08957320; + case 0x08957344u: goto SB_L_08957344; + case 0x08957350u: goto SB_L_08957350; + case 0x08957388u: goto SB_L_08957388; + case 0x0895739Cu: goto SB_L_0895739C; + case 0x089573A8u: goto SB_L_089573A8; + case 0x089573B0u: goto SB_L_089573B0; + case 0x089573F8u: goto SB_L_089573F8; + case 0x0895742Cu: goto SB_L_0895742C; + case 0x08957500u: goto SB_L_08957500; + case 0x089575B0u: goto SB_L_089575B0; + case 0x089575DCu: goto SB_L_089575DC; + case 0x08957608u: goto SB_L_08957608; + case 0x08957634u: goto SB_L_08957634; + case 0x08957660u: goto SB_L_08957660; + case 0x0895768Cu: goto SB_L_0895768C; + case 0x089576B8u: goto SB_L_089576B8; + case 0x089576E4u: goto SB_L_089576E4; + case 0x089576F0u: goto SB_L_089576F0; + case 0x089576FCu: goto SB_L_089576FC; + case 0x08958D28u: goto SB_L_08958D28; + case 0x08958D70u: goto SB_L_08958D70; + case 0x08958D74u: goto SB_L_08958D74; + case 0x08958D7Cu: goto SB_L_08958D7C; + case 0x08958D88u: goto SB_L_08958D88; + case 0x08958D94u: goto SB_L_08958D94; + case 0x08958DC4u: goto SB_L_08958DC4; + case 0x08958DD0u: goto SB_L_08958DD0; + case 0x08958DECu: goto SB_L_08958DEC; + case 0x08958DF8u: goto SB_L_08958DF8; + case 0x08958E10u: goto SB_L_08958E10; + case 0x08958E50u: goto SB_L_08958E50; + case 0x08958E58u: goto SB_L_08958E58; + case 0x08958E60u: goto SB_L_08958E60; + case 0x08958E88u: goto SB_L_08958E88; + case 0x08958EB4u: goto SB_L_08958EB4; + case 0x08958EC4u: goto SB_L_08958EC4; + case 0x08958ED8u: goto SB_L_08958ED8; + case 0x08958EE0u: goto SB_L_08958EE0; + case 0x08958EF4u: goto SB_L_08958EF4; + case 0x08958F00u: goto SB_L_08958F00; + case 0x08958F08u: goto SB_L_08958F08; + case 0x08958F1Cu: goto SB_L_08958F1C; + case 0x08958F30u: goto SB_L_08958F30; + case 0x08958F34u: goto SB_L_08958F34; + case 0x08958F60u: goto SB_L_08958F60; + case 0x08958F80u: goto SB_L_08958F80; + case 0x08958FA4u: goto SB_L_08958FA4; + case 0x08958FC4u: goto SB_L_08958FC4; + case 0x08958FCCu: goto SB_L_08958FCC; + case 0x08958FE0u: goto SB_L_08958FE0; + case 0x08959010u: goto SB_L_08959010; + case 0x08959024u: goto SB_L_08959024; + case 0x08959070u: goto SB_L_08959070; + case 0x089590F4u: goto SB_L_089590F4; + case 0x08959108u: goto SB_L_08959108; + case 0x08959118u: goto SB_L_08959118; + case 0x089591BCu: goto SB_L_089591BC; + case 0x089591C8u: goto SB_L_089591C8; + case 0x089591D0u: goto SB_L_089591D0; + case 0x089591DCu: goto SB_L_089591DC; + case 0x08959200u: goto SB_L_08959200; + case 0x0895920Cu: goto SB_L_0895920C; + case 0x08959218u: goto SB_L_08959218; + case 0x08959224u: goto SB_L_08959224; + case 0x0895922Cu: goto SB_L_0895922C; + case 0x08959234u: goto SB_L_08959234; + case 0x08959258u: goto SB_L_08959258; + case 0x08959298u: goto SB_L_08959298; + case 0x089592ACu: goto SB_L_089592AC; + case 0x089592CCu: goto SB_L_089592CC; + case 0x089592E0u: goto SB_L_089592E0; + case 0x08959300u: goto SB_L_08959300; + case 0x08959314u: goto SB_L_08959314; + case 0x089593E8u: goto SB_L_089593E8; + case 0x089593F0u: goto SB_L_089593F0; + case 0x08959414u: goto SB_L_08959414; + case 0x08959438u: goto SB_L_08959438; + case 0x0895944Cu: goto SB_L_0895944C; + case 0x08959458u: goto SB_L_08959458; + case 0x0895946Cu: goto SB_L_0895946C; + case 0x089594A0u: goto SB_L_089594A0; + case 0x0895952Cu: goto SB_L_0895952C; + case 0x08959544u: goto SB_L_08959544; + case 0x0895955Cu: goto SB_L_0895955C; + case 0x08959564u: goto SB_L_08959564; + case 0x08959574u: goto SB_L_08959574; + case 0x0895957Cu: goto SB_L_0895957C; + case 0x08959598u: goto SB_L_08959598; + case 0x089595F4u: goto SB_L_089595F4; + case 0x08959630u: goto SB_L_08959630; + case 0x0895963Cu: goto SB_L_0895963C; + case 0x0895964Cu: goto SB_L_0895964C; + case 0x08959654u: goto SB_L_08959654; + case 0x08959658u: goto SB_L_08959658; + case 0x0895968Cu: goto SB_L_0895968C; + case 0x089596E4u: goto SB_L_089596E4; + case 0x089596ECu: goto SB_L_089596EC; + case 0x089596F4u: goto SB_L_089596F4; + case 0x089596FCu: goto SB_L_089596FC; + case 0x08959704u: goto SB_L_08959704; + case 0x08959720u: goto SB_L_08959720; + case 0x08959738u: goto SB_L_08959738; + case 0x08959750u: goto SB_L_08959750; + case 0x0895975Cu: goto SB_L_0895975C; + case 0x08959764u: goto SB_L_08959764; + case 0x0895976Cu: goto SB_L_0895976C; + case 0x08959774u: goto SB_L_08959774; + case 0x08959790u: goto SB_L_08959790; + case 0x089597A8u: goto SB_L_089597A8; + case 0x089597C0u: goto SB_L_089597C0; + case 0x089597CCu: goto SB_L_089597CC; + case 0x089597D4u: goto SB_L_089597D4; + case 0x089597DCu: goto SB_L_089597DC; + case 0x089597F4u: goto SB_L_089597F4; + case 0x0895980Cu: goto SB_L_0895980C; + case 0x08959824u: goto SB_L_08959824; + case 0x0895982Cu: goto SB_L_0895982C; + case 0x08959844u: goto SB_L_08959844; + case 0x0895985Cu: goto SB_L_0895985C; + case 0x0895986Cu: goto SB_L_0895986C; + case 0x08959874u: goto SB_L_08959874; + case 0x0895987Cu: goto SB_L_0895987C; + case 0x08959898u: goto SB_L_08959898; + case 0x089598B0u: goto SB_L_089598B0; + case 0x089598D8u: goto SB_L_089598D8; + case 0x089598E4u: goto SB_L_089598E4; + case 0x089598F0u: goto SB_L_089598F0; + case 0x089598F8u: goto SB_L_089598F8; + case 0x08959900u: goto SB_L_08959900; + case 0x08959918u: goto SB_L_08959918; + case 0x08959930u: goto SB_L_08959930; + case 0x08959958u: goto SB_L_08959958; + case 0x08959964u: goto SB_L_08959964; + case 0x0895996Cu: goto SB_L_0895996C; + case 0x08959984u: goto SB_L_08959984; + case 0x0895999Cu: goto SB_L_0895999C; + case 0x089599ACu: goto SB_L_089599AC; + case 0x089599B4u: goto SB_L_089599B4; + case 0x08959A24u: goto SB_L_08959A24; + case 0x08959A2Cu: goto SB_L_08959A2C; + case 0x08959A34u: goto SB_L_08959A34; + case 0x08959A3Cu: goto SB_L_08959A3C; + case 0x08959A44u: goto SB_L_08959A44; + case 0x08959A4Cu: goto SB_L_08959A4C; + case 0x08959A68u: goto SB_L_08959A68; + case 0x08959A80u: goto SB_L_08959A80; + case 0x08959A98u: goto SB_L_08959A98; + case 0x08959AA4u: goto SB_L_08959AA4; + case 0x08959AACu: goto SB_L_08959AAC; + case 0x08959AB4u: goto SB_L_08959AB4; + case 0x08959AD0u: goto SB_L_08959AD0; + case 0x08959AE8u: goto SB_L_08959AE8; + case 0x08959B00u: goto SB_L_08959B00; + case 0x08959B0Cu: goto SB_L_08959B0C; + case 0x08959B14u: goto SB_L_08959B14; + case 0x08959B1Cu: goto SB_L_08959B1C; + case 0x08959B34u: goto SB_L_08959B34; + case 0x08959B4Cu: goto SB_L_08959B4C; + case 0x08959B64u: goto SB_L_08959B64; + case 0x08959B6Cu: goto SB_L_08959B6C; + case 0x08959B84u: goto SB_L_08959B84; + case 0x08959B9Cu: goto SB_L_08959B9C; + case 0x08959BACu: goto SB_L_08959BAC; + case 0x08959BB4u: goto SB_L_08959BB4; + case 0x08959BBCu: goto SB_L_08959BBC; + case 0x08959BD8u: goto SB_L_08959BD8; + case 0x08959BF0u: goto SB_L_08959BF0; + case 0x08959C18u: goto SB_L_08959C18; + case 0x08959C24u: goto SB_L_08959C24; + case 0x08959C30u: goto SB_L_08959C30; + case 0x08959C38u: goto SB_L_08959C38; + case 0x08959C40u: goto SB_L_08959C40; + case 0x08959C5Cu: goto SB_L_08959C5C; + case 0x08959C74u: goto SB_L_08959C74; + case 0x08959C8Cu: goto SB_L_08959C8C; + case 0x08959C98u: goto SB_L_08959C98; + case 0x08959CA0u: goto SB_L_08959CA0; + case 0x08959CA8u: goto SB_L_08959CA8; + case 0x08959CC0u: goto SB_L_08959CC0; + case 0x08959CD8u: goto SB_L_08959CD8; + case 0x08959D00u: goto SB_L_08959D00; + case 0x08959D0Cu: goto SB_L_08959D0C; + case 0x08959D14u: goto SB_L_08959D14; + case 0x08959D2Cu: goto SB_L_08959D2C; + case 0x08959D44u: goto SB_L_08959D44; + case 0x08959D54u: goto SB_L_08959D54; + case 0x08959D5Cu: goto SB_L_08959D5C; + case 0x08959D64u: goto SB_L_08959D64; + case 0x08959D7Cu: goto SB_L_08959D7C; + case 0x08959DDCu: goto SB_L_08959DDC; + case 0x08959DE4u: goto SB_L_08959DE4; + case 0x08959DF4u: goto SB_L_08959DF4; + case 0x08959E10u: goto SB_L_08959E10; + case 0x08959E1Cu: goto SB_L_08959E1C; + case 0x08959E2Cu: goto SB_L_08959E2C; + case 0x08959E54u: goto SB_L_08959E54; + case 0x08959F54u: goto SB_L_08959F54; + case 0x08959F5Cu: goto SB_L_08959F5C; + case 0x08959FA8u: goto SB_L_08959FA8; + case 0x08959FD8u: goto SB_L_08959FD8; + case 0x08959FE4u: goto SB_L_08959FE4; + case 0x08959FF4u: goto SB_L_08959FF4; + case 0x08959FFCu: goto SB_L_08959FFC; + case 0x0895A000u: goto SB_L_0895A000; + case 0x0895A01Cu: goto SB_L_0895A01C; + case 0x0895A024u: goto SB_L_0895A024; + case 0x0895A03Cu: goto SB_L_0895A03C; + case 0x0895A064u: goto SB_L_0895A064; + case 0x0895A070u: goto SB_L_0895A070; + case 0x0895A07Cu: goto SB_L_0895A07C; + case 0x0895A084u: goto SB_L_0895A084; + case 0x0895A08Cu: goto SB_L_0895A08C; + case 0x0895A0A4u: goto SB_L_0895A0A4; + case 0x0895A0BCu: goto SB_L_0895A0BC; + case 0x0895A0C8u: goto SB_L_0895A0C8; + case 0x0895A0D0u: goto SB_L_0895A0D0; + case 0x0895A0E0u: goto SB_L_0895A0E0; + case 0x0895A140u: goto SB_L_0895A140; + case 0x0895A148u: goto SB_L_0895A148; + case 0x0895A158u: goto SB_L_0895A158; + case 0x0895A174u: goto SB_L_0895A174; + case 0x0895A180u: goto SB_L_0895A180; + case 0x0895A190u: goto SB_L_0895A190; + case 0x0895A1B8u: goto SB_L_0895A1B8; + case 0x0895A298u: goto SB_L_0895A298; + case 0x0895A2A8u: goto SB_L_0895A2A8; + case 0x0895A2D0u: goto SB_L_0895A2D0; + case 0x0895A2E0u: goto SB_L_0895A2E0; + case 0x0895A324u: goto SB_L_0895A324; + case 0x0895A348u: goto SB_L_0895A348; + case 0x0895A360u: goto SB_L_0895A360; + case 0x0895A36Cu: goto SB_L_0895A36C; + case 0x0895A3BCu: goto SB_L_0895A3BC; + case 0x0895A414u: goto SB_L_0895A414; + case 0x0895A420u: goto SB_L_0895A420; + case 0x0895A450u: goto SB_L_0895A450; + case 0x0895A464u: goto SB_L_0895A464; + case 0x0895A470u: goto SB_L_0895A470; + case 0x0895A47Cu: goto SB_L_0895A47C; + case 0x0895A488u: goto SB_L_0895A488; + case 0x0895A49Cu: goto SB_L_0895A49C; + case 0x0895A4A4u: goto SB_L_0895A4A4; + case 0x0895A4D0u: goto SB_L_0895A4D0; + case 0x0895A4DCu: goto SB_L_0895A4DC; + case 0x0895A4E8u: goto SB_L_0895A4E8; + case 0x0895A4F0u: goto SB_L_0895A4F0; + case 0x0895A508u: goto SB_L_0895A508; + case 0x0895A510u: goto SB_L_0895A510; + case 0x0895A560u: goto SB_L_0895A560; + case 0x0895A588u: goto SB_L_0895A588; + case 0x0895A598u: goto SB_L_0895A598; + case 0x0895A718u: goto SB_L_0895A718; + case 0x0895A724u: goto SB_L_0895A724; + case 0x0895A72Cu: goto SB_L_0895A72C; + case 0x0895A760u: goto SB_L_0895A760; + case 0x0895A7F4u: goto SB_L_0895A7F4; + case 0x0895A86Cu: goto SB_L_0895A86C; + case 0x0895A88Cu: goto SB_L_0895A88C; + case 0x0895A8B4u: goto SB_L_0895A8B4; + case 0x0895A904u: goto SB_L_0895A904; + case 0x0895A92Cu: goto SB_L_0895A92C; + case 0x0895A93Cu: goto SB_L_0895A93C; + case 0x0895A964u: goto SB_L_0895A964; + case 0x0895A970u: goto SB_L_0895A970; + case 0x0895A97Cu: goto SB_L_0895A97C; + case 0x0895A998u: goto SB_L_0895A998; + case 0x0895A9A4u: goto SB_L_0895A9A4; + case 0x0895A9B0u: goto SB_L_0895A9B0; + case 0x0895A9BCu: goto SB_L_0895A9BC; + case 0x0895A9D8u: goto SB_L_0895A9D8; + case 0x0895AA1Cu: goto SB_L_0895AA1C; + case 0x0895AA24u: goto SB_L_0895AA24; + case 0x0895AA64u: goto SB_L_0895AA64; + case 0x0895AA80u: goto SB_L_0895AA80; + case 0x0895AA84u: goto SB_L_0895AA84; + case 0x0895AA8Cu: goto SB_L_0895AA8C; + case 0x0895AA90u: goto SB_L_0895AA90; + case 0x0895AA9Cu: goto SB_L_0895AA9C; + case 0x0895AAB8u: goto SB_L_0895AAB8; + case 0x0895AAC0u: goto SB_L_0895AAC0; + case 0x0895AADCu: goto SB_L_0895AADC; + case 0x0895AAE8u: goto SB_L_0895AAE8; + case 0x0895AAF0u: goto SB_L_0895AAF0; + case 0x0895AB30u: goto SB_L_0895AB30; + case 0x0895AB70u: goto SB_L_0895AB70; + case 0x0895AB98u: goto SB_L_0895AB98; + case 0x0895ABA8u: goto SB_L_0895ABA8; + case 0x0895ABACu: goto SB_L_0895ABAC; + case 0x0895ABDCu: goto SB_L_0895ABDC; + case 0x0895ABE0u: goto SB_L_0895ABE0; + case 0x0895ABECu: goto SB_L_0895ABEC; + case 0x0895ABFCu: goto SB_L_0895ABFC; + case 0x0895ACF0u: goto SB_L_0895ACF0; + case 0x0895AD00u: goto SB_L_0895AD00; + case 0x0895AD0Cu: goto SB_L_0895AD0C; + case 0x0895AD10u: goto SB_L_0895AD10; + case 0x0895AD2Cu: goto SB_L_0895AD2C; + case 0x0895AD38u: goto SB_L_0895AD38; + case 0x0895ADC8u: goto SB_L_0895ADC8; + case 0x0895ADD8u: goto SB_L_0895ADD8; + case 0x0895ADF4u: goto SB_L_0895ADF4; + case 0x0895AE00u: goto SB_L_0895AE00; + case 0x0895AE88u: goto SB_L_0895AE88; + case 0x0895AE9Cu: goto SB_L_0895AE9C; + case 0x0895AEA0u: goto SB_L_0895AEA0; + case 0x0895AEB4u: goto SB_L_0895AEB4; + case 0x0895AEC0u: goto SB_L_0895AEC0; + case 0x0895AEF0u: goto SB_L_0895AEF0; + case 0x0895AF1Cu: goto SB_L_0895AF1C; + case 0x0895AF34u: goto SB_L_0895AF34; + case 0x0895AF3Cu: goto SB_L_0895AF3C; + case 0x0895AF54u: goto SB_L_0895AF54; + case 0x0895AF6Cu: goto SB_L_0895AF6C; + case 0x0895AFC4u: goto SB_L_0895AFC4; + case 0x0895AFD8u: goto SB_L_0895AFD8; + case 0x0895AFECu: goto SB_L_0895AFEC; + case 0x0895B034u: goto SB_L_0895B034; + case 0x0895B060u: goto SB_L_0895B060; + case 0x0895B08Cu: goto SB_L_0895B08C; + case 0x0895B0B8u: goto SB_L_0895B0B8; + case 0x0895B0E4u: goto SB_L_0895B0E4; + case 0x0895B110u: goto SB_L_0895B110; + case 0x0895B13Cu: goto SB_L_0895B13C; + case 0x0895B168u: goto SB_L_0895B168; + case 0x0895B174u: goto SB_L_0895B174; + case 0x0895B194u: goto SB_L_0895B194; + case 0x0895B1B4u: goto SB_L_0895B1B4; + case 0x0895B1FCu: goto SB_L_0895B1FC; + case 0x0895B214u: goto SB_L_0895B214; + case 0x0895B228u: goto SB_L_0895B228; + case 0x0895B240u: goto SB_L_0895B240; + case 0x0895B258u: goto SB_L_0895B258; + case 0x0895B2B0u: goto SB_L_0895B2B0; + case 0x0895B2C0u: goto SB_L_0895B2C0; + case 0x0895B2CCu: goto SB_L_0895B2CC; + case 0x0895B2ECu: goto SB_L_0895B2EC; + case 0x0895B2F8u: goto SB_L_0895B2F8; + case 0x0895B33Cu: goto SB_L_0895B33C; + default: break; + } + switch (tier2_resume_unit) { + + default: break; + } + ctx.pc = tier2_resume_pc; + TIER2_SB_RETURN(); + +TIER2_LOCAL_DISPATCH_U0084: + 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 (!rt.tier2_complete_fused_transfers(ctx, tier2_nested_tail)) + tier2_same_context = false; + } + --tier2_return_depth; + if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + tier2_same_context = false; + if (!tier2_same_context) TIER2_SB_RETURN(); + goto TIER2_FUSED_RETURN_DISPATCH; + } + switch (local_pc) { + case 0x08955444u: goto SB_L_08955444; + case 0x08955474u: goto SB_L_08955474; + case 0x089554A0u: goto SB_L_089554A0; + case 0x089554A8u: goto SB_L_089554A8; + case 0x089554E0u: goto SB_L_089554E0; + case 0x089554ECu: goto SB_L_089554EC; + case 0x08955518u: goto SB_L_08955518; + case 0x08955534u: goto SB_L_08955534; + case 0x0895553Cu: goto SB_L_0895553C; + case 0x08955544u: goto SB_L_08955544; + case 0x0895554Cu: goto SB_L_0895554C; + case 0x08955570u: goto SB_L_08955570; + case 0x08955604u: goto SB_L_08955604; + case 0x08955608u: goto SB_L_08955608; + case 0x08955674u: goto SB_L_08955674; + case 0x08955684u: goto SB_L_08955684; + case 0x0895568Cu: goto SB_L_0895568C; + case 0x0895569Cu: goto SB_L_0895569C; + case 0x089556B4u: goto SB_L_089556B4; + case 0x089556D0u: goto SB_L_089556D0; + case 0x089556D4u: goto SB_L_089556D4; + case 0x08955700u: goto SB_L_08955700; + case 0x0895570Cu: goto SB_L_0895570C; + case 0x08955744u: goto SB_L_08955744; + case 0x08955758u: goto SB_L_08955758; + case 0x08955764u: goto SB_L_08955764; + case 0x0895576Cu: goto SB_L_0895576C; + case 0x089557B4u: goto SB_L_089557B4; + case 0x089557E8u: goto SB_L_089557E8; + case 0x089557F4u: goto SB_L_089557F4; + case 0x08955AC4u: goto SB_L_08955AC4; + case 0x08955ACCu: goto SB_L_08955ACC; + case 0x08955AD8u: goto SB_L_08955AD8; + case 0x08955D48u: goto SB_L_08955D48; + case 0x08956F20u: goto SB_L_08956F20; + case 0x08956F40u: goto SB_L_08956F40; + case 0x08957228u: goto SB_L_08957228; + case 0x089572E8u: goto SB_L_089572E8; + case 0x08957300u: goto SB_L_08957300; + case 0x0895731Cu: goto SB_L_0895731C; + case 0x08957320u: goto SB_L_08957320; + case 0x08957344u: goto SB_L_08957344; + case 0x08957350u: goto SB_L_08957350; + case 0x08957388u: goto SB_L_08957388; + case 0x0895739Cu: goto SB_L_0895739C; + case 0x089573A8u: goto SB_L_089573A8; + case 0x089573B0u: goto SB_L_089573B0; + case 0x089573F8u: goto SB_L_089573F8; + case 0x0895742Cu: goto SB_L_0895742C; + case 0x08957500u: goto SB_L_08957500; + case 0x089575B0u: goto SB_L_089575B0; + case 0x089575DCu: goto SB_L_089575DC; + case 0x08957608u: goto SB_L_08957608; + case 0x08957634u: goto SB_L_08957634; + case 0x08957660u: goto SB_L_08957660; + case 0x0895768Cu: goto SB_L_0895768C; + case 0x089576B8u: goto SB_L_089576B8; + case 0x089576E4u: goto SB_L_089576E4; + case 0x089576F0u: goto SB_L_089576F0; + case 0x089576FCu: goto SB_L_089576FC; + default: + ctx.pc = local_pc; + TIER2_SB_RETURN(); + } + +TIER2_LOCAL_DISPATCH_U0085: + 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 (!rt.tier2_complete_fused_transfers(ctx, tier2_nested_tail)) + tier2_same_context = false; + } + --tier2_return_depth; + if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + tier2_same_context = false; + if (!tier2_same_context) TIER2_SB_RETURN(); + goto TIER2_FUSED_RETURN_DISPATCH; + } + switch (local_pc) { + case 0x08958D28u: goto SB_L_08958D28; + case 0x08958D70u: goto SB_L_08958D70; + case 0x08958D74u: goto SB_L_08958D74; + case 0x08958D7Cu: goto SB_L_08958D7C; + case 0x08958D88u: goto SB_L_08958D88; + case 0x08958D94u: goto SB_L_08958D94; + case 0x08958DC4u: goto SB_L_08958DC4; + case 0x08958DD0u: goto SB_L_08958DD0; + case 0x08958DECu: goto SB_L_08958DEC; + case 0x08958DF8u: goto SB_L_08958DF8; + case 0x08958E10u: goto SB_L_08958E10; + case 0x08958E50u: goto SB_L_08958E50; + case 0x08958E58u: goto SB_L_08958E58; + case 0x08958E60u: goto SB_L_08958E60; + case 0x08958E88u: goto SB_L_08958E88; + case 0x08958EB4u: goto SB_L_08958EB4; + case 0x08958EC4u: goto SB_L_08958EC4; + case 0x08958ED8u: goto SB_L_08958ED8; + case 0x08958EE0u: goto SB_L_08958EE0; + case 0x08958EF4u: goto SB_L_08958EF4; + case 0x08958F00u: goto SB_L_08958F00; + case 0x08958F08u: goto SB_L_08958F08; + case 0x08958F1Cu: goto SB_L_08958F1C; + case 0x08958F30u: goto SB_L_08958F30; + case 0x08958F34u: goto SB_L_08958F34; + case 0x08958F60u: goto SB_L_08958F60; + case 0x08958F80u: goto SB_L_08958F80; + case 0x08958FA4u: goto SB_L_08958FA4; + case 0x08958FC4u: goto SB_L_08958FC4; + case 0x08958FCCu: goto SB_L_08958FCC; + case 0x08958FE0u: goto SB_L_08958FE0; + case 0x08959010u: goto SB_L_08959010; + case 0x08959024u: goto SB_L_08959024; + case 0x08959070u: goto SB_L_08959070; + case 0x089590F4u: goto SB_L_089590F4; + case 0x08959108u: goto SB_L_08959108; + case 0x08959118u: goto SB_L_08959118; + case 0x089591BCu: goto SB_L_089591BC; + case 0x089591C8u: goto SB_L_089591C8; + case 0x089591D0u: goto SB_L_089591D0; + case 0x089591DCu: goto SB_L_089591DC; + case 0x08959200u: goto SB_L_08959200; + case 0x0895920Cu: goto SB_L_0895920C; + case 0x08959218u: goto SB_L_08959218; + case 0x08959224u: goto SB_L_08959224; + case 0x0895922Cu: goto SB_L_0895922C; + case 0x08959234u: goto SB_L_08959234; + case 0x08959258u: goto SB_L_08959258; + case 0x08959298u: goto SB_L_08959298; + case 0x089592ACu: goto SB_L_089592AC; + case 0x089592CCu: goto SB_L_089592CC; + case 0x089592E0u: goto SB_L_089592E0; + case 0x08959300u: goto SB_L_08959300; + case 0x08959314u: goto SB_L_08959314; + case 0x089593E8u: goto SB_L_089593E8; + case 0x089593F0u: goto SB_L_089593F0; + case 0x08959414u: goto SB_L_08959414; + case 0x08959438u: goto SB_L_08959438; + case 0x0895944Cu: goto SB_L_0895944C; + case 0x08959458u: goto SB_L_08959458; + case 0x0895946Cu: goto SB_L_0895946C; + case 0x089594A0u: goto SB_L_089594A0; + case 0x0895952Cu: goto SB_L_0895952C; + case 0x08959544u: goto SB_L_08959544; + case 0x0895955Cu: goto SB_L_0895955C; + case 0x08959564u: goto SB_L_08959564; + case 0x08959574u: goto SB_L_08959574; + case 0x0895957Cu: goto SB_L_0895957C; + case 0x08959598u: goto SB_L_08959598; + case 0x089595F4u: goto SB_L_089595F4; + case 0x08959630u: goto SB_L_08959630; + case 0x0895963Cu: goto SB_L_0895963C; + case 0x0895964Cu: goto SB_L_0895964C; + case 0x08959654u: goto SB_L_08959654; + case 0x08959658u: goto SB_L_08959658; + case 0x0895968Cu: goto SB_L_0895968C; + case 0x089596E4u: goto SB_L_089596E4; + case 0x089596ECu: goto SB_L_089596EC; + case 0x089596F4u: goto SB_L_089596F4; + case 0x089596FCu: goto SB_L_089596FC; + case 0x08959704u: goto SB_L_08959704; + case 0x08959720u: goto SB_L_08959720; + case 0x08959738u: goto SB_L_08959738; + case 0x08959750u: goto SB_L_08959750; + case 0x0895975Cu: goto SB_L_0895975C; + case 0x08959764u: goto SB_L_08959764; + case 0x0895976Cu: goto SB_L_0895976C; + case 0x08959774u: goto SB_L_08959774; + case 0x08959790u: goto SB_L_08959790; + case 0x089597A8u: goto SB_L_089597A8; + case 0x089597C0u: goto SB_L_089597C0; + case 0x089597CCu: goto SB_L_089597CC; + case 0x089597D4u: goto SB_L_089597D4; + case 0x089597DCu: goto SB_L_089597DC; + case 0x089597F4u: goto SB_L_089597F4; + case 0x0895980Cu: goto SB_L_0895980C; + case 0x08959824u: goto SB_L_08959824; + case 0x0895982Cu: goto SB_L_0895982C; + case 0x08959844u: goto SB_L_08959844; + case 0x0895985Cu: goto SB_L_0895985C; + case 0x0895986Cu: goto SB_L_0895986C; + case 0x08959874u: goto SB_L_08959874; + case 0x0895987Cu: goto SB_L_0895987C; + case 0x08959898u: goto SB_L_08959898; + case 0x089598B0u: goto SB_L_089598B0; + case 0x089598D8u: goto SB_L_089598D8; + case 0x089598E4u: goto SB_L_089598E4; + case 0x089598F0u: goto SB_L_089598F0; + case 0x089598F8u: goto SB_L_089598F8; + case 0x08959900u: goto SB_L_08959900; + case 0x08959918u: goto SB_L_08959918; + case 0x08959930u: goto SB_L_08959930; + case 0x08959958u: goto SB_L_08959958; + case 0x08959964u: goto SB_L_08959964; + case 0x0895996Cu: goto SB_L_0895996C; + case 0x08959984u: goto SB_L_08959984; + case 0x0895999Cu: goto SB_L_0895999C; + case 0x089599ACu: goto SB_L_089599AC; + case 0x089599B4u: goto SB_L_089599B4; + case 0x08959A24u: goto SB_L_08959A24; + case 0x08959A2Cu: goto SB_L_08959A2C; + case 0x08959A34u: goto SB_L_08959A34; + case 0x08959A3Cu: goto SB_L_08959A3C; + case 0x08959A44u: goto SB_L_08959A44; + case 0x08959A4Cu: goto SB_L_08959A4C; + case 0x08959A68u: goto SB_L_08959A68; + case 0x08959A80u: goto SB_L_08959A80; + case 0x08959A98u: goto SB_L_08959A98; + case 0x08959AA4u: goto SB_L_08959AA4; + case 0x08959AACu: goto SB_L_08959AAC; + case 0x08959AB4u: goto SB_L_08959AB4; + case 0x08959AD0u: goto SB_L_08959AD0; + case 0x08959AE8u: goto SB_L_08959AE8; + case 0x08959B00u: goto SB_L_08959B00; + case 0x08959B0Cu: goto SB_L_08959B0C; + case 0x08959B14u: goto SB_L_08959B14; + case 0x08959B1Cu: goto SB_L_08959B1C; + case 0x08959B34u: goto SB_L_08959B34; + case 0x08959B4Cu: goto SB_L_08959B4C; + case 0x08959B64u: goto SB_L_08959B64; + case 0x08959B6Cu: goto SB_L_08959B6C; + case 0x08959B84u: goto SB_L_08959B84; + case 0x08959B9Cu: goto SB_L_08959B9C; + case 0x08959BACu: goto SB_L_08959BAC; + case 0x08959BB4u: goto SB_L_08959BB4; + case 0x08959BBCu: goto SB_L_08959BBC; + case 0x08959BD8u: goto SB_L_08959BD8; + case 0x08959BF0u: goto SB_L_08959BF0; + case 0x08959C18u: goto SB_L_08959C18; + case 0x08959C24u: goto SB_L_08959C24; + case 0x08959C30u: goto SB_L_08959C30; + case 0x08959C38u: goto SB_L_08959C38; + case 0x08959C40u: goto SB_L_08959C40; + case 0x08959C5Cu: goto SB_L_08959C5C; + case 0x08959C74u: goto SB_L_08959C74; + case 0x08959C8Cu: goto SB_L_08959C8C; + case 0x08959C98u: goto SB_L_08959C98; + case 0x08959CA0u: goto SB_L_08959CA0; + case 0x08959CA8u: goto SB_L_08959CA8; + case 0x08959CC0u: goto SB_L_08959CC0; + case 0x08959CD8u: goto SB_L_08959CD8; + case 0x08959D00u: goto SB_L_08959D00; + case 0x08959D0Cu: goto SB_L_08959D0C; + case 0x08959D14u: goto SB_L_08959D14; + case 0x08959D2Cu: goto SB_L_08959D2C; + case 0x08959D44u: goto SB_L_08959D44; + case 0x08959D54u: goto SB_L_08959D54; + case 0x08959D5Cu: goto SB_L_08959D5C; + case 0x08959D64u: goto SB_L_08959D64; + case 0x08959D7Cu: goto SB_L_08959D7C; + case 0x08959DDCu: goto SB_L_08959DDC; + case 0x08959DE4u: goto SB_L_08959DE4; + case 0x08959DF4u: goto SB_L_08959DF4; + case 0x08959E10u: goto SB_L_08959E10; + case 0x08959E1Cu: goto SB_L_08959E1C; + case 0x08959E2Cu: goto SB_L_08959E2C; + case 0x08959E54u: goto SB_L_08959E54; + case 0x08959F54u: goto SB_L_08959F54; + case 0x08959F5Cu: goto SB_L_08959F5C; + case 0x08959FA8u: goto SB_L_08959FA8; + case 0x08959FD8u: goto SB_L_08959FD8; + case 0x08959FE4u: goto SB_L_08959FE4; + case 0x08959FF4u: goto SB_L_08959FF4; + case 0x08959FFCu: goto SB_L_08959FFC; + case 0x0895A000u: goto SB_L_0895A000; + case 0x0895A01Cu: goto SB_L_0895A01C; + case 0x0895A024u: goto SB_L_0895A024; + case 0x0895A03Cu: goto SB_L_0895A03C; + case 0x0895A064u: goto SB_L_0895A064; + case 0x0895A070u: goto SB_L_0895A070; + case 0x0895A07Cu: goto SB_L_0895A07C; + case 0x0895A084u: goto SB_L_0895A084; + case 0x0895A08Cu: goto SB_L_0895A08C; + case 0x0895A0A4u: goto SB_L_0895A0A4; + case 0x0895A0BCu: goto SB_L_0895A0BC; + case 0x0895A0C8u: goto SB_L_0895A0C8; + case 0x0895A0D0u: goto SB_L_0895A0D0; + case 0x0895A0E0u: goto SB_L_0895A0E0; + case 0x0895A140u: goto SB_L_0895A140; + case 0x0895A148u: goto SB_L_0895A148; + case 0x0895A158u: goto SB_L_0895A158; + case 0x0895A174u: goto SB_L_0895A174; + case 0x0895A180u: goto SB_L_0895A180; + case 0x0895A190u: goto SB_L_0895A190; + case 0x0895A1B8u: goto SB_L_0895A1B8; + case 0x0895A298u: goto SB_L_0895A298; + case 0x0895A2A8u: goto SB_L_0895A2A8; + case 0x0895A2D0u: goto SB_L_0895A2D0; + case 0x0895A2E0u: goto SB_L_0895A2E0; + case 0x0895A324u: goto SB_L_0895A324; + case 0x0895A348u: goto SB_L_0895A348; + case 0x0895A360u: goto SB_L_0895A360; + case 0x0895A36Cu: goto SB_L_0895A36C; + case 0x0895A3BCu: goto SB_L_0895A3BC; + case 0x0895A414u: goto SB_L_0895A414; + case 0x0895A420u: goto SB_L_0895A420; + case 0x0895A450u: goto SB_L_0895A450; + case 0x0895A464u: goto SB_L_0895A464; + case 0x0895A470u: goto SB_L_0895A470; + case 0x0895A47Cu: goto SB_L_0895A47C; + case 0x0895A488u: goto SB_L_0895A488; + case 0x0895A49Cu: goto SB_L_0895A49C; + case 0x0895A4A4u: goto SB_L_0895A4A4; + case 0x0895A4D0u: goto SB_L_0895A4D0; + case 0x0895A4DCu: goto SB_L_0895A4DC; + case 0x0895A4E8u: goto SB_L_0895A4E8; + case 0x0895A4F0u: goto SB_L_0895A4F0; + case 0x0895A508u: goto SB_L_0895A508; + case 0x0895A510u: goto SB_L_0895A510; + case 0x0895A560u: goto SB_L_0895A560; + case 0x0895A588u: goto SB_L_0895A588; + case 0x0895A598u: goto SB_L_0895A598; + case 0x0895A718u: goto SB_L_0895A718; + case 0x0895A724u: goto SB_L_0895A724; + case 0x0895A72Cu: goto SB_L_0895A72C; + case 0x0895A760u: goto SB_L_0895A760; + case 0x0895A7F4u: goto SB_L_0895A7F4; + case 0x0895A86Cu: goto SB_L_0895A86C; + case 0x0895A88Cu: goto SB_L_0895A88C; + case 0x0895A8B4u: goto SB_L_0895A8B4; + case 0x0895A904u: goto SB_L_0895A904; + case 0x0895A92Cu: goto SB_L_0895A92C; + case 0x0895A93Cu: goto SB_L_0895A93C; + case 0x0895A964u: goto SB_L_0895A964; + case 0x0895A970u: goto SB_L_0895A970; + case 0x0895A97Cu: goto SB_L_0895A97C; + case 0x0895A998u: goto SB_L_0895A998; + case 0x0895A9A4u: goto SB_L_0895A9A4; + case 0x0895A9B0u: goto SB_L_0895A9B0; + case 0x0895A9BCu: goto SB_L_0895A9BC; + case 0x0895A9D8u: goto SB_L_0895A9D8; + case 0x0895AA1Cu: goto SB_L_0895AA1C; + case 0x0895AA24u: goto SB_L_0895AA24; + case 0x0895AA64u: goto SB_L_0895AA64; + case 0x0895AA80u: goto SB_L_0895AA80; + case 0x0895AA84u: goto SB_L_0895AA84; + case 0x0895AA8Cu: goto SB_L_0895AA8C; + case 0x0895AA90u: goto SB_L_0895AA90; + case 0x0895AA9Cu: goto SB_L_0895AA9C; + case 0x0895AAB8u: goto SB_L_0895AAB8; + case 0x0895AAC0u: goto SB_L_0895AAC0; + case 0x0895AADCu: goto SB_L_0895AADC; + case 0x0895AAE8u: goto SB_L_0895AAE8; + case 0x0895AAF0u: goto SB_L_0895AAF0; + case 0x0895AB30u: goto SB_L_0895AB30; + case 0x0895AB70u: goto SB_L_0895AB70; + case 0x0895AB98u: goto SB_L_0895AB98; + case 0x0895ABA8u: goto SB_L_0895ABA8; + case 0x0895ABACu: goto SB_L_0895ABAC; + case 0x0895ABDCu: goto SB_L_0895ABDC; + case 0x0895ABE0u: goto SB_L_0895ABE0; + case 0x0895ABECu: goto SB_L_0895ABEC; + case 0x0895ABFCu: goto SB_L_0895ABFC; + case 0x0895ACF0u: goto SB_L_0895ACF0; + case 0x0895AD00u: goto SB_L_0895AD00; + case 0x0895AD0Cu: goto SB_L_0895AD0C; + case 0x0895AD10u: goto SB_L_0895AD10; + case 0x0895AD2Cu: goto SB_L_0895AD2C; + case 0x0895AD38u: goto SB_L_0895AD38; + case 0x0895ADC8u: goto SB_L_0895ADC8; + case 0x0895ADD8u: goto SB_L_0895ADD8; + case 0x0895ADF4u: goto SB_L_0895ADF4; + case 0x0895AE00u: goto SB_L_0895AE00; + case 0x0895AE88u: goto SB_L_0895AE88; + case 0x0895AE9Cu: goto SB_L_0895AE9C; + case 0x0895AEA0u: goto SB_L_0895AEA0; + case 0x0895AEB4u: goto SB_L_0895AEB4; + case 0x0895AEC0u: goto SB_L_0895AEC0; + case 0x0895AEF0u: goto SB_L_0895AEF0; + case 0x0895AF1Cu: goto SB_L_0895AF1C; + case 0x0895AF34u: goto SB_L_0895AF34; + case 0x0895AF3Cu: goto SB_L_0895AF3C; + case 0x0895AF54u: goto SB_L_0895AF54; + case 0x0895AF6Cu: goto SB_L_0895AF6C; + case 0x0895AFC4u: goto SB_L_0895AFC4; + case 0x0895AFD8u: goto SB_L_0895AFD8; + case 0x0895AFECu: goto SB_L_0895AFEC; + case 0x0895B034u: goto SB_L_0895B034; + case 0x0895B060u: goto SB_L_0895B060; + case 0x0895B08Cu: goto SB_L_0895B08C; + case 0x0895B0B8u: goto SB_L_0895B0B8; + case 0x0895B0E4u: goto SB_L_0895B0E4; + case 0x0895B110u: goto SB_L_0895B110; + case 0x0895B13Cu: goto SB_L_0895B13C; + case 0x0895B168u: goto SB_L_0895B168; + case 0x0895B174u: goto SB_L_0895B174; + case 0x0895B194u: goto SB_L_0895B194; + case 0x0895B1B4u: goto SB_L_0895B1B4; + case 0x0895B1FCu: goto SB_L_0895B1FC; + case 0x0895B214u: goto SB_L_0895B214; + case 0x0895B228u: goto SB_L_0895B228; + case 0x0895B240u: goto SB_L_0895B240; + case 0x0895B258u: goto SB_L_0895B258; + case 0x0895B2B0u: goto SB_L_0895B2B0; + case 0x0895B2C0u: goto SB_L_0895B2C0; + case 0x0895B2CCu: goto SB_L_0895B2CC; + case 0x0895B2ECu: goto SB_L_0895B2EC; + case 0x0895B2F8u: goto SB_L_0895B2F8; + case 0x0895B33Cu: goto SB_L_0895B33C; + default: + ctx.pc = local_pc; + TIER2_SB_RETURN(); + } + + +TIER2_ENTRY_DISPATCH: + switch (entry_pc) { + case 0x08955444u: goto SB_L_08955444; + case 0x089554A8u: goto SB_L_089554A8; + case 0x08958D28u: goto SB_L_08958D28; + case 0x0895A760u: goto SB_L_0895A760; + default: + ctx.pc = entry_pc; + ++tier2_stats.fallbacks; + TIER2_SB_RETURN(); + } + +SB_L_08955444: + ctx.gpr[9] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(11768))); + ctx.set_vfpu_scalar_bits_ct<12u>(aot_mem.aot_load32(ctx.gpr[5] + static_cast(4))); + ctx.set_vfpu_scalar_bits_ct<44u>(aot_mem.aot_load32(ctx.gpr[5] + static_cast(8))); + ctx.gpr[10] = (ctx.gpr[28] + static_cast(-17792)); + ctx.set_vfpu_scalar_bits_ct<76u>(aot_mem.aot_load32(ctx.gpr[10] + static_cast(0))); + ctx.execute_vfpu_vh2f_ct<21u, 12u, 2u>(); + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<117u, 1u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<76u, 1u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = vfpu_s[i] * vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<117u, 1u>(vfpu_d); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix_ct<36u, 4u>(vfpu_matrix); + ctx.read_vfpu_vector_ct<21u, 4u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 4u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix_ct<14u, 4u>(vfpu_result); } + ctx.vfpu_ctrl[1u] = 0x000000FFu; + ctx.execute_vfpu_vcmp_ct<14u, 21u, 4u, 3u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 5u) & 1u) == 0u; + // nop + if (branch_taken) { + goto SB_L_089554A0; + } + goto SB_L_08955474; + } + +SB_L_08955474: + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<13u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<27u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<13u, 3u>(vfpu_d); } + ctx.execute_vfpu_vdot_ct<12u, 13u, 13u, 3u>(); + aot_mem.aot_store32(ctx.gpr[9] + static_cast(0), ctx.vfpu_scalar_bits_ct<12u>()); + aot_mem.aot_store32(ctx.gpr[9] + static_cast(4), ctx.gpr[5]); + aot_mem.aot_store8(ctx.gpr[9] + static_cast(8), static_cast(ctx.gpr[6])); + aot_mem.aot_store8(ctx.gpr[9] + static_cast(9), static_cast(ctx.gpr[7])); + aot_mem.aot_store8(ctx.gpr[9] + static_cast(10), static_cast(ctx.gpr[8])); + aot_mem.aot_store8(ctx.gpr[9] + static_cast(11), static_cast(0u)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(11768))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(12)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(11768), ctx.gpr[5]); + goto SB_L_089554A0; + +SB_L_089554A0: + jump_target = ctx.gpr[31]; + // nop + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0084; + +SB_L_089554A8: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-64)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), std::bit_cast(ctx.fpr[20])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[16]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(20), ctx.gpr[17]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(24), ctx.gpr[18]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(28), ctx.gpr[19]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(32), ctx.gpr[20]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(36), ctx.gpr[21]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(40), ctx.gpr[22]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(44), ctx.gpr[23]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(48), ctx.gpr[30]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(52), ctx.gpr[31]); + { const bool branch_taken = ctx.gpr[5] == 0u; + ctx.gpr[17] = (ctx.gpr[4] | 0u); + if (branch_taken) { + goto SB_L_08955544; + } + goto SB_L_089554E0; + } + +SB_L_089554E0: + ctx.gpr[20] = (aot_mem.aot_load16(ctx.gpr[5] + static_cast(2))); + { const bool branch_taken = ctx.gpr[20] == 0u; + // nop + if (branch_taken) { + goto SB_L_08955544; + } + goto SB_L_089554EC; + } + +SB_L_089554EC: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(24))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[6] = (ctx.gpr[20] + ctx.gpr[20]); + ctx.gpr[6] = (ctx.gpr[20] + ctx.gpr[6]); + ctx.gpr[20] = (ctx.gpr[6] << 2u); + ctx.gpr[20] = (ctx.gpr[4] + ctx.gpr[20]); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + ctx.gpr[18] = (2236u << 16u); + ctx.gpr[18] = (ctx.gpr[18] + static_cast(29552)); + { const bool branch_taken = ctx.gpr[16] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895553C; + } + goto SB_L_08955518; + } + +SB_L_08955518: + ctx.fpr[12] = std::bit_cast(0u); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(4), std::bit_cast(ctx.fpr[12])); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(8408))); + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] <= ctx.fpr[13])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); + ctx.gpr[21] = (ctx.gpr[5] + static_cast(12)); + if (branch_taken) { + goto SB_L_0895554C; + } + goto SB_L_08955534; + } + +SB_L_08955534: + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[17]); + if (branch_taken) { + goto SB_L_08955608; + } + goto SB_L_0895553C; + } + +SB_L_0895553C: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_089557B4; + } + goto SB_L_08955544; + } + +SB_L_08955544: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_089557B4; + } + goto SB_L_0895554C; + } + +SB_L_0895554C: + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix_ct<40u, 4u>(vfpu_matrix); + ctx.read_vfpu_vector_ct<21u, 4u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 4u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix_ct<14u, 4u>(vfpu_result); } + ctx.vfpu_ctrl[0u] = 0x00000FE4u; + ctx.vfpu_ctrl[1u] = 0x000000FFu; + ctx.execute_vfpu_vcmp_ct<14u, 21u, 4u, 3u>(); + // vflush: architectural no-op that retains VFPU prefixes + ctx.gpr[4] = (ctx.vfpu_scalar_bits_ct<131u>()); + ctx.gpr[4] = (ctx.gpr[4] & 16u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08955604; + } + goto SB_L_08955570; + } + +SB_L_08955570: + ctx.gpr[4] = (ctx.gpr[21] + static_cast(4)); + ctx.gpr[31] = (0x0895557Cu); + ctx.gpr[5] = (ctx.gpr[28] + static_cast(7744)); + goto SB_L_08957500; + +SB_L_08955604: + aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[17]); + goto SB_L_08955608; + +SB_L_08955608: + ctx.gpr[4] = (ctx.gpr[21] >> 8u); + ctx.gpr[30] = (15u << 16u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[30]); + aot_mem.aot_store32(ctx.gpr[18] + static_cast(20), ctx.gpr[4]); + ctx.gpr[23] = (4096u << 16u); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[23]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[18] + static_cast(0), ctx.gpr[4]); + ctx.gpr[22] = (256u << 16u); + ctx.gpr[22] = (ctx.gpr[22] + static_cast(-1)); + ctx.gpr[5] = (ctx.gpr[21] & ctx.gpr[22]); + ctx.gpr[21] = (2560u << 16u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[21]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[18] + static_cast(0), ctx.gpr[4]); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(-16976))); + ctx.gpr[4] = (17008u << 16u); + ctx.fpr[13] = std::bit_cast(ctx.gpr[4]); + 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_0895568C; + } + goto SB_L_08955674; + } + +SB_L_08955674: + ctx.gpr[4] = (ctx.gpr[17] | 0u); + ctx.gpr[5] = (ctx.gpr[16] | 0u); + ctx.gpr[31] = (0x08955684u); + ctx.gpr[6] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<85u, 0x0895A760u>(ctx)) { + ctx.pc = 0x0895A760u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08955684u; + tier2_return_unit[tier2_return_depth] = 84u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_0895A760; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0085_entry, 85u, 362u, 0x0895A760u>(ctx, &aot_mem) && ctx.pc == 0x08955684u) goto SB_L_08955684; + TIER2_SB_RETURN(); + +SB_L_08955684: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_089557B4; + } + goto SB_L_0895568C; + } + +SB_L_0895568C: + ctx.gpr[4] = (0u | 1u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(4))); + { const bool branch_taken = ctx.gpr[5] != 0u; + ctx.gpr[16] = (ctx.gpr[18] | 0u); + if (branch_taken) { + goto SB_L_08955764; + } + goto SB_L_0895569C; + } + +SB_L_0895569C: + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[4] >> 4u); + ctx.gpr[5] = (ctx.gpr[5] << 4u); + { const bool branch_taken = ctx.gpr[5] == ctx.gpr[4]; + ctx.gpr[19] = (ctx.gpr[17] | 0u); + if (branch_taken) { + goto SB_L_089556D4; + } + goto SB_L_089556B4; + } + +SB_L_089556B4: + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), 0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + ctx.gpr[5] = (ctx.gpr[4] >> 4u); + ctx.gpr[5] = (ctx.gpr[5] << 4u); + { const bool branch_taken = ctx.gpr[5] != ctx.gpr[4]; + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_089556B4; + } + goto SB_L_089556D0; + } + +SB_L_089556D0: + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + goto SB_L_089556D4; + +SB_L_089556D4: + ctx.gpr[4] = (0u | 255u); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(20), ctx.gpr[4]); + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(8412))); + ctx.gpr[4] = (14929u << 16u); + ctx.gpr[4] = (ctx.gpr[4] | 46871u); + ctx.fpr[12] = std::bit_cast(ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[28] + static_cast(8412), std::bit_cast(ctx.fpr[12])); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(0))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + ctx.gpr[31] = (0x08955700u); + ctx.gpr[6] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<85u, 0x0895A760u>(ctx)) { + ctx.pc = 0x0895A760u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08955700u; + tier2_return_unit[tier2_return_depth] = 84u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_0895A760; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0085_entry, 85u, 362u, 0x0895A760u>(ctx, &aot_mem) && ctx.pc == 0x08955700u) goto SB_L_08955700; + TIER2_SB_RETURN(); + +SB_L_08955700: + ctx.gpr[4] = (ctx.gpr[2] < static_cast(1) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + aot_mem.aot_store32(ctx.gpr[28] + static_cast(8412), std::bit_cast(ctx.fpr[20])); + if (branch_taken) { + goto SB_L_08955764; + } + goto SB_L_0895570C; + } + +SB_L_0895570C: + aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), ctx.gpr[19]); + aot_mem.aot_store8(ctx.gpr[29] + static_cast(4), static_cast(ctx.gpr[4])); + ctx.gpr[4] = (2816u << 16u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[19] = (ctx.gpr[4] - ctx.gpr[17]); + ctx.gpr[4] = (2236u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(29232)); + ctx.gpr[31] = (0x08955744u); + ctx.gpr[5] = (ctx.gpr[19] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0174_entry, 174u, 501u, 0x08ABE57Cu>(ctx, &aot_mem) && ctx.pc == 0x08955744u) goto SB_L_08955744; + TIER2_SB_RETURN(); + +SB_L_08955744: + aot_mem.aot_store32(ctx.gpr[20] + static_cast(4), ctx.gpr[2]); + ctx.gpr[4] = (ctx.gpr[2] | 0u); + ctx.gpr[5] = (ctx.gpr[17] | 0u); + ctx.gpr[31] = (0x08955758u); + ctx.gpr[6] = (ctx.gpr[19] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0088_entry, 88u, 36u, 0x089645DCu>(ctx, &aot_mem) && ctx.pc == 0x08955758u) goto SB_L_08955758; + TIER2_SB_RETURN(); + +SB_L_08955758: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(8))); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[29] + static_cast(4))); + goto SB_L_08955764; + +SB_L_08955764: + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_089557B4; + } + goto SB_L_0895576C; + } + +SB_L_0895576C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(4))); + ctx.gpr[5] = (ctx.gpr[4] & ctx.gpr[22]); + ctx.gpr[4] = (ctx.gpr[4] >> 8u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[30]); + aot_mem.aot_store32(ctx.gpr[18] + static_cast(20), ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[23]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[18] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[21]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[18] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (0u | 255u); + aot_mem.aot_store32(ctx.gpr[18] + static_cast(20), ctx.gpr[4]); + goto SB_L_089557B4; + +SB_L_089557B4: + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(16))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(20))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(24))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(28))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(32))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(36))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(40))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(44))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(48))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(52))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(64)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0084; + +SB_L_089557E8: + ctx.gpr[7] = (ctx.gpr[6] < static_cast(8) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[7] == 0u; + // nop + if (branch_taken) { + goto SB_L_08955AC4; + } + goto SB_L_089557F4; + } + +SB_L_089557F4: + ctx.gpr[6] = (ctx.gpr[6] << 2u); + ctx.gpr[1] = (2232u << 16u); + ctx.gpr[1] = (ctx.gpr[1] + ctx.gpr[6]); + ctx.gpr[1] = (aot_mem.aot_load32(ctx.gpr[1] + static_cast(-8760))); + jump_target = ctx.gpr[1]; + // nop + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0084; + +SB_L_08955AC4: + jump_target = ctx.gpr[31]; + // nop + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0084; + +SB_L_08955ACC: + ctx.gpr[7] = (ctx.gpr[6] < static_cast(8) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[7] == 0u; + // nop + if (branch_taken) { + goto SB_L_08955D48; + } + goto SB_L_08955AD8; + } + +SB_L_08955AD8: + ctx.gpr[6] = (ctx.gpr[6] << 2u); + ctx.gpr[1] = (2232u << 16u); + ctx.gpr[1] = (ctx.gpr[1] + ctx.gpr[6]); + ctx.gpr[1] = (aot_mem.aot_load32(ctx.gpr[1] + static_cast(-8728))); + jump_target = ctx.gpr[1]; + // nop + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0084; + +SB_L_08955D48: + jump_target = ctx.gpr[31]; + // nop + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0084; + +SB_L_08956F20: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(24))); + ctx.gpr[2] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[5] + ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] << 2u); + ctx.gpr[2] = (ctx.gpr[2] + ctx.gpr[4]); + jump_target = ctx.gpr[31]; + // nop + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0084; + +SB_L_08956F40: + jump_target = ctx.gpr[31]; + ctx.gpr[2] = (ctx.gpr[5] | 0u); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0084; + +SB_L_08957228: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-64)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), std::bit_cast(ctx.fpr[20])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[16]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[17]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(20), ctx.gpr[18]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(24), ctx.gpr[19]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(28), ctx.gpr[20]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(32), ctx.gpr[21]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(36), ctx.gpr[22]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(40), ctx.gpr[23]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(44), ctx.gpr[30]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(48), ctx.gpr[31]); + ctx.gpr[6] = (aot_mem.aot_load16(ctx.gpr[5] + static_cast(6))); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(24))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast(0))); + ctx.gpr[7] = (ctx.gpr[6] + ctx.gpr[6]); + ctx.gpr[6] = (ctx.gpr[6] + ctx.gpr[7]); + ctx.gpr[6] = (ctx.gpr[6] << 2u); + ctx.gpr[19] = (ctx.gpr[19] + ctx.gpr[6]); + ctx.gpr[17] = (2236u << 16u); + ctx.gpr[17] = (ctx.gpr[17] + static_cast(29552)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(8))); + ctx.gpr[6] = (ctx.gpr[5] >> 8u); + ctx.gpr[7] = (15u << 16u); + ctx.gpr[6] = (ctx.gpr[6] & ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(20), ctx.gpr[6]); + ctx.gpr[30] = (4096u << 16u); + ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[30]); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[7] + static_cast(0), ctx.gpr[6]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(0), ctx.gpr[6]); + ctx.gpr[23] = (256u << 16u); + ctx.gpr[23] = (ctx.gpr[23] + static_cast(-1)); + ctx.gpr[5] = (ctx.gpr[5] & ctx.gpr[23]); + ctx.gpr[22] = (2560u << 16u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[22]); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(0), ctx.gpr[5]); + ctx.gpr[20] = (0u | 255u); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(20), ctx.gpr[20]); + ctx.gpr[5] = (0u | 1u); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(4))); + { const bool branch_taken = ctx.gpr[6] != 0u; + ctx.gpr[16] = (ctx.gpr[17] | 0u); + if (branch_taken) { + goto SB_L_089573A8; + } + goto SB_L_089572E8; + } + +SB_L_089572E8: + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[6] = (ctx.gpr[5] >> 4u); + ctx.gpr[6] = (ctx.gpr[6] << 4u); + { const bool branch_taken = ctx.gpr[6] == ctx.gpr[5]; + ctx.gpr[21] = (ctx.gpr[18] | 0u); + if (branch_taken) { + goto SB_L_08957320; + } + goto SB_L_08957300; + } + +SB_L_08957300: + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), 0u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + ctx.gpr[6] = (ctx.gpr[5] >> 4u); + ctx.gpr[6] = (ctx.gpr[6] << 4u); + { const bool branch_taken = ctx.gpr[6] != ctx.gpr[5]; + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + if (branch_taken) { + goto SB_L_08957300; + } + goto SB_L_0895731C; + } + +SB_L_0895731C: + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + goto SB_L_08957320; + +SB_L_08957320: + aot_mem.aot_store32(ctx.gpr[16] + static_cast(20), ctx.gpr[20]); + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(8412))); + ctx.gpr[5] = (14929u << 16u); + ctx.gpr[5] = (ctx.gpr[5] | 46871u); + ctx.fpr[12] = std::bit_cast(ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[28] + static_cast(8412), std::bit_cast(ctx.fpr[12])); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(0))); + ctx.gpr[31] = (0x08957344u); + ctx.gpr[6] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<85u, 0x0895A760u>(ctx)) { + ctx.pc = 0x0895A760u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08957344u; + tier2_return_unit[tier2_return_depth] = 84u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_0895A760; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0085_entry, 85u, 362u, 0x0895A760u>(ctx, &aot_mem) && ctx.pc == 0x08957344u) goto SB_L_08957344; + TIER2_SB_RETURN(); + +SB_L_08957344: + ctx.gpr[5] = (ctx.gpr[2] < static_cast(1) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[5] == 0u; + aot_mem.aot_store32(ctx.gpr[28] + static_cast(8412), std::bit_cast(ctx.fpr[20])); + if (branch_taken) { + goto SB_L_089573A8; + } + goto SB_L_08957350; + } + +SB_L_08957350: + aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[21]); + aot_mem.aot_store8(ctx.gpr[29] + static_cast(0), static_cast(ctx.gpr[5])); + ctx.gpr[4] = (2816u << 16u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[21] = (ctx.gpr[4] - ctx.gpr[18]); + ctx.gpr[4] = (2236u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(29232)); + ctx.gpr[31] = (0x08957388u); + ctx.gpr[5] = (ctx.gpr[21] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0174_entry, 174u, 501u, 0x08ABE57Cu>(ctx, &aot_mem) && ctx.pc == 0x08957388u) goto SB_L_08957388; + TIER2_SB_RETURN(); + +SB_L_08957388: + aot_mem.aot_store32(ctx.gpr[19] + static_cast(4), ctx.gpr[2]); + ctx.gpr[4] = (ctx.gpr[2] | 0u); + ctx.gpr[5] = (ctx.gpr[18] | 0u); + ctx.gpr[31] = (0x0895739Cu); + ctx.gpr[6] = (ctx.gpr[21] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0088_entry, 88u, 36u, 0x089645DCu>(ctx, &aot_mem) && ctx.pc == 0x0895739Cu) goto SB_L_0895739C; + TIER2_SB_RETURN(); + +SB_L_0895739C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(4))); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[29] + static_cast(0))); + goto SB_L_089573A8; + +SB_L_089573A8: + { const bool branch_taken = ctx.gpr[5] == 0u; + // nop + if (branch_taken) { + goto SB_L_089573F8; + } + goto SB_L_089573B0; + } + +SB_L_089573B0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(4))); + ctx.gpr[5] = (15u << 16u); + ctx.gpr[6] = (ctx.gpr[4] & ctx.gpr[23]); + ctx.gpr[4] = (ctx.gpr[4] >> 8u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(20), ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[30]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[22]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(0), ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(20), ctx.gpr[20]); + goto SB_L_089573F8; + +SB_L_089573F8: + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(8))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(16))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(20))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(24))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(28))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(32))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(36))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(40))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(44))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(48))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(64)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0084; + +SB_L_0895742C: + jump_target = ctx.gpr[31]; + // nop + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0084; + +SB_L_08957500: + { const std::uint32_t vfpu_address = ctx.gpr[5] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<15u, 4u>(vfpu_value); } + ctx.gpr[8] = (aot_mem.aot_load_word_left(ctx.gpr[4] + static_cast(2), ctx.gpr[8])); + ctx.gpr[9] = (aot_mem.aot_load_word_left(ctx.gpr[4] + static_cast(6), ctx.gpr[9])); + ctx.gpr[10] = (aot_mem.aot_load_word_left(ctx.gpr[4] + static_cast(10), ctx.gpr[10])); + ctx.gpr[11] = (aot_mem.aot_load_word_left(ctx.gpr[4] + static_cast(14), ctx.gpr[11])); + ctx.gpr[12] = (aot_mem.aot_load_word_left(ctx.gpr[4] + static_cast(18), ctx.gpr[12])); + ctx.gpr[13] = (aot_mem.aot_load_word_left(ctx.gpr[4] + static_cast(22), ctx.gpr[13])); + ctx.gpr[14] = (aot_mem.aot_load_word_left(ctx.gpr[4] + static_cast(26), ctx.gpr[14])); + ctx.gpr[15] = (aot_mem.aot_load_word_left(ctx.gpr[4] + static_cast(30), ctx.gpr[15])); + ctx.gpr[24] = (aot_mem.aot_load_word_left(ctx.gpr[4] + static_cast(34), ctx.gpr[24])); + ctx.gpr[25] = (aot_mem.aot_load_word_left(ctx.gpr[4] + static_cast(38), ctx.gpr[25])); + ctx.gpr[2] = (aot_mem.aot_load_word_left(ctx.gpr[4] + static_cast(42), ctx.gpr[2])); + ctx.gpr[3] = (aot_mem.aot_load_word_left(ctx.gpr[4] + static_cast(46), ctx.gpr[3])); + ctx.set_vfpu_scalar_bits_ct<24u>(ctx.gpr[8]); + ctx.set_vfpu_scalar_bits_ct<56u>(ctx.gpr[9]); + ctx.set_vfpu_scalar_bits_ct<88u>(ctx.gpr[10]); + ctx.set_vfpu_scalar_bits_ct<25u>(ctx.gpr[11]); + ctx.set_vfpu_scalar_bits_ct<57u>(ctx.gpr[12]); + ctx.set_vfpu_scalar_bits_ct<89u>(ctx.gpr[13]); + ctx.set_vfpu_scalar_bits_ct<26u>(ctx.gpr[14]); + ctx.set_vfpu_scalar_bits_ct<58u>(ctx.gpr[15]); + ctx.set_vfpu_scalar_bits_ct<90u>(ctx.gpr[24]); + ctx.set_vfpu_scalar_bits_ct<27u>(ctx.gpr[25]); + ctx.set_vfpu_scalar_bits_ct<59u>(ctx.gpr[2]); + ctx.set_vfpu_scalar_bits_ct<91u>(ctx.gpr[3]); + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<27u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<15u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<27u, 3u>(vfpu_d); } + { float vfpu_value[4]{}; vfpu_value[3u] = 1.0f; + ctx.write_vfpu_vector_with_destination_prefix_ct<59u, 4u>(vfpu_value); } + { float vfpu_value[4]{}; + ctx.write_vfpu_vector_with_destination_prefix_ct<31u, 4u>(vfpu_value); } + { float vfpu_value[4]{1.0f, 1.0f, 1.0f, 1.0f}; + ctx.write_vfpu_vector_with_destination_prefix_ct<12u, 4u>(vfpu_value); } + { float vfpu_value[4]{1.0f, 1.0f, 1.0f, 1.0f}; + ctx.write_vfpu_vector_with_destination_prefix_ct<13u, 2u>(vfpu_value); } + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<12u, 3u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = -vfpu_s[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<12u, 3u>(vfpu_d); } + { float vfpu_s[16]{}, vfpu_t[16]{}, vfpu_d[16]{}; + ctx.read_vfpu_matrix_ct<36u, 4u>(vfpu_s); + ctx.read_vfpu_matrix_ct<24u, 4u>(vfpu_t); + for (std::uint32_t a = 0; a < 4u; ++a) { + for (std::uint32_t b = 0; b < 4u; ++b) { + float sum = 0.0f; + for (std::uint32_t c = 0; c < 4u; ++c) sum += vfpu_s[b * 4u + c] * vfpu_t[a * 4u + c]; + vfpu_d[a * 4u + b] = sum; + } + } + ctx.write_vfpu_matrix_ct<20u, 4u>(vfpu_d); + ctx.eat_vfpu_prefixes(); } + { float vfpu_s[16]{}, vfpu_t[16]{}, vfpu_d[16]{}; + ctx.read_vfpu_matrix_ct<40u, 4u>(vfpu_s); + ctx.read_vfpu_matrix_ct<24u, 4u>(vfpu_t); + for (std::uint32_t a = 0; a < 4u; ++a) { + for (std::uint32_t b = 0; b < 4u; ++b) { + float sum = 0.0f; + for (std::uint32_t c = 0; c < 4u; ++c) sum += vfpu_s[b * 4u + c] * vfpu_t[a * 4u + c]; + vfpu_d[a * 4u + b] = sum; + } + } + ctx.write_vfpu_matrix_ct<16u, 4u>(vfpu_d); + ctx.eat_vfpu_prefixes(); } + ctx.execute_vfpu_vcmp_ct<52u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<1u, 108u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<1u, 12u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<33u, 13u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<33u, 44u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<65u, 45u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<65u, 76u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<34u, 1u, 52u, 4u>(); + ctx.execute_vfpu_vcmp_ct<34u, 31u, 1u, 7u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) != 0u; + // nop + if (branch_taken) { + goto SB_L_089576F0; + } + goto SB_L_089575B0; + } + +SB_L_089575B0: + ctx.execute_vfpu_vcmp_ct<53u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<1u, 108u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<1u, 12u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<33u, 13u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<33u, 44u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<65u, 45u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<65u, 76u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<34u, 1u, 53u, 4u>(); + ctx.execute_vfpu_vcmp_ct<34u, 31u, 1u, 7u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) != 0u; + // nop + if (branch_taken) { + goto SB_L_089576F0; + } + goto SB_L_089575DC; + } + +SB_L_089575DC: + ctx.execute_vfpu_vcmp_ct<54u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<1u, 108u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<1u, 12u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<33u, 13u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<33u, 44u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<65u, 45u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<65u, 76u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<34u, 1u, 54u, 4u>(); + ctx.execute_vfpu_vcmp_ct<34u, 31u, 1u, 7u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) != 0u; + // nop + if (branch_taken) { + goto SB_L_089576F0; + } + goto SB_L_08957608; + } + +SB_L_08957608: + ctx.execute_vfpu_vcmp_ct<55u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<1u, 108u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<1u, 12u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<33u, 13u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<33u, 44u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<65u, 45u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<65u, 76u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<34u, 1u, 55u, 4u>(); + ctx.execute_vfpu_vcmp_ct<34u, 31u, 1u, 7u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) != 0u; + // nop + if (branch_taken) { + goto SB_L_089576F0; + } + goto SB_L_08957634; + } + +SB_L_08957634: + ctx.execute_vfpu_vcmp_ct<48u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<0u, 12u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<0u, 108u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<32u, 44u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<32u, 13u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<64u, 76u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<64u, 45u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<2u, 0u, 48u, 4u>(); + ctx.execute_vfpu_vcmp_ct<2u, 31u, 1u, 2u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) == 0u; + // nop + if (branch_taken) { + goto SB_L_089576FC; + } + goto SB_L_08957660; + } + +SB_L_08957660: + ctx.execute_vfpu_vcmp_ct<49u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<0u, 12u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<0u, 108u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<32u, 44u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<32u, 13u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<64u, 76u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<64u, 45u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<2u, 0u, 49u, 4u>(); + ctx.execute_vfpu_vcmp_ct<2u, 31u, 1u, 2u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) == 0u; + // nop + if (branch_taken) { + goto SB_L_089576FC; + } + goto SB_L_0895768C; + } + +SB_L_0895768C: + ctx.execute_vfpu_vcmp_ct<50u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<0u, 12u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<0u, 108u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<32u, 44u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<32u, 13u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<64u, 76u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<64u, 45u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<2u, 0u, 50u, 4u>(); + ctx.execute_vfpu_vcmp_ct<2u, 31u, 1u, 2u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) == 0u; + // nop + if (branch_taken) { + goto SB_L_089576FC; + } + goto SB_L_089576B8; + } + +SB_L_089576B8: + ctx.execute_vfpu_vcmp_ct<51u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<0u, 12u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<0u, 108u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<32u, 44u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<32u, 13u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<64u, 76u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<64u, 45u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<2u, 0u, 51u, 4u>(); + ctx.execute_vfpu_vcmp_ct<2u, 31u, 1u, 2u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) == 0u; + // nop + if (branch_taken) { + goto SB_L_089576FC; + } + goto SB_L_089576E4; + } + +SB_L_089576E4: + ctx.gpr[2] = (0u + static_cast(2)); + jump_target = ctx.gpr[31]; + // nop + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0084; + +SB_L_089576F0: + ctx.gpr[2] = (0u + static_cast(0)); + jump_target = ctx.gpr[31]; + // nop + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0084; + +SB_L_089576FC: + ctx.gpr[2] = (0u + static_cast(1)); + jump_target = ctx.gpr[31]; + // nop + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0084; + +SB_L_08958D28: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-624)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(576), std::bit_cast(ctx.fpr[20])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(580), ctx.gpr[16]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(584), ctx.gpr[17]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(588), ctx.gpr[18]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(592), ctx.gpr[19]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(596), ctx.gpr[20]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(600), ctx.gpr[21]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(604), ctx.gpr[22]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(608), ctx.gpr[23]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(612), ctx.gpr[30]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(616), ctx.gpr[31]); + ctx.gpr[16] = (2236u << 16u); + ctx.gpr[16] = (ctx.gpr[16] + static_cast(29232)); + ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(301))); + ctx.gpr[21] = (ctx.gpr[4] | 0u); + { const bool branch_taken = ctx.gpr[6] != 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(500), ctx.gpr[5]); + if (branch_taken) { + goto SB_L_08958D88; + } + goto SB_L_08958D70; + } + +SB_L_08958D70: + ctx.gpr[4] = (ctx.gpr[16] | 0u); + goto SB_L_08958D74; + +SB_L_08958D74: + ctx.gpr[31] = (0x08958D7Cu); + ctx.gpr[5] = (0u | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0109_entry, 109u, 323u, 0x089B9ABCu>(ctx, &aot_mem) && ctx.pc == 0x08958D7Cu) goto SB_L_08958D7C; + TIER2_SB_RETURN(); + +SB_L_08958D7C: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(301))); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (branch_taken) { + goto SB_L_08958D74; + } + goto SB_L_08958D88; + } + +SB_L_08958D88: + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(500))); + { const bool branch_taken = ctx.gpr[7] != 0u; + // nop + if (branch_taken) { + goto SB_L_08958DF8; + } + goto SB_L_08958D94; + } + +SB_L_08958D94: + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[21] + static_cast(1476))); + ctx.gpr[4] = (15692u << 16u); + ctx.gpr[4] = (ctx.gpr[4] | 52429u); + ctx.fpr[12] = std::bit_cast(ctx.gpr[4]); + ctx.fpr[14] = ctx.fpr[13] + ctx.fpr[12]; + aot_mem.aot_store32(ctx.gpr[21] + static_cast(1476), std::bit_cast(ctx.fpr[14])); + ctx.gpr[4] = (16256u << 16u); + ctx.fpr[13] = std::bit_cast(ctx.gpr[4]); + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[14] < ctx.fpr[13])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = ((ctx.fcr31 & 0x00800000u) != 0u); + // nop + if (branch_taken) { + goto SB_L_08958DD0; + } + goto SB_L_08958DC4; + } + +SB_L_08958DC4: + ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[21] + static_cast(1476))); + ctx.fpr[14] = ctx.fpr[14] - ctx.fpr[13]; + aot_mem.aot_store32(ctx.gpr[21] + static_cast(1476), std::bit_cast(ctx.fpr[14])); + goto SB_L_08958DD0; + +SB_L_08958DD0: + ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[21] + static_cast(1480))); + ctx.fpr[12] = ctx.fpr[14] + ctx.fpr[12]; + aot_mem.aot_store32(ctx.gpr[21] + static_cast(1480), std::bit_cast(ctx.fpr[12])); + 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_08958DF8; + } + goto SB_L_08958DEC; + } + +SB_L_08958DEC: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[21] + static_cast(1480))); + ctx.fpr[12] = ctx.fpr[12] - ctx.fpr[13]; + aot_mem.aot_store32(ctx.gpr[21] + static_cast(1480), std::bit_cast(ctx.fpr[12])); + goto SB_L_08958DF8; + +SB_L_08958DF8: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(580))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + ctx.gpr[4] = (static_cast(0u) < static_cast(ctx.gpr[4]) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08958E58; + } + goto SB_L_08958E10; + } + +SB_L_08958E10: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(580))); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(20))); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(7752))); + ctx.fpr[13] = std::bit_cast(std::bit_cast(ctx.fpr[13]) ^ 0x80000000u); + ctx.gpr[4] = (17279u << 16u); + ctx.fpr[20] = std::bit_cast(ctx.gpr[4]); + ctx.gpr[4] = (2246u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(1840)); + ctx.gpr[5] = (ctx.gpr[28] + static_cast(7744)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(564), ctx.gpr[4]); + ctx.gpr[4] = (0u & 255u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(552), ctx.gpr[5]); + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((!(std::isnan(ctx.fpr[12]) || std::isnan(ctx.fpr[13])) && ctx.fpr[12] == ctx.fpr[13])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(496), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_08958E60; + } + goto SB_L_08958E50; + } + +SB_L_08958E50: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08958EC4; + } + goto SB_L_08958E58; + } + +SB_L_08958E58: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_0895A72C; + } + goto SB_L_08958E60; + } + +SB_L_08958E60: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(580))); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(20))); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(7752))); + ctx.fpr[13] = std::bit_cast(std::bit_cast(ctx.fpr[13]) ^ 0x80000000u); + ctx.fpr[12] = ctx.fpr[12] - ctx.fpr[13]; + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(32))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(8))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(40))); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + ctx.gpr[6] = (15104u << 16u); + if (branch_taken) { + goto SB_L_08958EB4; + } + goto SB_L_08958E88; + } + +SB_L_08958E88: + ctx.gpr[8] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(60))); + ctx.gpr[8] = (ctx.gpr[8] << 8u); + ctx.fpr[13] = std::bit_cast(ctx.gpr[8]); + ctx.fpr[13] = ctx.fpr[13] + ctx.fpr[12]; + ctx.gpr[8] = (std::bit_cast(ctx.fpr[13])); + ctx.gpr[8] = (ctx.gpr[8] >> 8u); + ctx.gpr[8] = (ctx.gpr[8] | ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(60), ctx.gpr[8]); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(68)); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08958E88; + } + goto SB_L_08958EB4; + } + +SB_L_08958EB4: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(7752))); + ctx.fpr[12] = std::bit_cast(std::bit_cast(ctx.fpr[12]) ^ 0x80000000u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(580))); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(20), std::bit_cast(ctx.fpr[12])); + goto SB_L_08958EC4; + +SB_L_08958EC4: + ctx.gpr[16] = (0u | 0u); + ctx.gpr[5] = (0u | 8u); + ctx.gpr[4] = (ctx.gpr[7] | 0u); + { const bool branch_taken = static_cast(ctx.gpr[4]) > 0; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(548), ctx.gpr[5]); + if (branch_taken) { + goto SB_L_08958EF4; + } + goto SB_L_08958ED8; + } + +SB_L_08958ED8: + { const bool branch_taken = static_cast(ctx.gpr[4]) < 0; + // nop + if (branch_taken) { + goto SB_L_08958F30; + } + goto SB_L_08958EE0; + } + +SB_L_08958EE0: + ctx.gpr[16] = (0u | 0u); + ctx.gpr[4] = (0u | 4u); + ctx.gpr[19] = (0u | 0u); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(548), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_08958F34; + } + goto SB_L_08958EF4; + } + +SB_L_08958EF4: + ctx.gpr[5] = (static_cast(ctx.gpr[4]) < 2 ? 1u : 0u); + { const bool branch_taken = ctx.gpr[5] != 0u; + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < 3 ? 1u : 0u); + if (branch_taken) { + goto SB_L_08958F1C; + } + goto SB_L_08958F00; + } + +SB_L_08958F00: + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08958F30; + } + goto SB_L_08958F08; + } + +SB_L_08958F08: + ctx.gpr[16] = (0u | 6u); + ctx.gpr[4] = (0u | 8u); + ctx.gpr[19] = (0u | 24u); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(548), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_08958F34; + } + goto SB_L_08958F1C; + } + +SB_L_08958F1C: + ctx.gpr[16] = (0u | 4u); + ctx.gpr[4] = (0u | 6u); + ctx.gpr[19] = (0u | 16u); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(548), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_08958F34; + } + goto SB_L_08958F30; + } + +SB_L_08958F30: + ctx.gpr[19] = (0u | 0u); + goto SB_L_08958F34; + +SB_L_08958F34: + aot_mem.aot_store32(ctx.gpr[29] + static_cast(544), ctx.gpr[16]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(556), ctx.gpr[19]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(580))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + ctx.fpr[12] = std::bit_cast(ctx.gpr[5]); + ctx.fpr[12] = static_cast(static_cast(std::bit_cast(ctx.fpr[12]))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(12))); + ctx.fpr[13] = std::bit_cast(ctx.gpr[4]); + ctx.fpr[13] = static_cast(static_cast(std::bit_cast(ctx.fpr[13]))); + ctx.gpr[31] = (0x08958F60u); + ctx.gpr[4] = (ctx.gpr[29] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0083_entry, 83u, 823u, 0x08953A08u>(ctx, &aot_mem) && ctx.pc == 0x08958F60u) goto SB_L_08958F60; + TIER2_SB_RETURN(); + +SB_L_08958F60: + { const std::uint32_t vfpu_address = ctx.gpr[29] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = -vfpu_s[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } + ctx.gpr[4] = (ctx.gpr[29] + static_cast(96)); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(548))); + ctx.gpr[4] = (static_cast(ctx.gpr[16]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(516), ctx.gpr[16]); + if (branch_taken) { + goto SB_L_08959200; + } + goto SB_L_08958F80; + } + +SB_L_08958F80: + aot_mem.aot_store32(ctx.gpr[29] + static_cast(544), ctx.gpr[16]); + ctx.gpr[18] = (ctx.gpr[29] + static_cast(272)); + ctx.gpr[30] = (ctx.gpr[29] + static_cast(240)); + ctx.gpr[23] = (ctx.gpr[29] + static_cast(256)); + ctx.gpr[22] = (ctx.gpr[29] + static_cast(288)); + ctx.gpr[20] = (ctx.gpr[29] + static_cast(304)); + ctx.gpr[19] = (ctx.gpr[29] + static_cast(352)); + ctx.gpr[4] = (ctx.gpr[16] << 2u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(512), ctx.gpr[4]); + goto SB_L_08958FA4; + +SB_L_08958FA4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(512))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(580))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(32))); + ctx.gpr[4] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(12))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(504), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(504))); + goto SB_L_08958FC4; + +SB_L_08958FC4: + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[4]; + // nop + if (branch_taken) { + goto SB_L_089591DC; + } + goto SB_L_08958FCC; + } + +SB_L_08958FCC: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32767u); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < 32 ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_089591DC; + } + goto SB_L_08958FE0; + } + +SB_L_08958FE0: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32767u); + ctx.gpr[5] = (ctx.gpr[4] << 8u); + ctx.gpr[6] = (ctx.gpr[4] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[6]); + ctx.gpr[4] = (ctx.gpr[4] << 4u); + ctx.gpr[4] = (ctx.gpr[5] - ctx.gpr[4]); + ctx.gpr[16] = (ctx.gpr[21] + ctx.gpr[4]); + ctx.gpr[16] = (ctx.gpr[16] + static_cast(1488)); + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(193))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_089591D0; + } + goto SB_L_08959010; + } + +SB_L_08959010: + aot_mem.aot_store32(ctx.gpr[29] + static_cast(568), ctx.gpr[19]); + ctx.gpr[4] = (ctx.gpr[18] | 0u); + ctx.gpr[19] = (ctx.gpr[16] + static_cast(112)); + ctx.gpr[31] = (0x08959024u); + ctx.gpr[5] = (ctx.gpr[19] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0022_entry, 22u, 912u, 0x0885F828u>(ctx, &aot_mem) && ctx.pc == 0x08959024u) goto SB_L_08959024; + TIER2_SB_RETURN(); + +SB_L_08959024: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(24))); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[5] = (ctx.gpr[5] & 32767u); + ctx.gpr[6] = (ctx.gpr[5] + ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[5] + ctx.gpr[6]); + ctx.gpr[5] = (ctx.gpr[5] << 2u); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(304)); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(256), std::bit_cast(ctx.fpr[12])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(4))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(260), std::bit_cast(ctx.fpr[12])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(264), std::bit_cast(ctx.fpr[12])); + ctx.gpr[4] = (ctx.gpr[30] | 0u); + ctx.gpr[5] = (ctx.gpr[19] | 0u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(572), ctx.gpr[19]); + ctx.gpr[31] = (0x08959070u); + ctx.gpr[6] = (ctx.gpr[23] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0083_entry, 83u, 813u, 0x08953954u>(ctx, &aot_mem) && ctx.pc == 0x08959070u) goto SB_L_08959070; + TIER2_SB_RETURN(); + +SB_L_08959070: + { const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + ctx.gpr[4] = (ctx.gpr[29] + static_cast(320)); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(96))); + ctx.gpr[4] = (std::bit_cast(ctx.fpr[12])); + ctx.set_vfpu_scalar_bits_ct<1u>(ctx.gpr[4]); + { const std::uint32_t vfpu_address = ctx.gpr[18] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + ctx.execute_vfpu_vscl_ct<0u, 0u, 1u, 3u>(); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[18] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(100))); + ctx.gpr[4] = (std::bit_cast(ctx.fpr[13])); + ctx.set_vfpu_scalar_bits_ct<1u>(ctx.gpr[4]); + { const std::uint32_t vfpu_address = ctx.gpr[22] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + ctx.execute_vfpu_vscl_ct<0u, 0u, 1u, 3u>(); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[22] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(104))); + ctx.gpr[4] = (std::bit_cast(ctx.fpr[12])); + ctx.set_vfpu_scalar_bits_ct<1u>(ctx.gpr[4]); + { const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + ctx.execute_vfpu_vscl_ct<0u, 0u, 1u, 3u>(); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(104))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(580))); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(20))); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(7752))); + ctx.fpr[12] = std::bit_cast(std::bit_cast(ctx.fpr[12]) ^ 0x80000000u); + ctx.fpr[12] = ctx.fpr[13] - ctx.fpr[12]; + ctx.fpr[14] = ctx.fpr[14] + ctx.fpr[12]; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(104), std::bit_cast(ctx.fpr[14])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(96))); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + ctx.gpr[31] = (0x089590F4u); + ctx.gpr[4] = (ctx.gpr[18] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 4u, 0x08860094u>(ctx, &aot_mem) && ctx.pc == 0x089590F4u) goto SB_L_089590F4; + TIER2_SB_RETURN(); + +SB_L_089590F4: + ctx.gpr[5] = (ctx.gpr[17] + static_cast(16)); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(568))); + ctx.gpr[4] = (ctx.gpr[19] | 0u); + ctx.gpr[31] = (0x08959108u); + ctx.gpr[6] = (0u | 48u); + if (rt.invoke_chained_direct<&recomp_unit_0054_entry, 54u, 498u, 0x088DF9D0u>(ctx, &aot_mem) && ctx.pc == 0x08959108u) goto SB_L_08959108; + TIER2_SB_RETURN(); + +SB_L_08959108: + ctx.gpr[4] = (ctx.gpr[19] | 0u); + ctx.gpr[5] = (0u | 59u); + ctx.gpr[31] = (0x08959118u); + ctx.gpr[6] = (ctx.gpr[18] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0083_entry, 83u, 830u, 0x08953B30u>(ctx, &aot_mem) && ctx.pc == 0x08959118u) goto SB_L_08959118; + TIER2_SB_RETURN(); + +SB_L_08959118: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(80))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(256), std::bit_cast(ctx.fpr[12])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(84))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(260), std::bit_cast(ctx.fpr[12])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(88))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(264), std::bit_cast(ctx.fpr[12])); + { const std::uint32_t vfpu_address = ctx.gpr[23] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(572))); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(16); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(32); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(48); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix_ct<36u, 3u>(vfpu_matrix); + ctx.read_vfpu_vector_ct<1u, 3u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 3u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_result); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<7u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] + vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } + ctx.gpr[4] = (ctx.gpr[29] + static_cast(384)); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(384))); + ctx.gpr[4] = (std::bit_cast(ctx.fpr[12])); + ctx.set_vfpu_scalar_bits_ct<0u>(ctx.gpr[4]); + { float vfpu_value[4]{}; + ctx.write_vfpu_vector_with_destination_prefix_ct<32u, 1u>(vfpu_value); } + ctx.execute_vfpu_vf2h_ct<64u, 0u, 2u>(); + ctx.gpr[4] = (ctx.vfpu_scalar_bits_ct<64u>()); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(4), static_cast(ctx.gpr[4])); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(388))); + ctx.gpr[4] = (std::bit_cast(ctx.fpr[13])); + ctx.set_vfpu_scalar_bits_ct<0u>(ctx.gpr[4]); + { float vfpu_value[4]{}; + ctx.write_vfpu_vector_with_destination_prefix_ct<32u, 1u>(vfpu_value); } + ctx.execute_vfpu_vf2h_ct<64u, 0u, 2u>(); + ctx.gpr[4] = (ctx.vfpu_scalar_bits_ct<64u>()); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(6), static_cast(ctx.gpr[4])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(392))); + ctx.gpr[4] = (std::bit_cast(ctx.fpr[12])); + ctx.set_vfpu_scalar_bits_ct<0u>(ctx.gpr[4]); + { float vfpu_value[4]{}; + ctx.write_vfpu_vector_with_destination_prefix_ct<32u, 1u>(vfpu_value); } + ctx.execute_vfpu_vf2h_ct<64u, 0u, 2u>(); + ctx.gpr[4] = (ctx.vfpu_scalar_bits_ct<64u>()); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(8), static_cast(ctx.gpr[4])); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(344))); + ctx.gpr[4] = (ctx.gpr[4] & 1u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_089591D0; + } + goto SB_L_089591BC; + } + +SB_L_089591BC: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(336))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_089591D0; + } + goto SB_L_089591C8; + } + +SB_L_089591C8: + ctx.gpr[31] = (0x089591D0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(336))); + if (rt.invoke_chained_direct<&recomp_unit_0117_entry, 117u, 129u, 0x089D89E0u>(ctx, &aot_mem) && ctx.pc == 0x089591D0u) goto SB_L_089591D0; + TIER2_SB_RETURN(); + +SB_L_089591D0: + ctx.gpr[17] = (ctx.gpr[17] + static_cast(68)); + { const bool branch_taken = 0u == 0u; + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(504))); + if (branch_taken) { + goto SB_L_08958FC4; + } + goto SB_L_089591DC; + } + +SB_L_089591DC: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(516))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(512))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(548))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + ctx.gpr[6] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[6]) ? 1u : 0u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(516), ctx.gpr[4]); + { const bool branch_taken = ctx.gpr[6] != 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(512), ctx.gpr[5]); + if (branch_taken) { + goto SB_L_08958FA4; + } + goto SB_L_08959200; + } + +SB_L_08959200: + ctx.gpr[4] = (0u | 11u); + ctx.gpr[31] = (0x0895920Cu); + ctx.gpr[5] = (0u | 1u); + if (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 203u, 0x08861668u>(ctx, &aot_mem) && ctx.pc == 0x0895920Cu) goto SB_L_0895920C; + TIER2_SB_RETURN(); + +SB_L_0895920C: + ctx.gpr[4] = (0u | 8u); + ctx.gpr[31] = (0x08959218u); + ctx.gpr[5] = (0u | 5u); + if (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 203u, 0x08861668u>(ctx, &aot_mem) && ctx.pc == 0x08959218u) goto SB_L_08959218; + TIER2_SB_RETURN(); + +SB_L_08959218: + ctx.gpr[4] = (0u | 9u); + ctx.gpr[31] = (0x08959224u); + ctx.gpr[5] = (0u | 6u); + if (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 203u, 0x08861668u>(ctx, &aot_mem) && ctx.pc == 0x08959224u) goto SB_L_08959224; + TIER2_SB_RETURN(); + +SB_L_08959224: + ctx.gpr[31] = (0x0895922Cu); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0044_entry, 44u, 665u, 0x088B7AD8u>(ctx, &aot_mem) && ctx.pc == 0x0895922Cu) goto SB_L_0895922C; + TIER2_SB_RETURN(); + +SB_L_0895922C: + ctx.gpr[31] = (0x08959234u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0044_entry, 44u, 668u, 0x088B7B30u>(ctx, &aot_mem) && ctx.pc == 0x08959234u) goto SB_L_08959234; + TIER2_SB_RETURN(); + +SB_L_08959234: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(580))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + ctx.fpr[12] = std::bit_cast(ctx.gpr[5]); + ctx.fpr[12] = static_cast(static_cast(std::bit_cast(ctx.fpr[12]))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(12))); + ctx.fpr[13] = std::bit_cast(ctx.gpr[4]); + ctx.fpr[13] = static_cast(static_cast(std::bit_cast(ctx.fpr[13]))); + ctx.gpr[31] = (0x08959258u); + ctx.gpr[4] = (ctx.gpr[29] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0083_entry, 83u, 823u, 0x08953A08u>(ctx, &aot_mem) && ctx.pc == 0x08959258u) goto SB_L_08959258; + TIER2_SB_RETURN(); + +SB_L_08959258: + { const std::uint32_t vfpu_address = ctx.gpr[29] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = -vfpu_s[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } + ctx.gpr[4] = (ctx.gpr[29] + static_cast(112)); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.gpr[4] = (2236u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(29552)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-23440))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(508), ctx.gpr[4]); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[5] + static_cast(11016))); + { const float fs = ctx.fpr[12]; const float ft = ctx.fpr[20]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[12] = std::bit_cast(0x7FC00000u); else ctx.fpr[12] = fs * ft; } + ctx.fpr[12] = std::bit_cast(ctx.fpu_float_to_word_ct<1u>(ctx.fpr[12])); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[4] = (0u | 0u); + ctx.gpr[6] = (static_cast(ctx.gpr[5]) < 0 ? 1u : 0u); + { const bool branch_taken = ctx.gpr[6] != 0u; + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(556))); + if (branch_taken) { + goto SB_L_089592AC; + } + goto SB_L_08959298; + } + +SB_L_08959298: + ctx.gpr[4] = (ctx.gpr[5] | 0u); + ctx.gpr[5] = (0u | 255u); + ctx.gpr[5] = (static_cast(ctx.gpr[5]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + if (ctx.gpr[5] != 0u) { + ctx.gpr[4] = (0u | 255u); + goto SB_L_089592AC; + } + goto SB_L_089592AC; + +SB_L_089592AC: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-23440))); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[5] + static_cast(11008))); + { const float fs = ctx.fpr[12]; const float ft = ctx.fpr[20]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[12] = std::bit_cast(0x7FC00000u); else ctx.fpr[12] = fs * ft; } + ctx.fpr[12] = std::bit_cast(ctx.fpu_float_to_word_ct<1u>(ctx.fpr[12])); + ctx.gpr[6] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[7] = (static_cast(ctx.gpr[6]) < 0 ? 1u : 0u); + { const bool branch_taken = ctx.gpr[7] != 0u; + ctx.gpr[5] = (0u | 0u); + if (branch_taken) { + goto SB_L_089592E0; + } + goto SB_L_089592CC; + } + +SB_L_089592CC: + ctx.gpr[5] = (ctx.gpr[6] | 0u); + ctx.gpr[6] = (0u | 255u); + ctx.gpr[6] = (static_cast(ctx.gpr[6]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + if (ctx.gpr[6] != 0u) { + ctx.gpr[5] = (0u | 255u); + goto SB_L_089592E0; + } + goto SB_L_089592E0; + +SB_L_089592E0: + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-23440))); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[6] + static_cast(11012))); + { const float fs = ctx.fpr[12]; const float ft = ctx.fpr[20]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[12] = std::bit_cast(0x7FC00000u); else ctx.fpr[12] = fs * ft; } + ctx.fpr[12] = std::bit_cast(ctx.fpu_float_to_word_ct<1u>(ctx.fpr[12])); + ctx.gpr[6] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[8] = (static_cast(ctx.gpr[6]) < 0 ? 1u : 0u); + { const bool branch_taken = ctx.gpr[8] != 0u; + ctx.gpr[7] = (0u | 0u); + if (branch_taken) { + goto SB_L_08959314; + } + goto SB_L_08959300; + } + +SB_L_08959300: + ctx.gpr[7] = (ctx.gpr[6] | 0u); + ctx.gpr[6] = (0u | 255u); + ctx.gpr[6] = (static_cast(ctx.gpr[6]) < static_cast(ctx.gpr[7]) ? 1u : 0u); + if (ctx.gpr[6] != 0u) { + ctx.gpr[7] = (0u | 255u); + goto SB_L_08959314; + } + goto SB_L_08959314; + +SB_L_08959314: + ctx.gpr[6] = (ctx.gpr[7] << 8u); + ctx.gpr[5] = (ctx.gpr[5] << 16u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[28] + static_cast(9004), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); + ctx.gpr[5] = (5888u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(1)); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (23808u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(255)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(9004))); + ctx.gpr[7] = (23552u << 16u); + ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(8544))); + ctx.gpr[7] = (21504u << 16u); + ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (51200u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(2)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (51457u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(256)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (39680u << 16u); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(500))); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_089593F0; + } + goto SB_L_089593E8; + } + +SB_L_089593E8: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11764))); + aot_mem.aot_store32(ctx.gpr[21] + static_cast(11768), ctx.gpr[4]); + goto SB_L_089593F0; + +SB_L_089593F0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(588))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + ctx.fpr[12] = std::bit_cast(ctx.gpr[5]); + ctx.fpr[12] = static_cast(static_cast(std::bit_cast(ctx.fpr[12]))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(12))); + ctx.fpr[13] = std::bit_cast(ctx.gpr[4]); + ctx.fpr[13] = static_cast(static_cast(std::bit_cast(ctx.fpr[13]))); + ctx.gpr[31] = (0x08959414u); + ctx.gpr[4] = (ctx.gpr[29] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0083_entry, 83u, 823u, 0x08953A08u>(ctx, &aot_mem) && ctx.pc == 0x08959414u) goto SB_L_08959414; + TIER2_SB_RETURN(); + +SB_L_08959414: + { const std::uint32_t vfpu_address = ctx.gpr[29] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = -vfpu_s[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } + ctx.gpr[16] = (ctx.gpr[29] + static_cast(128)); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[16] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.gpr[17] = (ctx.gpr[29] + static_cast(144)); + ctx.gpr[5] = (2246u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(1408)); + ctx.gpr[31] = (0x08959438u); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0022_entry, 22u, 912u, 0x0885F828u>(ctx, &aot_mem) && ctx.pc == 0x08959438u) goto SB_L_08959438; + TIER2_SB_RETURN(); + +SB_L_08959438: + ctx.gpr[18] = (ctx.gpr[29] + static_cast(80)); + ctx.gpr[4] = (ctx.gpr[18] | 0u); + ctx.gpr[5] = (ctx.gpr[17] | 0u); + ctx.gpr[31] = (0x0895944Cu); + ctx.gpr[6] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0083_entry, 83u, 812u, 0x08953934u>(ctx, &aot_mem) && ctx.pc == 0x0895944Cu) goto SB_L_0895944C; + TIER2_SB_RETURN(); + +SB_L_0895944C: + ctx.gpr[4] = (ctx.gpr[29] + static_cast(64)); + ctx.gpr[31] = (0x08959458u); + ctx.gpr[5] = (ctx.gpr[18] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0083_entry, 83u, 814u, 0x0895397Cu>(ctx, &aot_mem) && ctx.pc == 0x08959458u) goto SB_L_08959458; + TIER2_SB_RETURN(); + +SB_L_08959458: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(64))); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(68))); + ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(72))); + ctx.gpr[31] = (0x0895946Cu); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 4u, 0x08860094u>(ctx, &aot_mem) && ctx.pc == 0x0895946Cu) goto SB_L_0895946C; + TIER2_SB_RETURN(); + +SB_L_0895946C: + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[18] = (ctx.gpr[4] + static_cast(8)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[18]); + ctx.gpr[4] = (15360u << 16u); + aot_mem.aot_store32(ctx.gpr[18] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + ctx.gpr[5] = (0u | 61u); + ctx.gpr[31] = (0x089594A0u); + ctx.gpr[6] = (ctx.gpr[17] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0083_entry, 83u, 830u, 0x08953B30u>(ctx, &aot_mem) && ctx.pc == 0x089594A0u) goto SB_L_089594A0; + TIER2_SB_RETURN(); + +SB_L_089594A0: + ctx.gpr[4] = (2816u << 16u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (ctx.gpr[18] + static_cast(-8)); + ctx.gpr[6] = (15u << 16u); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[4] >> 8u); + ctx.gpr[5] = (ctx.gpr[5] & ctx.gpr[6]); + ctx.gpr[6] = (4096u << 16u); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(20), ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[6] = (256u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(-1)); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (ctx.gpr[4] & ctx.gpr[6]); + ctx.gpr[7] = (2048u << 16u); + ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (0u | 3u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(580))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(4), ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(584))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(4), ctx.gpr[4]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(608))); + ctx.gpr[5] = (ctx.gpr[18] | 0u); + { const bool branch_taken = static_cast(ctx.gpr[6]) <= 0; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(560), ctx.gpr[5]); + if (branch_taken) { + goto SB_L_08959F54; + } + goto SB_L_0895952C; + } + +SB_L_0895952C: + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(588))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(8))); + ctx.gpr[6] = (static_cast(0u) < static_cast(ctx.gpr[6]) ? 1u : 0u); + ctx.gpr[6] = (ctx.gpr[6] & 255u); + { const bool branch_taken = ctx.gpr[6] == 0u; + // nop + if (branch_taken) { + goto SB_L_08959F54; + } + goto SB_L_08959544; + } + +SB_L_08959544: + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(588))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(4), ctx.gpr[4]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(592))); + ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[6] + static_cast(0))); + { const bool branch_taken = ctx.gpr[6] == 0u; + // nop + if (branch_taken) { + goto SB_L_08959564; + } + goto SB_L_0895955C; + } + +SB_L_0895955C: + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(592))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(4), ctx.gpr[4]); + goto SB_L_08959564; + +SB_L_08959564: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(608))); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < 255 ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895957C; + } + goto SB_L_08959574; + } + +SB_L_08959574: + { const bool branch_taken = 0u == 0u; + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(608))); + if (branch_taken) { + goto SB_L_08959598; + } + goto SB_L_0895957C; + } + +SB_L_0895957C: + ctx.gpr[4] = (0u | 255u); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(608))); + ctx.gpr[6] = (0u | 512u); + ctx.gpr[22] = (ctx.gpr[6] - ctx.gpr[22]); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[22]) ? 1u : 0u); + if (ctx.gpr[4] != 0u) { + ctx.gpr[22] = (0u | 255u); + goto SB_L_08959598; + } + goto SB_L_08959598; + +SB_L_08959598: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(564))); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<36u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(16); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<37u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(32); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<38u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(48); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<39u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(64); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<40u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(80); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<41u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(96); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<42u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(112); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<43u, 4u>(vfpu_value); } + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(588))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(32))); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[19]); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(580))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(32))); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[19]); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(544))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(548))); + ctx.gpr[20] = (ctx.gpr[4] | 0u); + ctx.gpr[6] = (static_cast(ctx.gpr[20]) < static_cast(ctx.gpr[6]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[6] == 0u; + ctx.gpr[23] = (ctx.gpr[28] + static_cast(-17792)); + if (branch_taken) { + goto SB_L_08959E54; + } + goto SB_L_089595F4; + } + +SB_L_089595F4: + ctx.gpr[6] = (2236u << 16u); + ctx.gpr[7] = (256u << 16u); + ctx.gpr[7] = (ctx.gpr[7] + static_cast(-1)); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(32304)); + ctx.gpr[8] = (2560u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(48)); + ctx.gpr[5] = (ctx.gpr[5] & ctx.gpr[7]); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[8]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(528), ctx.gpr[6]); + ctx.gpr[6] = (ctx.gpr[4] << 2u); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(532), ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[21] + ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(540), ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(536), ctx.gpr[4]); + goto SB_L_08959630; + +SB_L_08959630: + ctx.gpr[30] = (static_cast(ctx.gpr[20]) < 6 ? 1u : 0u); + if (ctx.gpr[30] == 0u) { + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(528))); + goto SB_L_08959654; + } + goto SB_L_0895963C; + +SB_L_0895963C: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[31] = (0x0895964Cu); + ctx.gpr[6] = (ctx.gpr[20] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x089557E8u>(ctx)) { + ctx.pc = 0x089557E8u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x0895964Cu; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_089557E8; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 318u, 0x089557E8u>(ctx, &aot_mem) && ctx.pc == 0x0895964Cu) goto SB_L_0895964C; + TIER2_SB_RETURN(); + +SB_L_0895964C: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08959658; + } + goto SB_L_08959654; + } + +SB_L_08959654: + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<27u, 4u>(vfpu_value); } + goto SB_L_08959658; + +SB_L_08959658: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(540))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(588))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(32))); + ctx.gpr[5] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(12))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(580))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(32))); + ctx.gpr[4] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(12))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(608))); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < 255 ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08959A24; + } + goto SB_L_0895968C; + } + +SB_L_0895968C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(560))); + ctx.gpr[5] = (15u << 16u); + ctx.gpr[4] = (ctx.gpr[4] >> 8u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); + ctx.gpr[6] = (4096u << 16u); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(20), ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[6]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(532))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[6]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[29] + static_cast(128)); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(552))); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + goto SB_L_089596E4; + +SB_L_089596E4: + { const bool branch_taken = ctx.gpr[16] != ctx.gpr[18]; + // nop + if (branch_taken) { + goto SB_L_089596F4; + } + goto SB_L_089596EC; + } + +SB_L_089596EC: + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_089599B4; + } + goto SB_L_089596F4; + } + +SB_L_089596F4: + { const bool branch_taken = ctx.gpr[16] == ctx.gpr[18]; + // nop + if (branch_taken) { + goto SB_L_0895975C; + } + goto SB_L_089596FC; + } + +SB_L_089596FC: + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_08959720; + } + goto SB_L_08959704; + } + +SB_L_08959704: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32767u); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[5] = (ctx.gpr[5] & 32767u); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895975C; + } + goto SB_L_08959720; + } + +SB_L_08959720: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08959750; + } + goto SB_L_08959738; + } + +SB_L_08959738: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[5] = (ctx.gpr[16] | 0u); + ctx.gpr[6] = (ctx.gpr[20] | 0u); + ctx.gpr[7] = (ctx.gpr[22] | 0u); + ctx.gpr[31] = (0x08959750u); + ctx.gpr[8] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08955444u>(ctx)) { + ctx.pc = 0x08955444u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08959750u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08955444; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 285u, 0x08955444u>(ctx, &aot_mem) && ctx.pc == 0x08959750u) goto SB_L_08959750; + TIER2_SB_RETURN(); + +SB_L_08959750: + ctx.gpr[16] = (ctx.gpr[16] + static_cast(68)); + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_089596F4; + } + goto SB_L_0895975C; + } + +SB_L_0895975C: + { const bool branch_taken = ctx.gpr[30] != 0u; + // nop + if (branch_taken) { + goto SB_L_0895986C; + } + goto SB_L_08959764; + } + +SB_L_08959764: + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_089597CC; + } + goto SB_L_0895976C; + } + +SB_L_0895976C: + { const bool branch_taken = ctx.gpr[16] == ctx.gpr[18]; + // nop + if (branch_taken) { + goto SB_L_08959790; + } + goto SB_L_08959774; + } + +SB_L_08959774: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32767u); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[5] = (ctx.gpr[5] & 32767u); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_089597CC; + } + goto SB_L_08959790; + } + +SB_L_08959790: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_089597C0; + } + goto SB_L_089597A8; + } + +SB_L_089597A8: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[5] = (ctx.gpr[17] | 0u); + ctx.gpr[6] = (ctx.gpr[20] | 0u); + ctx.gpr[7] = (0u | 255u); + ctx.gpr[31] = (0x089597C0u); + ctx.gpr[8] = (0u | 1u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08955444u>(ctx)) { + ctx.pc = 0x08955444u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x089597C0u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08955444; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 285u, 0x08955444u>(ctx, &aot_mem) && ctx.pc == 0x089597C0u) goto SB_L_089597C0; + TIER2_SB_RETURN(); + +SB_L_089597C0: + ctx.gpr[17] = (ctx.gpr[17] + static_cast(68)); + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08959764; + } + goto SB_L_089597CC; + } + +SB_L_089597CC: + { const bool branch_taken = ctx.gpr[16] == ctx.gpr[18]; + // nop + if (branch_taken) { + goto SB_L_089599AC; + } + goto SB_L_089597D4; + } + +SB_L_089597D4: + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_089599AC; + } + goto SB_L_089597DC; + } + +SB_L_089597DC: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32767u); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[5] = (ctx.gpr[5] & 32767u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_089599AC; + } + goto SB_L_089597F4; + } + +SB_L_089597F4: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_0895982C; + } + goto SB_L_0895980C; + } + +SB_L_0895980C: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[5] = (ctx.gpr[16] | 0u); + ctx.gpr[6] = (ctx.gpr[20] | 0u); + ctx.gpr[7] = (0u | 255u); + ctx.gpr[31] = (0x08959824u); + ctx.gpr[8] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08955444u>(ctx)) { + ctx.pc = 0x08955444u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08959824u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08955444; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 285u, 0x08955444u>(ctx, &aot_mem) && ctx.pc == 0x08959824u) goto SB_L_08959824; + TIER2_SB_RETURN(); + +SB_L_08959824: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_0895985C; + } + goto SB_L_0895982C; + } + +SB_L_0895982C: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_0895985C; + } + goto SB_L_08959844; + } + +SB_L_08959844: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[5] = (ctx.gpr[16] | 0u); + ctx.gpr[6] = (ctx.gpr[20] | 0u); + ctx.gpr[7] = (ctx.gpr[22] | 0u); + ctx.gpr[31] = (0x0895985Cu); + ctx.gpr[8] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08955444u>(ctx)) { + ctx.pc = 0x08955444u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x0895985Cu; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08955444; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 285u, 0x08955444u>(ctx, &aot_mem) && ctx.pc == 0x0895985Cu) goto SB_L_0895985C; + TIER2_SB_RETURN(); + +SB_L_0895985C: + ctx.gpr[16] = (ctx.gpr[16] + static_cast(68)); + ctx.gpr[17] = (ctx.gpr[17] + static_cast(68)); + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_089597CC; + } + goto SB_L_0895986C; + } + +SB_L_0895986C: + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_089598F0; + } + goto SB_L_08959874; + } + +SB_L_08959874: + { const bool branch_taken = ctx.gpr[16] == ctx.gpr[18]; + // nop + if (branch_taken) { + goto SB_L_08959898; + } + goto SB_L_0895987C; + } + +SB_L_0895987C: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32767u); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[5] = (ctx.gpr[5] & 32767u); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_089598F0; + } + goto SB_L_08959898; + } + +SB_L_08959898: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_089598E4; + } + goto SB_L_089598B0; + } + +SB_L_089598B0: + ctx.set_vfpu_scalar_bits_ct<12u>(aot_mem.aot_load32(ctx.gpr[17] + static_cast(4))); + ctx.set_vfpu_scalar_bits_ct<44u>(aot_mem.aot_load32(ctx.gpr[17] + static_cast(8))); + ctx.set_vfpu_scalar_bits_ct<76u>(aot_mem.aot_load32(ctx.gpr[23] + static_cast(0))); + ctx.execute_vfpu_vh2f_ct<21u, 12u, 2u>(); + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<117u, 1u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<76u, 1u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = vfpu_s[i] * vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<117u, 1u>(vfpu_d); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix_ct<36u, 4u>(vfpu_matrix); + ctx.read_vfpu_vector_ct<21u, 4u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 4u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix_ct<14u, 4u>(vfpu_result); } + ctx.vfpu_ctrl[1u] = 0x000000FFu; + ctx.execute_vfpu_vcmp_ct<14u, 21u, 4u, 3u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 5u) & 1u) == 0u; + // nop + if (branch_taken) { + goto SB_L_089598E4; + } + goto SB_L_089598D8; + } + +SB_L_089598D8: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[31] = (0x089598E4u); + ctx.gpr[5] = (ctx.gpr[17] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x089554A8u>(ctx)) { + ctx.pc = 0x089554A8u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x089598E4u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_089554A8; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 288u, 0x089554A8u>(ctx, &aot_mem) && ctx.pc == 0x089598E4u) goto SB_L_089598E4; + TIER2_SB_RETURN(); + +SB_L_089598E4: + ctx.gpr[17] = (ctx.gpr[17] + static_cast(68)); + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_0895986C; + } + goto SB_L_089598F0; + } + +SB_L_089598F0: + { const bool branch_taken = ctx.gpr[16] == ctx.gpr[18]; + // nop + if (branch_taken) { + goto SB_L_089599AC; + } + goto SB_L_089598F8; + } + +SB_L_089598F8: + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_089599AC; + } + goto SB_L_08959900; + } + +SB_L_08959900: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32767u); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[5] = (ctx.gpr[5] & 32767u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_089599AC; + } + goto SB_L_08959918; + } + +SB_L_08959918: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_0895996C; + } + goto SB_L_08959930; + } + +SB_L_08959930: + ctx.set_vfpu_scalar_bits_ct<12u>(aot_mem.aot_load32(ctx.gpr[17] + static_cast(4))); + ctx.set_vfpu_scalar_bits_ct<44u>(aot_mem.aot_load32(ctx.gpr[17] + static_cast(8))); + ctx.set_vfpu_scalar_bits_ct<76u>(aot_mem.aot_load32(ctx.gpr[23] + static_cast(0))); + ctx.execute_vfpu_vh2f_ct<21u, 12u, 2u>(); + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<117u, 1u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<76u, 1u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = vfpu_s[i] * vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<117u, 1u>(vfpu_d); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix_ct<36u, 4u>(vfpu_matrix); + ctx.read_vfpu_vector_ct<21u, 4u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 4u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix_ct<14u, 4u>(vfpu_result); } + ctx.vfpu_ctrl[1u] = 0x000000FFu; + ctx.execute_vfpu_vcmp_ct<14u, 21u, 4u, 3u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 5u) & 1u) == 0u; + // nop + if (branch_taken) { + goto SB_L_08959964; + } + goto SB_L_08959958; + } + +SB_L_08959958: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[31] = (0x08959964u); + ctx.gpr[5] = (ctx.gpr[17] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x089554A8u>(ctx)) { + ctx.pc = 0x089554A8u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08959964u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_089554A8; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 288u, 0x089554A8u>(ctx, &aot_mem) && ctx.pc == 0x08959964u) goto SB_L_08959964; + TIER2_SB_RETURN(); + +SB_L_08959964: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_0895999C; + } + goto SB_L_0895996C; + } + +SB_L_0895996C: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_0895999C; + } + goto SB_L_08959984; + } + +SB_L_08959984: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[5] = (ctx.gpr[16] | 0u); + ctx.gpr[6] = (ctx.gpr[20] | 0u); + ctx.gpr[7] = (ctx.gpr[22] | 0u); + ctx.gpr[31] = (0x0895999Cu); + ctx.gpr[8] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08955444u>(ctx)) { + ctx.pc = 0x08955444u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x0895999Cu; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08955444; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 285u, 0x08955444u>(ctx, &aot_mem) && ctx.pc == 0x0895999Cu) goto SB_L_0895999C; + TIER2_SB_RETURN(); + +SB_L_0895999C: + ctx.gpr[16] = (ctx.gpr[16] + static_cast(68)); + ctx.gpr[17] = (ctx.gpr[17] + static_cast(68)); + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_089598F0; + } + goto SB_L_089599AC; + } + +SB_L_089599AC: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_089596E4; + } + goto SB_L_089599B4; + } + +SB_L_089599B4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(1464))); + ctx.gpr[5] = (256u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(-1)); + ctx.gpr[6] = (15u << 16u); + ctx.gpr[5] = (ctx.gpr[4] & ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[4] >> 8u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[6]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); + ctx.gpr[7] = (4096u << 16u); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(20), ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[7]); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[7] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[7] = (2560u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[29] + static_cast(112)); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(552))); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08959D5C; + } + goto SB_L_08959A24; + } + +SB_L_08959A24: + { const bool branch_taken = ctx.gpr[16] != ctx.gpr[18]; + // nop + if (branch_taken) { + goto SB_L_08959A34; + } + goto SB_L_08959A2C; + } + +SB_L_08959A2C: + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_08959D5C; + } + goto SB_L_08959A34; + } + +SB_L_08959A34: + { const bool branch_taken = ctx.gpr[30] != 0u; + // nop + if (branch_taken) { + goto SB_L_08959BAC; + } + goto SB_L_08959A3C; + } + +SB_L_08959A3C: + { const bool branch_taken = ctx.gpr[16] == ctx.gpr[18]; + // nop + if (branch_taken) { + goto SB_L_08959AA4; + } + goto SB_L_08959A44; + } + +SB_L_08959A44: + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_08959A68; + } + goto SB_L_08959A4C; + } + +SB_L_08959A4C: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32767u); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[5] = (ctx.gpr[5] & 32767u); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08959AA4; + } + goto SB_L_08959A68; + } + +SB_L_08959A68: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08959A98; + } + goto SB_L_08959A80; + } + +SB_L_08959A80: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[5] = (ctx.gpr[16] | 0u); + ctx.gpr[6] = (ctx.gpr[20] | 0u); + ctx.gpr[7] = (0u | 255u); + ctx.gpr[31] = (0x08959A98u); + ctx.gpr[8] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08955444u>(ctx)) { + ctx.pc = 0x08955444u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08959A98u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08955444; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 285u, 0x08955444u>(ctx, &aot_mem) && ctx.pc == 0x08959A98u) goto SB_L_08959A98; + TIER2_SB_RETURN(); + +SB_L_08959A98: + ctx.gpr[16] = (ctx.gpr[16] + static_cast(68)); + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08959A3C; + } + goto SB_L_08959AA4; + } + +SB_L_08959AA4: + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_08959B0C; + } + goto SB_L_08959AAC; + } + +SB_L_08959AAC: + { const bool branch_taken = ctx.gpr[16] == ctx.gpr[18]; + // nop + if (branch_taken) { + goto SB_L_08959AD0; + } + goto SB_L_08959AB4; + } + +SB_L_08959AB4: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32767u); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[5] = (ctx.gpr[5] & 32767u); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08959B0C; + } + goto SB_L_08959AD0; + } + +SB_L_08959AD0: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08959B00; + } + goto SB_L_08959AE8; + } + +SB_L_08959AE8: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[5] = (ctx.gpr[17] | 0u); + ctx.gpr[6] = (ctx.gpr[20] | 0u); + ctx.gpr[7] = (ctx.gpr[22] | 0u); + ctx.gpr[31] = (0x08959B00u); + ctx.gpr[8] = (0u | 1u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08955444u>(ctx)) { + ctx.pc = 0x08955444u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08959B00u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08955444; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 285u, 0x08955444u>(ctx, &aot_mem) && ctx.pc == 0x08959B00u) goto SB_L_08959B00; + TIER2_SB_RETURN(); + +SB_L_08959B00: + ctx.gpr[17] = (ctx.gpr[17] + static_cast(68)); + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08959AA4; + } + goto SB_L_08959B0C; + } + +SB_L_08959B0C: + { const bool branch_taken = ctx.gpr[16] == ctx.gpr[18]; + // nop + if (branch_taken) { + goto SB_L_08959D54; + } + goto SB_L_08959B14; + } + +SB_L_08959B14: + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_08959D54; + } + goto SB_L_08959B1C; + } + +SB_L_08959B1C: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32767u); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[5] = (ctx.gpr[5] & 32767u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08959D54; + } + goto SB_L_08959B34; + } + +SB_L_08959B34: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08959B6C; + } + goto SB_L_08959B4C; + } + +SB_L_08959B4C: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[5] = (ctx.gpr[16] | 0u); + ctx.gpr[6] = (ctx.gpr[20] | 0u); + ctx.gpr[7] = (0u | 255u); + ctx.gpr[31] = (0x08959B64u); + ctx.gpr[8] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08955444u>(ctx)) { + ctx.pc = 0x08955444u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08959B64u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08955444; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 285u, 0x08955444u>(ctx, &aot_mem) && ctx.pc == 0x08959B64u) goto SB_L_08959B64; + TIER2_SB_RETURN(); + +SB_L_08959B64: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08959B9C; + } + goto SB_L_08959B6C; + } + +SB_L_08959B6C: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08959B9C; + } + goto SB_L_08959B84; + } + +SB_L_08959B84: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[5] = (ctx.gpr[16] | 0u); + ctx.gpr[6] = (ctx.gpr[20] | 0u); + ctx.gpr[7] = (ctx.gpr[22] | 0u); + ctx.gpr[31] = (0x08959B9Cu); + ctx.gpr[8] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08955444u>(ctx)) { + ctx.pc = 0x08955444u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08959B9Cu; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08955444; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 285u, 0x08955444u>(ctx, &aot_mem) && ctx.pc == 0x08959B9Cu) goto SB_L_08959B9C; + TIER2_SB_RETURN(); + +SB_L_08959B9C: + ctx.gpr[16] = (ctx.gpr[16] + static_cast(68)); + ctx.gpr[17] = (ctx.gpr[17] + static_cast(68)); + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08959B0C; + } + goto SB_L_08959BAC; + } + +SB_L_08959BAC: + { const bool branch_taken = ctx.gpr[16] == ctx.gpr[18]; + // nop + if (branch_taken) { + goto SB_L_08959C30; + } + goto SB_L_08959BB4; + } + +SB_L_08959BB4: + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_08959BD8; + } + goto SB_L_08959BBC; + } + +SB_L_08959BBC: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32767u); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[5] = (ctx.gpr[5] & 32767u); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08959C30; + } + goto SB_L_08959BD8; + } + +SB_L_08959BD8: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08959C24; + } + goto SB_L_08959BF0; + } + +SB_L_08959BF0: + ctx.set_vfpu_scalar_bits_ct<12u>(aot_mem.aot_load32(ctx.gpr[16] + static_cast(4))); + ctx.set_vfpu_scalar_bits_ct<44u>(aot_mem.aot_load32(ctx.gpr[16] + static_cast(8))); + ctx.set_vfpu_scalar_bits_ct<76u>(aot_mem.aot_load32(ctx.gpr[23] + static_cast(0))); + ctx.execute_vfpu_vh2f_ct<21u, 12u, 2u>(); + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<117u, 1u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<76u, 1u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = vfpu_s[i] * vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<117u, 1u>(vfpu_d); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix_ct<36u, 4u>(vfpu_matrix); + ctx.read_vfpu_vector_ct<21u, 4u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 4u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix_ct<14u, 4u>(vfpu_result); } + ctx.vfpu_ctrl[1u] = 0x000000FFu; + ctx.execute_vfpu_vcmp_ct<14u, 21u, 4u, 3u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 5u) & 1u) == 0u; + // nop + if (branch_taken) { + goto SB_L_08959C24; + } + goto SB_L_08959C18; + } + +SB_L_08959C18: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[31] = (0x08959C24u); + ctx.gpr[5] = (ctx.gpr[16] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x089554A8u>(ctx)) { + ctx.pc = 0x089554A8u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08959C24u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_089554A8; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 288u, 0x089554A8u>(ctx, &aot_mem) && ctx.pc == 0x08959C24u) goto SB_L_08959C24; + TIER2_SB_RETURN(); + +SB_L_08959C24: + ctx.gpr[16] = (ctx.gpr[16] + static_cast(68)); + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08959BAC; + } + goto SB_L_08959C30; + } + +SB_L_08959C30: + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_08959C98; + } + goto SB_L_08959C38; + } + +SB_L_08959C38: + { const bool branch_taken = ctx.gpr[16] == ctx.gpr[18]; + // nop + if (branch_taken) { + goto SB_L_08959C5C; + } + goto SB_L_08959C40; + } + +SB_L_08959C40: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32767u); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[5] = (ctx.gpr[5] & 32767u); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08959C98; + } + goto SB_L_08959C5C; + } + +SB_L_08959C5C: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08959C8C; + } + goto SB_L_08959C74; + } + +SB_L_08959C74: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[5] = (ctx.gpr[17] | 0u); + ctx.gpr[6] = (ctx.gpr[20] | 0u); + ctx.gpr[7] = (ctx.gpr[22] | 0u); + ctx.gpr[31] = (0x08959C8Cu); + ctx.gpr[8] = (0u | 1u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08955444u>(ctx)) { + ctx.pc = 0x08955444u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08959C8Cu; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08955444; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 285u, 0x08955444u>(ctx, &aot_mem) && ctx.pc == 0x08959C8Cu) goto SB_L_08959C8C; + TIER2_SB_RETURN(); + +SB_L_08959C8C: + ctx.gpr[17] = (ctx.gpr[17] + static_cast(68)); + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08959C30; + } + goto SB_L_08959C98; + } + +SB_L_08959C98: + { const bool branch_taken = ctx.gpr[16] == ctx.gpr[18]; + // nop + if (branch_taken) { + goto SB_L_08959D54; + } + goto SB_L_08959CA0; + } + +SB_L_08959CA0: + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_08959D54; + } + goto SB_L_08959CA8; + } + +SB_L_08959CA8: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32767u); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[5] = (ctx.gpr[5] & 32767u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08959D54; + } + goto SB_L_08959CC0; + } + +SB_L_08959CC0: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08959D14; + } + goto SB_L_08959CD8; + } + +SB_L_08959CD8: + ctx.set_vfpu_scalar_bits_ct<12u>(aot_mem.aot_load32(ctx.gpr[16] + static_cast(4))); + ctx.set_vfpu_scalar_bits_ct<44u>(aot_mem.aot_load32(ctx.gpr[16] + static_cast(8))); + ctx.set_vfpu_scalar_bits_ct<76u>(aot_mem.aot_load32(ctx.gpr[23] + static_cast(0))); + ctx.execute_vfpu_vh2f_ct<21u, 12u, 2u>(); + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<117u, 1u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<76u, 1u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = vfpu_s[i] * vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<117u, 1u>(vfpu_d); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix_ct<36u, 4u>(vfpu_matrix); + ctx.read_vfpu_vector_ct<21u, 4u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 4u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix_ct<14u, 4u>(vfpu_result); } + ctx.vfpu_ctrl[1u] = 0x000000FFu; + ctx.execute_vfpu_vcmp_ct<14u, 21u, 4u, 3u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 5u) & 1u) == 0u; + // nop + if (branch_taken) { + goto SB_L_08959D0C; + } + goto SB_L_08959D00; + } + +SB_L_08959D00: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[31] = (0x08959D0Cu); + ctx.gpr[5] = (ctx.gpr[16] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x089554A8u>(ctx)) { + ctx.pc = 0x089554A8u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08959D0Cu; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_089554A8; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 288u, 0x089554A8u>(ctx, &aot_mem) && ctx.pc == 0x08959D0Cu) goto SB_L_08959D0C; + TIER2_SB_RETURN(); + +SB_L_08959D0C: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08959D44; + } + goto SB_L_08959D14; + } + +SB_L_08959D14: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08959D44; + } + goto SB_L_08959D2C; + } + +SB_L_08959D2C: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[5] = (ctx.gpr[16] | 0u); + ctx.gpr[6] = (ctx.gpr[20] | 0u); + ctx.gpr[7] = (ctx.gpr[22] | 0u); + ctx.gpr[31] = (0x08959D44u); + ctx.gpr[8] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08955444u>(ctx)) { + ctx.pc = 0x08955444u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08959D44u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08955444; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 285u, 0x08955444u>(ctx, &aot_mem) && ctx.pc == 0x08959D44u) goto SB_L_08959D44; + TIER2_SB_RETURN(); + +SB_L_08959D44: + ctx.gpr[16] = (ctx.gpr[16] + static_cast(68)); + ctx.gpr[17] = (ctx.gpr[17] + static_cast(68)); + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08959C98; + } + goto SB_L_08959D54; + } + +SB_L_08959D54: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08959A24; + } + goto SB_L_08959D5C; + } + +SB_L_08959D5C: + { const bool branch_taken = ctx.gpr[30] != 0u; + // nop + if (branch_taken) { + goto SB_L_08959DE4; + } + goto SB_L_08959D64; + } + +SB_L_08959D64: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(536))); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(11748)))))); + ctx.gpr[5] = (0u | 1u); + ctx.gpr[14] = (0u | 7u); + { const bool branch_taken = static_cast(ctx.gpr[4]) < 0; + ctx.gpr[15] = (0u | 255u); + if (branch_taken) { + goto SB_L_08959DDC; + } + goto SB_L_08959D7C; + } + +SB_L_08959D7C: + ctx.gpr[6] = (ctx.gpr[4] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[6]); + ctx.gpr[4] = (ctx.gpr[4] << 2u); + ctx.gpr[4] = (ctx.gpr[21] + ctx.gpr[4]); + ctx.gpr[6] = (ctx.gpr[4] + static_cast(8148)); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + aot_mem.aot_store32(ctx.gpr[7] + static_cast(0), std::bit_cast(ctx.fpr[12])); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + aot_mem.aot_store32(ctx.gpr[7] + static_cast(4), ctx.gpr[6]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + aot_mem.aot_store8(ctx.gpr[6] + static_cast(8), static_cast(ctx.gpr[14])); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + aot_mem.aot_store8(ctx.gpr[6] + static_cast(9), static_cast(ctx.gpr[15])); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + aot_mem.aot_store8(ctx.gpr[6] + static_cast(10), static_cast(0u)); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + aot_mem.aot_store8(ctx.gpr[6] + static_cast(11), static_cast(ctx.gpr[5])); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(12)); + aot_mem.aot_store32(ctx.gpr[21] + static_cast(11768), ctx.gpr[6]); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(8152)))))); + { const bool branch_taken = static_cast(ctx.gpr[4]) >= 0; + // nop + if (branch_taken) { + goto SB_L_08959D7C; + } + goto SB_L_08959DDC; + } + +SB_L_08959DDC: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08959E1C; + } + goto SB_L_08959DE4; + } + +SB_L_08959DE4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(536))); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(11748)))))); + { const bool branch_taken = static_cast(ctx.gpr[4]) < 0; + // nop + if (branch_taken) { + goto SB_L_08959E1C; + } + goto SB_L_08959DF4; + } + +SB_L_08959DF4: + ctx.gpr[5] = (ctx.gpr[4] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[4] << 2u); + ctx.gpr[18] = (ctx.gpr[21] + ctx.gpr[4]); + ctx.gpr[5] = (ctx.gpr[18] + static_cast(8148)); + ctx.gpr[31] = (0x08959E10u); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08957228u>(ctx)) { + ctx.pc = 0x08957228u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08959E10u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08957228; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 681u, 0x08957228u>(ctx, &aot_mem) && ctx.pc == 0x08959E10u) goto SB_L_08959E10; + TIER2_SB_RETURN(); + +SB_L_08959E10: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[18] + static_cast(8152)))))); + { const bool branch_taken = static_cast(ctx.gpr[4]) >= 0; + // nop + if (branch_taken) { + goto SB_L_08959DF4; + } + goto SB_L_08959E1C; + } + +SB_L_08959E1C: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[31] = (0x08959E2Cu); + ctx.gpr[6] = (ctx.gpr[20] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08955ACCu>(ctx)) { + ctx.pc = 0x08955ACCu; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08959E2Cu; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08955ACC; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 329u, 0x08955ACCu>(ctx, &aot_mem) && ctx.pc == 0x08959E2Cu) goto SB_L_08959E2C; + TIER2_SB_RETURN(); + +SB_L_08959E2C: + ctx.gpr[20] = (ctx.gpr[20] + static_cast(1)); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(540))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(536))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(548))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(2)); + ctx.gpr[6] = (static_cast(ctx.gpr[20]) < static_cast(ctx.gpr[6]) ? 1u : 0u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(540), ctx.gpr[4]); + { const bool branch_taken = ctx.gpr[6] != 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(536), ctx.gpr[5]); + if (branch_taken) { + goto SB_L_08959630; + } + goto SB_L_08959E54; + } + +SB_L_08959E54: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(496))); + ctx.gpr[5] = (7424u << 16u); + aot_mem.aot_store8(ctx.gpr[21] + static_cast(1472), static_cast(0u)); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (57088u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(50)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (57344u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (57600u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (59136u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.fpr[12] = std::bit_cast(0u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[21] + static_cast(1468), std::bit_cast(ctx.fpr[12])); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[6] + static_cast(16))); + ctx.fpr[12] = ctx.fpr[13] + ctx.fpr[12]; + ctx.gpr[4] = (18176u << 16u); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (50944u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (23808u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(255)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (56319u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4103)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_0895A298; + } + goto SB_L_08959F54; + } + +SB_L_08959F54: + ctx.gpr[31] = (0x08959F5Cu); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x0895742Cu>(ctx)) { + ctx.pc = 0x0895742Cu; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08959F5Cu; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_0895742C; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 693u, 0x0895742Cu>(ctx, &aot_mem) && ctx.pc == 0x08959F5Cu) goto SB_L_08959F5C; + TIER2_SB_RETURN(); + +SB_L_08959F5C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(564))); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<36u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(16); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<37u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(32); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<38u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(48); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<39u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(64); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<40u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(80); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<41u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(96); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<42u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(112); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<43u, 4u>(vfpu_value); } + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(580))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(32))); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[19]); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(544))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(548))); + ctx.gpr[18] = (ctx.gpr[4] | 0u); + ctx.gpr[5] = (static_cast(ctx.gpr[18]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[5] == 0u; + ctx.gpr[20] = (0u | 7u); + if (branch_taken) { + goto SB_L_0895A1B8; + } + goto SB_L_08959FA8; + } + +SB_L_08959FA8: + ctx.gpr[23] = (0u | 255u); + ctx.gpr[19] = (0u | 1u); + ctx.gpr[22] = (ctx.gpr[28] + static_cast(-17792)); + ctx.gpr[5] = (2236u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(32304)); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(48)); + ctx.gpr[6] = (ctx.gpr[4] << 2u); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(528), ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[21] + ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(524), ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(520), ctx.gpr[4]); + goto SB_L_08959FD8; + +SB_L_08959FD8: + ctx.gpr[30] = (static_cast(ctx.gpr[18]) < 6 ? 1u : 0u); + if (ctx.gpr[30] == 0u) { + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(528))); + goto SB_L_08959FFC; + } + goto SB_L_08959FE4; + +SB_L_08959FE4: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[31] = (0x08959FF4u); + ctx.gpr[6] = (ctx.gpr[18] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x089557E8u>(ctx)) { + ctx.pc = 0x089557E8u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08959FF4u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_089557E8; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 318u, 0x089557E8u>(ctx, &aot_mem) && ctx.pc == 0x08959FF4u) goto SB_L_08959FF4; + TIER2_SB_RETURN(); + +SB_L_08959FF4: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_0895A000; + } + goto SB_L_08959FFC; + } + +SB_L_08959FFC: + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<27u, 4u>(vfpu_value); } + goto SB_L_0895A000; + +SB_L_0895A000: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(524))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(580))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(32))); + ctx.gpr[4] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(12))); + { const bool branch_taken = ctx.gpr[30] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895A084; + } + goto SB_L_0895A01C; + } + +SB_L_0895A01C: + { const bool branch_taken = ctx.gpr[16] == ctx.gpr[17]; + // nop + if (branch_taken) { + goto SB_L_0895A0C8; + } + goto SB_L_0895A024; + } + +SB_L_0895A024: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_0895A070; + } + goto SB_L_0895A03C; + } + +SB_L_0895A03C: + ctx.set_vfpu_scalar_bits_ct<12u>(aot_mem.aot_load32(ctx.gpr[16] + static_cast(4))); + ctx.set_vfpu_scalar_bits_ct<44u>(aot_mem.aot_load32(ctx.gpr[16] + static_cast(8))); + ctx.set_vfpu_scalar_bits_ct<76u>(aot_mem.aot_load32(ctx.gpr[22] + static_cast(0))); + ctx.execute_vfpu_vh2f_ct<21u, 12u, 2u>(); + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<117u, 1u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<76u, 1u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = vfpu_s[i] * vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<117u, 1u>(vfpu_d); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix_ct<36u, 4u>(vfpu_matrix); + ctx.read_vfpu_vector_ct<21u, 4u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 4u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix_ct<14u, 4u>(vfpu_result); } + ctx.vfpu_ctrl[1u] = 0x000000FFu; + ctx.execute_vfpu_vcmp_ct<14u, 21u, 4u, 3u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 5u) & 1u) == 0u; + // nop + if (branch_taken) { + goto SB_L_0895A070; + } + goto SB_L_0895A064; + } + +SB_L_0895A064: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[31] = (0x0895A070u); + ctx.gpr[5] = (ctx.gpr[16] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x089554A8u>(ctx)) { + ctx.pc = 0x089554A8u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x0895A070u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_089554A8; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 288u, 0x089554A8u>(ctx, &aot_mem) && ctx.pc == 0x0895A070u) goto SB_L_0895A070; + TIER2_SB_RETURN(); + +SB_L_0895A070: + ctx.gpr[16] = (ctx.gpr[16] + static_cast(68)); + { const bool branch_taken = ctx.gpr[16] != ctx.gpr[17]; + // nop + if (branch_taken) { + goto SB_L_0895A024; + } + goto SB_L_0895A07C; + } + +SB_L_0895A07C: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_0895A0C8; + } + goto SB_L_0895A084; + } + +SB_L_0895A084: + { const bool branch_taken = ctx.gpr[16] == ctx.gpr[17]; + // nop + if (branch_taken) { + goto SB_L_0895A0C8; + } + goto SB_L_0895A08C; + } + +SB_L_0895A08C: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_0895A0BC; + } + goto SB_L_0895A0A4; + } + +SB_L_0895A0A4: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[5] = (ctx.gpr[16] | 0u); + ctx.gpr[6] = (ctx.gpr[18] | 0u); + ctx.gpr[7] = (0u | 255u); + ctx.gpr[31] = (0x0895A0BCu); + ctx.gpr[8] = (0u | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08955444u>(ctx)) { + ctx.pc = 0x08955444u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x0895A0BCu; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08955444; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 285u, 0x08955444u>(ctx, &aot_mem) && ctx.pc == 0x0895A0BCu) goto SB_L_0895A0BC; + TIER2_SB_RETURN(); + +SB_L_0895A0BC: + ctx.gpr[16] = (ctx.gpr[16] + static_cast(68)); + { const bool branch_taken = ctx.gpr[16] != ctx.gpr[17]; + // nop + if (branch_taken) { + goto SB_L_0895A08C; + } + goto SB_L_0895A0C8; + } + +SB_L_0895A0C8: + { const bool branch_taken = ctx.gpr[30] != 0u; + // nop + if (branch_taken) { + goto SB_L_0895A148; + } + goto SB_L_0895A0D0; + } + +SB_L_0895A0D0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(520))); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(11748)))))); + { const bool branch_taken = static_cast(ctx.gpr[4]) < 0; + // nop + if (branch_taken) { + goto SB_L_0895A140; + } + goto SB_L_0895A0E0; + } + +SB_L_0895A0E0: + ctx.gpr[5] = (ctx.gpr[4] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[4] << 2u); + ctx.gpr[4] = (ctx.gpr[21] + ctx.gpr[4]); + ctx.gpr[5] = (ctx.gpr[4] + static_cast(8148)); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), std::bit_cast(ctx.fpr[12])); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(4), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + aot_mem.aot_store8(ctx.gpr[5] + static_cast(8), static_cast(ctx.gpr[20])); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + aot_mem.aot_store8(ctx.gpr[5] + static_cast(9), static_cast(ctx.gpr[23])); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + aot_mem.aot_store8(ctx.gpr[5] + static_cast(10), static_cast(0u)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + aot_mem.aot_store8(ctx.gpr[5] + static_cast(11), static_cast(ctx.gpr[19])); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(12)); + aot_mem.aot_store32(ctx.gpr[21] + static_cast(11768), ctx.gpr[5]); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(8152)))))); + { const bool branch_taken = static_cast(ctx.gpr[4]) >= 0; + // nop + if (branch_taken) { + goto SB_L_0895A0E0; + } + goto SB_L_0895A140; + } + +SB_L_0895A140: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_0895A180; + } + goto SB_L_0895A148; + } + +SB_L_0895A148: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(520))); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(11748)))))); + { const bool branch_taken = static_cast(ctx.gpr[4]) < 0; + // nop + if (branch_taken) { + goto SB_L_0895A180; + } + goto SB_L_0895A158; + } + +SB_L_0895A158: + ctx.gpr[5] = (ctx.gpr[4] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[4] << 2u); + ctx.gpr[17] = (ctx.gpr[21] + ctx.gpr[4]); + ctx.gpr[5] = (ctx.gpr[17] + static_cast(8148)); + ctx.gpr[31] = (0x0895A174u); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08957228u>(ctx)) { + ctx.pc = 0x08957228u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x0895A174u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08957228; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 681u, 0x08957228u>(ctx, &aot_mem) && ctx.pc == 0x0895A174u) goto SB_L_0895A174; + TIER2_SB_RETURN(); + +SB_L_0895A174: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(8152)))))); + { const bool branch_taken = static_cast(ctx.gpr[4]) >= 0; + // nop + if (branch_taken) { + goto SB_L_0895A158; + } + goto SB_L_0895A180; + } + +SB_L_0895A180: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[31] = (0x0895A190u); + ctx.gpr[6] = (ctx.gpr[18] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08955ACCu>(ctx)) { + ctx.pc = 0x08955ACCu; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x0895A190u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08955ACC; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 329u, 0x08955ACCu>(ctx, &aot_mem) && ctx.pc == 0x0895A190u) goto SB_L_0895A190; + TIER2_SB_RETURN(); + +SB_L_0895A190: + ctx.gpr[18] = (ctx.gpr[18] + static_cast(1)); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(524))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(520))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(548))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(2)); + ctx.gpr[6] = (static_cast(ctx.gpr[18]) < static_cast(ctx.gpr[6]) ? 1u : 0u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(524), ctx.gpr[4]); + { const bool branch_taken = ctx.gpr[6] != 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(520), ctx.gpr[5]); + if (branch_taken) { + goto SB_L_08959FD8; + } + goto SB_L_0895A1B8; + } + +SB_L_0895A1B8: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(496))); + ctx.gpr[5] = (7424u << 16u); + aot_mem.aot_store8(ctx.gpr[21] + static_cast(1472), static_cast(0u)); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (57088u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(50)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (57344u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (57600u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (59136u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.fpr[12] = std::bit_cast(0u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[21] + static_cast(1468), std::bit_cast(ctx.fpr[12])); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[6] + static_cast(16))); + ctx.fpr[12] = ctx.fpr[13] + ctx.fpr[12]; + ctx.gpr[4] = (18176u << 16u); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (50944u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (56319u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4103)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + goto SB_L_0895A298; + +SB_L_0895A298: + ctx.gpr[4] = (0u | 2u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(500))); + { const bool branch_taken = ctx.gpr[5] != ctx.gpr[4]; + // nop + if (branch_taken) { + goto SB_L_0895A598; + } + goto SB_L_0895A2A8; + } + +SB_L_0895A2A8: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11764))); + ctx.gpr[4] = (ctx.gpr[4] - ctx.gpr[5]); + ctx.gpr[5] = (0u | 12u); + { const std::int32_t dividend = static_cast(ctx.gpr[4]); const std::int32_t divisor = static_cast(ctx.gpr[5]); if (divisor == 0) { ctx.lo = dividend >= 0 ? 0xFFFFFFFFu : 1u; ctx.hi = static_cast(dividend); } else if (dividend == static_cast(0x80000000u) && divisor == -1) { ctx.lo = 0x80000000u; ctx.hi = 0u; } else { ctx.lo = static_cast(dividend / divisor); ctx.hi = static_cast(dividend % divisor); } } + ctx.gpr[17] = (ctx.lo); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-17716))); + ctx.gpr[4] = (static_cast(ctx.gpr[17]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + if (ctx.gpr[4] != 0u) { + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-17716))); + goto SB_L_0895A2D0; + } + goto SB_L_0895A2D0; + +SB_L_0895A2D0: + aot_mem.aot_store32(ctx.gpr[28] + static_cast(-17716), ctx.gpr[17]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11764))); + ctx.gpr[31] = (0x0895A2E0u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + if (rt.invoke_chained_direct<&recomp_unit_0217_entry, 217u, 754u, 0x08B6BD34u>(ctx, &aot_mem) && ctx.pc == 0x0895A2E0u) goto SB_L_0895A2E0; + TIER2_SB_RETURN(); + +SB_L_0895A2E0: + ctx.gpr[17] = (0u + static_cast(-1)); + ctx.gpr[18] = (0u | 255u); + ctx.gpr[19] = (0u | 240u); + ctx.gpr[22] = (0u | 0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(564))); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<36u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(16); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<37u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(32); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<38u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(48); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<39u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(64); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<40u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(80); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<41u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(96); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<42u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(112); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<43u, 4u>(vfpu_value); } + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11764))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + { const bool branch_taken = ctx.gpr[16] == ctx.gpr[4]; + ctx.gpr[4] = (256u << 16u); + if (branch_taken) { + goto SB_L_0895A598; + } + goto SB_L_0895A324; + } + +SB_L_0895A324: + ctx.gpr[4] = (ctx.gpr[4] + static_cast(-1)); + ctx.gpr[5] = (2560u << 16u); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(560))); + ctx.gpr[4] = (ctx.gpr[6] & ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[5]); + ctx.gpr[23] = (0u | 7u); + ctx.gpr[30] = (56319u << 16u); + ctx.gpr[30] = (ctx.gpr[30] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(532), ctx.gpr[4]); + goto SB_L_0895A348; + +SB_L_0895A348: + ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(10))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); + ctx.gpr[4] = (4096u << 16u); + ctx.gpr[10] = (15u << 16u); + { const bool branch_taken = ctx.gpr[6] == ctx.gpr[22]; + ctx.gpr[11] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(552))); + if (branch_taken) { + goto SB_L_0895A414; + } + goto SB_L_0895A360; + } + +SB_L_0895A360: + ctx.gpr[22] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(10))); + { const bool branch_taken = ctx.gpr[22] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895A3BC; + } + goto SB_L_0895A36C; + } + +SB_L_0895A36C: + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(560))); + ctx.gpr[6] = (ctx.gpr[6] >> 8u); + ctx.gpr[6] = (ctx.gpr[6] & ctx.gpr[10]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(20), ctx.gpr[6]); + ctx.gpr[4] = (ctx.gpr[6] | ctx.gpr[4]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(532))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[6]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[29] + static_cast(128)); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + 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[11] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_0895A414; + } + goto SB_L_0895A3BC; + } + +SB_L_0895A3BC: + ctx.gpr[6] = (256u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(-1)); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(1464))); + ctx.gpr[6] = (ctx.gpr[7] & ctx.gpr[6]); + ctx.gpr[7] = (ctx.gpr[7] >> 8u); + ctx.gpr[7] = (ctx.gpr[7] & ctx.gpr[10]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(20), ctx.gpr[7]); + ctx.gpr[4] = (ctx.gpr[7] | ctx.gpr[4]); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[7] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + ctx.gpr[7] = (2560u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[6]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[29] + static_cast(112)); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + 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[11] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + goto SB_L_0895A414; + +SB_L_0895A414: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(9))); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[18]; + // nop + if (branch_taken) { + goto SB_L_0895A464; + } + goto SB_L_0895A420; + } + +SB_L_0895A420: + ctx.gpr[4] = (23808u << 16u); + ctx.gpr[18] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(9))); + ctx.gpr[4] = (ctx.gpr[18] | ctx.gpr[4]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[18] + static_cast(-16)); + ctx.gpr[6] = (static_cast(ctx.gpr[4]) < 0 ? 1u : 0u); + { const bool branch_taken = ctx.gpr[6] != 0u; + ctx.gpr[19] = (0u | 0u); + if (branch_taken) { + goto SB_L_0895A464; + } + goto SB_L_0895A450; + } + +SB_L_0895A450: + ctx.gpr[19] = (ctx.gpr[4] | 0u); + ctx.gpr[4] = (0u | 240u); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[19]) ? 1u : 0u); + if (ctx.gpr[4] != 0u) { + ctx.gpr[19] = (0u | 240u); + goto SB_L_0895A464; + } + goto SB_L_0895A464; + +SB_L_0895A464: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(8))); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[17]; + // nop + if (branch_taken) { + goto SB_L_0895A49C; + } + goto SB_L_0895A470; + } + +SB_L_0895A470: + ctx.gpr[4] = (0u + static_cast(-1)); + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[4]; + // nop + if (branch_taken) { + goto SB_L_0895A488; + } + goto SB_L_0895A47C; + } + +SB_L_0895A47C: + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[31] = (0x0895A488u); + ctx.gpr[6] = (ctx.gpr[17] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08955ACCu>(ctx)) { + ctx.pc = 0x08955ACCu; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x0895A488u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08955ACC; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 329u, 0x08955ACCu>(ctx, &aot_mem) && ctx.pc == 0x0895A488u) goto SB_L_0895A488; + TIER2_SB_RETURN(); + +SB_L_0895A488: + ctx.gpr[17] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(8))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[31] = (0x0895A49Cu); + ctx.gpr[6] = (ctx.gpr[17] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x089557E8u>(ctx)) { + ctx.pc = 0x089557E8u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x0895A49Cu; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_089557E8; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 318u, 0x089557E8u>(ctx, &aot_mem) && ctx.pc == 0x0895A49Cu) goto SB_L_0895A49C; + TIER2_SB_RETURN(); + +SB_L_0895A49C: + { const bool branch_taken = ctx.gpr[17] != ctx.gpr[23]; + // nop + if (branch_taken) { + goto SB_L_0895A4D0; + } + goto SB_L_0895A4A4; + } + +SB_L_0895A4A4: + ctx.gpr[4] = (56319u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(7)); + ctx.gpr[5] = (ctx.gpr[19] << 8u); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + goto SB_L_0895A4D0; + +SB_L_0895A4D0: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(11))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895A4F0; + } + goto SB_L_0895A4DC; + } + +SB_L_0895A4DC: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(4))); + ctx.gpr[31] = (0x0895A4E8u); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08957228u>(ctx)) { + ctx.pc = 0x08957228u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x0895A4E8u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08957228; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 681u, 0x08957228u>(ctx, &aot_mem) && ctx.pc == 0x0895A4E8u) goto SB_L_0895A4E8; + TIER2_SB_RETURN(); + +SB_L_0895A4E8: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_0895A508; + } + goto SB_L_0895A4F0; + } + +SB_L_0895A4F0: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(4))); + ctx.set_vfpu_scalar_bits_ct<12u>(aot_mem.aot_load32(ctx.gpr[5] + static_cast(4))); + ctx.set_vfpu_scalar_bits_ct<44u>(aot_mem.aot_load32(ctx.gpr[5] + static_cast(8))); + ctx.execute_vfpu_vh2f_ct<21u, 12u, 2u>(); + ctx.gpr[31] = (0x0895A508u); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x089554A8u>(ctx)) { + ctx.pc = 0x089554A8u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x0895A508u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_089554A8; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 288u, 0x089554A8u>(ctx, &aot_mem) && ctx.pc == 0x0895A508u) goto SB_L_0895A508; + TIER2_SB_RETURN(); + +SB_L_0895A508: + { const bool branch_taken = ctx.gpr[17] != ctx.gpr[23]; + // nop + if (branch_taken) { + goto SB_L_0895A588; + } + goto SB_L_0895A510; + } + +SB_L_0895A510: + aot_mem.aot_store32(ctx.gpr[29] + static_cast(568), ctx.gpr[23]); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[23] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[19] << 8u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[30]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(572), ctx.gpr[30]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[23] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[23] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (59136u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(1)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[23] + static_cast(0))); + ctx.gpr[30] = (ctx.gpr[4] - ctx.gpr[20]); + ctx.gpr[4] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[23] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (ctx.gpr[20] | 0u); + ctx.gpr[31] = (0x0895A560u); + ctx.gpr[6] = (ctx.gpr[30] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0088_entry, 88u, 36u, 0x089645DCu>(ctx, &aot_mem) && ctx.pc == 0x0895A560u) goto SB_L_0895A560; + TIER2_SB_RETURN(); + +SB_L_0895A560: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[23] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[30]); + aot_mem.aot_store32(ctx.gpr[23] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (59136u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[23] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[23] + static_cast(0), ctx.gpr[4]); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(568))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(572))); + goto SB_L_0895A588; + +SB_L_0895A588: + ctx.gpr[16] = (ctx.gpr[16] + static_cast(12)); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); + { const bool branch_taken = ctx.gpr[16] != ctx.gpr[4]; + // nop + if (branch_taken) { + goto SB_L_0895A348; + } + goto SB_L_0895A598; + } + +SB_L_0895A598: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); + ctx.gpr[5] = (56319u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4102)); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (59136u << 16u); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + ctx.fpr[12] = std::bit_cast(0u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[21] + static_cast(1468), std::bit_cast(ctx.fpr[12])); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(16))); + ctx.fpr[12] = ctx.fpr[13] + ctx.fpr[12]; + ctx.gpr[5] = (18176u << 16u); + ctx.gpr[6] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[6] = (ctx.gpr[6] >> 8u); + ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (21504u << 16u); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (23808u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(255)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (23808u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(-1)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (16256u << 16u); + ctx.fpr[12] = std::bit_cast(ctx.gpr[6]); + ctx.gpr[6] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[6] = (ctx.gpr[6] >> 8u); + ctx.gpr[7] = (18432u << 16u); + ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[6] = (ctx.gpr[6] >> 8u); + ctx.gpr[7] = (18688u << 16u); + ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (51456u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(256)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(1464))); + ctx.gpr[6] = (256u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(-1)); + ctx.gpr[7] = (15u << 16u); + ctx.gpr[6] = (ctx.gpr[5] & ctx.gpr[6]); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[5] = (ctx.gpr[5] & ctx.gpr[7]); + ctx.gpr[7] = (4096u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(20), ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[7]); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[7] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[7] = (2560u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[29] + static_cast(112)); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(552))); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(216))); + ctx.gpr[4] = (ctx.gpr[4] & 1u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895A72C; + } + goto SB_L_0895A718; + } + +SB_L_0895A718: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(208))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895A72C; + } + goto SB_L_0895A724; + } + +SB_L_0895A724: + ctx.gpr[31] = (0x0895A72Cu); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(208))); + if (rt.invoke_chained_direct<&recomp_unit_0117_entry, 117u, 129u, 0x089D89E0u>(ctx, &aot_mem) && ctx.pc == 0x0895A72Cu) goto SB_L_0895A72C; + TIER2_SB_RETURN(); + +SB_L_0895A72C: + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(576))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(580))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(584))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(588))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(592))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(596))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(600))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(604))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(608))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(612))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(616))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(624)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0085; + +SB_L_0895A760: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-144)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(72), std::bit_cast(ctx.fpr[20])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(76), std::bit_cast(ctx.fpr[22])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(80), std::bit_cast(ctx.fpr[24])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(84), std::bit_cast(ctx.fpr[26])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(88), std::bit_cast(ctx.fpr[28])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(92), std::bit_cast(ctx.fpr[30])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(96), ctx.gpr[16]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(100), ctx.gpr[17]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(104), ctx.gpr[18]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(108), ctx.gpr[19]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(112), ctx.gpr[20]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(116), ctx.gpr[21]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(120), ctx.gpr[22]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(124), ctx.gpr[23]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(128), ctx.gpr[30]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(132), ctx.gpr[31]); + ctx.gpr[6] = (ctx.gpr[6] & 255u); + ctx.gpr[7] = (0u | 0u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(52), ctx.gpr[6]); + aot_mem.aot_store8(ctx.gpr[29] + static_cast(60), static_cast(ctx.gpr[7])); + ctx.gpr[7] = (0u | 0u); + ctx.gpr[16] = (2236u << 16u); + aot_mem.aot_store8(ctx.gpr[29] + static_cast(48), static_cast(ctx.gpr[7])); + ctx.gpr[16] = (ctx.gpr[16] + static_cast(29552)); + ctx.gpr[18] = (ctx.gpr[5] + static_cast(8)); + ctx.fpr[22] = std::bit_cast(0u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] << 3u); + ctx.gpr[7] = (ctx.gpr[5] + ctx.gpr[5]); + ctx.gpr[7] = (ctx.gpr[5] + ctx.gpr[7]); + ctx.gpr[7] = (ctx.gpr[18] + ctx.gpr[7]); + ctx.gpr[30] = (ctx.gpr[7] | 0u); + ctx.gpr[5] = (0u | 0u); + ctx.gpr[23] = (ctx.gpr[4] | 0u); + { const bool branch_taken = ctx.gpr[6] != 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(36), ctx.gpr[5]); + if (branch_taken) { + goto SB_L_0895A86C; + } + goto SB_L_0895A7F4; + } + +SB_L_0895A7F4: + ctx.gpr[4] = (4608u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(277)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (3840u << 16u); + ctx.gpr[4] = (ctx.gpr[7] & ctx.gpr[4]); + ctx.gpr[5] = (ctx.gpr[4] >> 8u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(36), ctx.gpr[4]); + ctx.gpr[4] = (15u << 16u); + ctx.gpr[4] = (ctx.gpr[5] & ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(20), ctx.gpr[4]); + ctx.gpr[5] = (4096u << 16u); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (256u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(-1)); + ctx.gpr[5] = (ctx.gpr[7] & ctx.gpr[5]); + ctx.gpr[6] = (256u << 16u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + goto SB_L_0895A86C; + +SB_L_0895A86C: + aot_mem.aot_store32(ctx.gpr[29] + static_cast(56), ctx.gpr[7]); + ctx.gpr[4] = (0u + static_cast(-1)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(40), ctx.gpr[4]); + ctx.fpr[24] = std::bit_cast(std::bit_cast(ctx.fpr[22])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(44), ctx.gpr[4]); + ctx.fpr[28] = std::bit_cast(std::bit_cast(ctx.fpr[24])); + { const bool branch_taken = ctx.gpr[18] == ctx.gpr[7]; + ctx.gpr[20] = (256u << 16u); + if (branch_taken) { + goto SB_L_0895B2C0; + } + goto SB_L_0895A88C; + } + +SB_L_0895A88C: + ctx.gpr[20] = (ctx.gpr[20] + static_cast(-1)); + ctx.gpr[22] = (255u << 16u); + ctx.gpr[19] = (0u | 1u); + ctx.gpr[4] = (16384u << 16u); + ctx.fpr[26] = std::bit_cast(ctx.gpr[4]); + ctx.gpr[4] = (2236u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(29232)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(68), ctx.gpr[4]); + ctx.gpr[4] = (0u & 255u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(64), ctx.gpr[4]); + goto SB_L_0895A8B4; + +SB_L_0895A8B4: + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[18] + static_cast(0))); + ctx.gpr[8] = (aot_mem.aot_load_word_right(ctx.gpr[18] + static_cast(4), ctx.gpr[8])); + ctx.gpr[8] = (aot_mem.aot_load_word_left(ctx.gpr[18] + static_cast(7), ctx.gpr[8])); + ctx.gpr[9] = (aot_mem.aot_load_word_right(ctx.gpr[18] + static_cast(8), ctx.gpr[9])); + ctx.gpr[9] = (aot_mem.aot_load_word_left(ctx.gpr[18] + static_cast(11), ctx.gpr[9])); + ctx.set_vfpu_scalar_bits_ct<12u>(ctx.gpr[8]); + ctx.set_vfpu_scalar_bits_ct<44u>(ctx.gpr[9]); + ctx.execute_vfpu_vh2f_ct<13u, 12u, 2u>(); + ctx.gpr[8] = (ctx.vfpu_scalar_bits_ct<13u>()); + ctx.gpr[9] = (ctx.vfpu_scalar_bits_ct<45u>()); + ctx.gpr[10] = (ctx.vfpu_scalar_bits_ct<77u>()); + ctx.gpr[11] = (ctx.vfpu_scalar_bits_ct<109u>()); + ctx.fpr[12] = std::bit_cast(ctx.gpr[8]); + ctx.fpr[13] = std::bit_cast(ctx.gpr[9]); + ctx.fpr[20] = std::bit_cast(ctx.gpr[10]); + ctx.fpr[30] = std::bit_cast(ctx.gpr[11]); + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((!(std::isnan(ctx.fpr[24]) || std::isnan(ctx.fpr[12])) && ctx.fpr[24] == ctx.fpr[12])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = ((ctx.fcr31 & 0x00800000u) != 0u); + // nop + if (branch_taken) { + goto SB_L_0895A92C; + } + goto SB_L_0895A904; + } + +SB_L_0895A904: + ctx.fpr[24] = std::bit_cast(std::bit_cast(ctx.fpr[12])); + ctx.gpr[5] = (18432u << 16u); + ctx.gpr[6] = (std::bit_cast(ctx.fpr[24])); + ctx.gpr[6] = (ctx.gpr[6] >> 8u); + ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + goto SB_L_0895A92C; + +SB_L_0895A92C: + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((!(std::isnan(ctx.fpr[28]) || std::isnan(ctx.fpr[13])) && ctx.fpr[28] == ctx.fpr[13])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = ((ctx.fcr31 & 0x00800000u) != 0u); + // nop + if (branch_taken) { + goto SB_L_0895A964; + } + goto SB_L_0895A93C; + } + +SB_L_0895A93C: + ctx.fpr[28] = std::bit_cast(std::bit_cast(ctx.fpr[13])); + ctx.gpr[5] = (18688u << 16u); + ctx.gpr[6] = (std::bit_cast(ctx.fpr[28])); + ctx.gpr[6] = (ctx.gpr[6] >> 8u); + ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + goto SB_L_0895A964; + +SB_L_0895A964: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(40))); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_0895AF54; + } + goto SB_L_0895A970; + } + +SB_L_0895A970: + ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[29] + static_cast(48))); + { const bool branch_taken = ctx.gpr[5] == 0u; + ctx.gpr[5] = (23552u << 16u); + if (branch_taken) { + goto SB_L_0895A998; + } + goto SB_L_0895A97C; + } + +SB_L_0895A97C: + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(9004))); + ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + goto SB_L_0895A998; + +SB_L_0895A998: + ctx.gpr[5] = (0u | 65535u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(40), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_0895AF3C; + } + goto SB_L_0895A9A4; + } + +SB_L_0895A9A4: + ctx.gpr[5] = (ctx.gpr[4] | 0u); + ctx.gpr[31] = (0x0895A9B0u); + ctx.gpr[4] = (ctx.gpr[23] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08956F20u>(ctx)) { + ctx.pc = 0x08956F20u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x0895A9B0u; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08956F20; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 615u, 0x08956F20u>(ctx, &aot_mem) && ctx.pc == 0x0895A9B0u) goto SB_L_0895A9B0; + TIER2_SB_RETURN(); + +SB_L_0895A9B0: + ctx.gpr[4] = (ctx.gpr[23] | 0u); + ctx.gpr[31] = (0x0895A9BCu); + ctx.gpr[5] = (ctx.gpr[2] | 0u); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<84u, 0x08956F40u>(ctx)) { + ctx.pc = 0x08956F40u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x0895A9BCu; + tier2_return_unit[tier2_return_depth] = 85u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08956F40; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 616u, 0x08956F40u>(ctx, &aot_mem) && ctx.pc == 0x0895A9BCu) goto SB_L_0895A9BC; + TIER2_SB_RETURN(); + +SB_L_0895A9BC: + ctx.gpr[21] = (ctx.gpr[2] | 0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(0))); + ctx.gpr[9] = (19200u << 16u); + ctx.gpr[10] = (18944u << 16u); + ctx.gpr[5] = (16000u << 16u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.fpr[14] = std::bit_cast(ctx.gpr[5]); + if (branch_taken) { + goto SB_L_0895AF1C; + } + goto SB_L_0895A9D8; + } + +SB_L_0895A9D8: + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(0))); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(8412))); + { const float fs = ctx.fpr[12]; const float ft = ctx.fpr[20]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[12] = std::bit_cast(0x7FC00000u); else ctx.fpr[12] = fs * ft; } + ctx.gpr[4] = (53248u << 16u); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(4))); + ctx.gpr[6] = (ctx.gpr[6] & 15u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(44))); + { const bool branch_taken = ctx.gpr[6] == ctx.gpr[4]; + // nop + if (branch_taken) { + goto SB_L_0895ABE0; + } + goto SB_L_0895AA1C; + } + +SB_L_0895AA1C: + { const bool branch_taken = ctx.gpr[6] != 0u; + // nop + if (branch_taken) { + goto SB_L_0895AA64; + } + goto SB_L_0895AA24; + } + +SB_L_0895AA24: + ctx.gpr[4] = (std::bit_cast(ctx.fpr[22])); + ctx.gpr[4] = (ctx.gpr[4] >> 8u); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[10]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[22])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[9]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_0895ABDC; + } + goto SB_L_0895AA64; + } + +SB_L_0895AA64: + ctx.fpr[12] = std::bit_cast(std::bit_cast(ctx.fpr[22])); + ctx.fpr[13] = std::bit_cast(std::bit_cast(ctx.fpr[12])); + ctx.gpr[4] = (ctx.gpr[6] >> 2u); + ctx.gpr[4] = (ctx.gpr[4] & 3u); + ctx.gpr[5] = (ctx.gpr[6] & 3u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_0895AA84; + } + goto SB_L_0895AA80; + } + +SB_L_0895AA80: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[23] + static_cast(1476))); + goto SB_L_0895AA84; + +SB_L_0895AA84: + { const bool branch_taken = ctx.gpr[5] != ctx.gpr[19]; + // nop + if (branch_taken) { + goto SB_L_0895AA90; + } + goto SB_L_0895AA8C; + } + +SB_L_0895AA8C: + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[23] + static_cast(1480))); + goto SB_L_0895AA90; + +SB_L_0895AA90: + ctx.gpr[11] = (0u | 2u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[11]; + // nop + if (branch_taken) { + goto SB_L_0895AAB8; + } + goto SB_L_0895AA9C; + } + +SB_L_0895AA9C: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[23] + static_cast(1476))); + { const float fs = ctx.fpr[12]; const float ft = ctx.fpr[26]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[12] = std::bit_cast(0x7FC00000u); else ctx.fpr[12] = fs * ft; } + ctx.fpr[12] = std::bit_cast(ctx.fpu_float_to_word_ct<1u>(ctx.fpr[12])); + ctx.gpr[7] = (std::bit_cast(ctx.fpr[12])); + ctx.fpr[15] = std::bit_cast(ctx.gpr[7]); + ctx.fpr[12] = static_cast(static_cast(std::bit_cast(ctx.fpr[15]))); + { const float fs = ctx.fpr[12]; const float ft = ctx.fpr[14]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[12] = std::bit_cast(0x7FC00000u); else ctx.fpr[12] = fs * ft; } + goto SB_L_0895AAB8; + +SB_L_0895AAB8: + { const bool branch_taken = ctx.gpr[5] != ctx.gpr[11]; + // nop + if (branch_taken) { + goto SB_L_0895AADC; + } + goto SB_L_0895AAC0; + } + +SB_L_0895AAC0: + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[23] + static_cast(1480))); + { const float fs = ctx.fpr[13]; const float ft = ctx.fpr[26]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[13] = std::bit_cast(0x7FC00000u); else ctx.fpr[13] = fs * ft; } + ctx.fpr[13] = std::bit_cast(ctx.fpu_float_to_word_ct<1u>(ctx.fpr[13])); + ctx.gpr[7] = (std::bit_cast(ctx.fpr[13])); + ctx.fpr[15] = std::bit_cast(ctx.gpr[7]); + ctx.fpr[13] = static_cast(static_cast(std::bit_cast(ctx.fpr[15]))); + { const float fs = ctx.fpr[13]; const float ft = ctx.fpr[14]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[13] = std::bit_cast(0x7FC00000u); else ctx.fpr[13] = fs * ft; } + goto SB_L_0895AADC; + +SB_L_0895AADC: + ctx.gpr[11] = (0u | 3u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[11]; + // nop + if (branch_taken) { + goto SB_L_0895AAF0; + } + goto SB_L_0895AAE8; + } + +SB_L_0895AAE8: + { const bool branch_taken = ctx.gpr[5] != ctx.gpr[11]; + // nop + if (branch_taken) { + goto SB_L_0895AB30; + } + goto SB_L_0895AAF0; + } + +SB_L_0895AAF0: + ctx.gpr[4] = (std::bit_cast(ctx.fpr[22])); + ctx.gpr[4] = (ctx.gpr[4] >> 8u); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[10]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[22])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[9]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_0895AB70; + } + goto SB_L_0895AB30; + } + +SB_L_0895AB30: + ctx.gpr[4] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[4] = (ctx.gpr[4] >> 8u); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[10]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[13])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[9]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + aot_mem.aot_store8(ctx.gpr[29] + static_cast(60), static_cast(ctx.gpr[19])); + goto SB_L_0895AB70; + +SB_L_0895AB70: + ctx.gpr[4] = (17279u << 16u); + ctx.fpr[12] = std::bit_cast(ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-23440))); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(11136))); + { const float fs = ctx.fpr[13]; const float ft = ctx.fpr[12]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[12] = std::bit_cast(0x7FC00000u); else ctx.fpr[12] = fs * ft; } + ctx.fpr[12] = std::bit_cast(ctx.fpu_float_to_word_ct<1u>(ctx.fpr[12])); + ctx.gpr[4] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[7] = (static_cast(ctx.gpr[4]) < 0 ? 1u : 0u); + { const bool branch_taken = ctx.gpr[7] != 0u; + ctx.gpr[5] = (0u | 0u); + if (branch_taken) { + goto SB_L_0895ABAC; + } + goto SB_L_0895AB98; + } + +SB_L_0895AB98: + ctx.gpr[5] = (0u | 255u); + ctx.gpr[5] = (static_cast(ctx.gpr[5]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + if (ctx.gpr[5] != 0u) { + ctx.gpr[4] = (0u | 255u); + goto SB_L_0895ABA8; + } + goto SB_L_0895ABA8; + +SB_L_0895ABA8: + ctx.gpr[5] = (ctx.gpr[4] | 0u); + goto SB_L_0895ABAC; + +SB_L_0895ABAC: + ctx.gpr[4] = (1u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(257)); + ctx.gpr[7] = (23552u << 16u); + { const std::int64_t product = static_cast(static_cast(ctx.gpr[5])) * static_cast(static_cast(ctx.gpr[4])); ctx.lo = static_cast(product); ctx.hi = static_cast(static_cast(product) >> 32u); } + ctx.gpr[4] = (ctx.lo); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[7]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + aot_mem.aot_store8(ctx.gpr[29] + static_cast(48), static_cast(ctx.gpr[19])); + goto SB_L_0895ABDC; + +SB_L_0895ABDC: + aot_mem.aot_store32(ctx.gpr[29] + static_cast(44), ctx.gpr[6]); + goto SB_L_0895ABE0; + +SB_L_0895ABE0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(4))); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[4] = (3840u << 16u); + if (branch_taken) { + goto SB_L_0895AEA0; + } + goto SB_L_0895ABEC; + } + +SB_L_0895ABEC: + ctx.gpr[4] = (ctx.gpr[29] + static_cast(12)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[31] = (0x0895ABFCu); + ctx.gpr[6] = (0u | 1024u); + if (rt.invoke_chained_direct<&recomp_unit_0054_entry, 54u, 498u, 0x088DF9D0u>(ctx, &aot_mem) && ctx.pc == 0x0895ABFCu) goto SB_L_0895ABFC; + TIER2_SB_RETURN(); + +SB_L_0895ABFC: + ctx.gpr[4] = (7680u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[5] = (ctx.gpr[5] & 112u); + ctx.gpr[6] = (49664u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(1)); + ctx.gpr[5] = (ctx.gpr[5] >> 4u); + ctx.gpr[5] = (ctx.gpr[5] << 16u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + ctx.gpr[5] = (49920u << 16u); + ctx.gpr[6] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[6] = (ctx.gpr[6] & 7u); + ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[6] = (ctx.gpr[5] & 8u); + ctx.gpr[6] = (ctx.gpr[6] >> 3u); + ctx.gpr[7] = (50944u << 16u); + ctx.gpr[5] = (ctx.gpr[5] & 128u); + ctx.gpr[5] = (ctx.gpr[5] >> 7u); + ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); + ctx.gpr[5] = (ctx.gpr[5] << 8u); + ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + ctx.gpr[5] = (50433u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(-253)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[4] = (ctx.gpr[4] & 7u); + ctx.gpr[13] = (ctx.gpr[4] ^ 4u); + ctx.gpr[13] = (ctx.gpr[13] < static_cast(1) ? 1u : 0u); + ctx.gpr[10] = (0u + static_cast(-16)); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(4))); + ctx.gpr[10] = (ctx.gpr[4] & ctx.gpr[10]); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[17] + static_cast(1)))))); + ctx.gpr[2] = (ctx.gpr[4] & 15u); + ctx.gpr[11] = (ctx.gpr[4] & 240u); + ctx.gpr[11] = (ctx.gpr[11] >> 4u); + ctx.gpr[6] = (ctx.gpr[19] << (ctx.gpr[2] & 31u)); + ctx.gpr[12] = (ctx.gpr[10] & ctx.gpr[20]); + ctx.gpr[3] = (ctx.gpr[10] >> 8u); + { const bool branch_taken = ctx.gpr[13] == 0u; + ctx.gpr[3] = (ctx.gpr[3] & ctx.gpr[22]); + if (branch_taken) { + goto SB_L_0895AD00; + } + goto SB_L_0895ACF0; + } + +SB_L_0895ACF0: + ctx.gpr[4] = (static_cast(static_cast(ctx.gpr[6]) >> 1u)); + ctx.gpr[4] = (ctx.gpr[4] >> 31u); + ctx.gpr[6] = (ctx.gpr[6] + ctx.gpr[4]); + ctx.gpr[6] = (static_cast(static_cast(ctx.gpr[6]) >> 1u)); + goto SB_L_0895AD00; + +SB_L_0895AD00: + ctx.gpr[4] = (static_cast(ctx.gpr[6]) < 16 ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895AD10; + } + goto SB_L_0895AD0C; + } + +SB_L_0895AD0C: + ctx.gpr[6] = (0u | 16u); + goto SB_L_0895AD10; + +SB_L_0895AD10: + ctx.gpr[4] = (0u | 0u); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[5] = (ctx.gpr[5] & 112u); + ctx.gpr[5] = (ctx.gpr[5] >> 4u); + ctx.gpr[5] = (static_cast(ctx.gpr[5]) < 0 ? 1u : 0u); + { const bool branch_taken = ctx.gpr[5] != 0u; + // nop + if (branch_taken) { + goto SB_L_0895ADF4; + } + goto SB_L_0895AD2C; + } + +SB_L_0895AD2C: + ctx.gpr[5] = (ctx.gpr[6] | 0u); + if (ctx.gpr[13] != 0u) { + ctx.gpr[5] = (ctx.gpr[6] + ctx.gpr[6]); + goto SB_L_0895AD38; + } + goto SB_L_0895AD38; + +SB_L_0895AD38: + ctx.gpr[7] = (ctx.gpr[4] + static_cast(160)); + ctx.gpr[7] = (ctx.gpr[7] << 24u); + ctx.gpr[7] = (ctx.gpr[7] | ctx.gpr[12]); + ctx.gpr[8] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + aot_mem.aot_store32(ctx.gpr[8] + static_cast(0), ctx.gpr[7]); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[7] = (ctx.gpr[7] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[7]); + ctx.gpr[8] = (ctx.gpr[4] + static_cast(168)); + ctx.gpr[8] = (ctx.gpr[8] << 24u); + ctx.gpr[5] = (ctx.gpr[8] | ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[3]); + aot_mem.aot_store32(ctx.gpr[7] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[5]); + ctx.gpr[7] = (ctx.gpr[4] + static_cast(184)); + ctx.gpr[7] = (ctx.gpr[7] << 24u); + ctx.gpr[7] = (ctx.gpr[7] | ctx.gpr[2]); + ctx.gpr[8] = (ctx.gpr[11] << 8u); + ctx.gpr[7] = (ctx.gpr[7] | ctx.gpr[8]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[7]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[19] << (ctx.gpr[11] & 31u)); + { const std::int64_t product = static_cast(static_cast(ctx.gpr[6])) * static_cast(static_cast(ctx.gpr[5])); ctx.lo = static_cast(product); ctx.hi = static_cast(static_cast(product) >> 32u); } + ctx.gpr[5] = (ctx.lo); + ctx.gpr[10] = (ctx.gpr[10] + ctx.gpr[5]); + ctx.gpr[2] = (ctx.gpr[2] + static_cast(-1)); + ctx.gpr[11] = (ctx.gpr[11] + static_cast(-1)); + ctx.gpr[5] = (static_cast(ctx.gpr[6]) < 17 ? 1u : 0u); + ctx.gpr[12] = (ctx.gpr[10] & ctx.gpr[20]); + ctx.gpr[3] = (ctx.gpr[10] >> 8u); + { const bool branch_taken = ctx.gpr[5] != 0u; + ctx.gpr[3] = (ctx.gpr[3] & ctx.gpr[22]); + if (branch_taken) { + goto SB_L_0895ADD8; + } + goto SB_L_0895ADC8; + } + +SB_L_0895ADC8: + ctx.gpr[5] = (static_cast(static_cast(ctx.gpr[6]) >> 1u)); + ctx.gpr[5] = (ctx.gpr[5] >> 31u); + ctx.gpr[6] = (ctx.gpr[6] + ctx.gpr[5]); + ctx.gpr[6] = (static_cast(static_cast(ctx.gpr[6]) >> 1u)); + goto SB_L_0895ADD8; + +SB_L_0895ADD8: + ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[5] = (ctx.gpr[5] & 112u); + ctx.gpr[5] = (ctx.gpr[5] >> 4u); + ctx.gpr[5] = (static_cast(ctx.gpr[5]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[5] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895AD2C; + } + goto SB_L_0895ADF4; + } + +SB_L_0895ADF4: + ctx.gpr[4] = (0u | 32u); + if (ctx.gpr[13] != 0u) { + ctx.gpr[4] = (0u | 2u); + goto SB_L_0895AE00; + } + goto SB_L_0895AE00; + +SB_L_0895AE00: + ctx.gpr[5] = (45056u << 16u); + ctx.gpr[5] = (ctx.gpr[12] | ctx.gpr[5]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[6] = (45312u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[5]); + ctx.gpr[6] = (ctx.gpr[3] | ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[6] = (50176u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + ctx.gpr[5] = (51968u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + ctx.gpr[5] = (2816u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[17] = (ctx.gpr[4] - ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(68))); + ctx.gpr[31] = (0x0895AE88u); + ctx.gpr[5] = (ctx.gpr[17] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0174_entry, 174u, 501u, 0x08ABE57Cu>(ctx, &aot_mem) && ctx.pc == 0x0895AE88u) goto SB_L_0895AE88; + TIER2_SB_RETURN(); + +SB_L_0895AE88: + aot_mem.aot_store32(ctx.gpr[21] + static_cast(4), ctx.gpr[2]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[2] | 0u); + ctx.gpr[31] = (0x0895AE9Cu); + ctx.gpr[6] = (ctx.gpr[17] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0088_entry, 88u, 36u, 0x089645DCu>(ctx, &aot_mem) && ctx.pc == 0x0895AE9Cu) goto SB_L_0895AE9C; + TIER2_SB_RETURN(); + +SB_L_0895AE9C: + ctx.gpr[4] = (3840u << 16u); + goto SB_L_0895AEA0; + +SB_L_0895AEA0: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(4))); + ctx.gpr[4] = (ctx.gpr[5] & ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(52))); + { const bool branch_taken = ctx.gpr[5] != 0u; + // nop + if (branch_taken) { + goto SB_L_0895AEC0; + } + goto SB_L_0895AEB4; + } + +SB_L_0895AEB4: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(36))); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_0895AEF0; + } + goto SB_L_0895AEC0; + } + +SB_L_0895AEC0: + ctx.gpr[5] = (15u << 16u); + ctx.gpr[6] = (ctx.gpr[4] >> 8u); + ctx.gpr[5] = (ctx.gpr[6] & ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(36), ctx.gpr[4]); + ctx.gpr[4] = (4096u << 16u); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(20), ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + goto SB_L_0895AEF0; + +SB_L_0895AEF0: + ctx.gpr[4] = (2560u << 16u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(4))); + ctx.gpr[5] = (ctx.gpr[5] & ctx.gpr[20]); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_0895AF34; + } + goto SB_L_0895AF1C; + } + +SB_L_0895AF1C: + ctx.gpr[4] = (7680u << 16u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + goto SB_L_0895AF34; + +SB_L_0895AF34: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_0895AF54; + } + goto SB_L_0895AF3C; + } + +SB_L_0895AF3C: + ctx.gpr[4] = (7680u << 16u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + goto SB_L_0895AF54; + +SB_L_0895AF54: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[18] + static_cast(2)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[5] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[5] == 0u; + ctx.gpr[4] = (1028u << 16u); + if (branch_taken) { + goto SB_L_0895AFC4; + } + goto SB_L_0895AF6C; + } + +SB_L_0895AF6C: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[23] + static_cast(1468))); + ctx.fpr[12] = ctx.fpr[12] + ctx.fpr[26]; + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(16))); + ctx.fpr[12] = ctx.fpr[13] + ctx.fpr[12]; + ctx.gpr[5] = (18176u << 16u); + ctx.gpr[6] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[6] = (ctx.gpr[6] >> 8u); + ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + ctx.gpr[6] = (0u | 1u); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + aot_mem.aot_store8(ctx.gpr[23] + static_cast(1472), static_cast(ctx.gpr[6])); + ctx.gpr[5] = (7424u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(1)); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + goto SB_L_0895AFC4; + +SB_L_0895AFC4: + ctx.gpr[17] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[18] + static_cast(2)))))); + ctx.gpr[17] = (ctx.gpr[17] & 32767u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(52))); + { const bool branch_taken = ctx.gpr[5] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895B228; + } + goto SB_L_0895AFD8; + } + +SB_L_0895AFD8: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(8408))); + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[30])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); + // nop + if (branch_taken) { + goto SB_L_0895B194; + } + goto SB_L_0895AFEC; + } + +SB_L_0895AFEC: + ctx.set_vfpu_scalar_bits_ct<13u>(aot_mem.aot_load32(ctx.gpr[18] + static_cast(12))); + ctx.set_vfpu_scalar_bits_ct<45u>(aot_mem.aot_load32(ctx.gpr[18] + static_cast(16))); + ctx.set_vfpu_scalar_bits_ct<14u>(aot_mem.aot_load32(ctx.gpr[18] + static_cast(20))); + ctx.execute_vfpu_vx2i_ct<12u, 13u, 2u, 3u>(); + ctx.execute_vfpu_vx2i_ct<13u, 14u, 1u, 3u>(); + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_ct<12u, 4u>(vfpu_s); + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_s); + const float vfpu_scale = std::ldexp(1.0f, -static_cast(31u)); + for (std::uint32_t vfpu_i = 0; vfpu_i < 4u; ++vfpu_i) { + const auto vfpu_integer = static_cast(std::bit_cast(vfpu_s[vfpu_i])); + vfpu_d[vfpu_i] = static_cast(vfpu_integer) * vfpu_scale; + } + ctx.write_vfpu_vector_with_destination_prefix_ct<12u, 4u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_ct<13u, 2u>(vfpu_s); + ctx.apply_vfpu_source_prefix_ct<2u, 0u>(vfpu_s); + const float vfpu_scale = std::ldexp(1.0f, -static_cast(31u)); + for (std::uint32_t vfpu_i = 0; vfpu_i < 2u; ++vfpu_i) { + const auto vfpu_integer = static_cast(std::bit_cast(vfpu_s[vfpu_i])); + vfpu_d[vfpu_i] = static_cast(vfpu_integer) * vfpu_scale; + } + ctx.write_vfpu_vector_with_destination_prefix_ct<13u, 2u>(vfpu_d); } + ctx.execute_vfpu_vcmp_ct<52u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<1u, 108u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<1u, 12u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<33u, 13u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<33u, 44u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<65u, 45u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<65u, 76u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<34u, 1u, 52u, 4u>(); + ctx.execute_vfpu_vcmp_ct<34u, 31u, 1u, 7u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) != 0u; + // nop + if (branch_taken) { + goto SB_L_0895B214; + } + goto SB_L_0895B034; + } + +SB_L_0895B034: + ctx.execute_vfpu_vcmp_ct<53u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<1u, 108u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<1u, 12u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<33u, 13u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<33u, 44u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<65u, 45u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<65u, 76u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<34u, 1u, 53u, 4u>(); + ctx.execute_vfpu_vcmp_ct<34u, 31u, 1u, 7u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) != 0u; + // nop + if (branch_taken) { + goto SB_L_0895B214; + } + goto SB_L_0895B060; + } + +SB_L_0895B060: + ctx.execute_vfpu_vcmp_ct<54u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<1u, 108u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<1u, 12u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<33u, 13u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<33u, 44u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<65u, 45u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<65u, 76u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<34u, 1u, 54u, 4u>(); + ctx.execute_vfpu_vcmp_ct<34u, 31u, 1u, 7u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) != 0u; + // nop + if (branch_taken) { + goto SB_L_0895B214; + } + goto SB_L_0895B08C; + } + +SB_L_0895B08C: + ctx.execute_vfpu_vcmp_ct<55u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<1u, 108u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<1u, 12u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<33u, 13u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<33u, 44u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<65u, 45u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<65u, 76u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<34u, 1u, 55u, 4u>(); + ctx.execute_vfpu_vcmp_ct<34u, 31u, 1u, 7u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) != 0u; + // nop + if (branch_taken) { + goto SB_L_0895B214; + } + goto SB_L_0895B0B8; + } + +SB_L_0895B0B8: + ctx.execute_vfpu_vcmp_ct<48u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<0u, 12u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<0u, 108u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<32u, 44u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<32u, 13u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<64u, 76u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<64u, 45u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<2u, 0u, 48u, 4u>(); + ctx.execute_vfpu_vcmp_ct<2u, 31u, 1u, 2u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) == 0u; + // nop + if (branch_taken) { + goto SB_L_0895B168; + } + goto SB_L_0895B0E4; + } + +SB_L_0895B0E4: + ctx.execute_vfpu_vcmp_ct<49u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<0u, 12u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<0u, 108u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<32u, 44u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<32u, 13u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<64u, 76u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<64u, 45u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<2u, 0u, 49u, 4u>(); + ctx.execute_vfpu_vcmp_ct<2u, 31u, 1u, 2u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) == 0u; + // nop + if (branch_taken) { + goto SB_L_0895B168; + } + goto SB_L_0895B110; + } + +SB_L_0895B110: + ctx.execute_vfpu_vcmp_ct<50u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<0u, 12u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<0u, 108u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<32u, 44u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<32u, 13u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<64u, 76u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<64u, 45u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<2u, 0u, 50u, 4u>(); + ctx.execute_vfpu_vcmp_ct<2u, 31u, 1u, 2u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) == 0u; + // nop + if (branch_taken) { + goto SB_L_0895B168; + } + goto SB_L_0895B13C; + } + +SB_L_0895B13C: + ctx.execute_vfpu_vcmp_ct<51u, 31u, 3u, 6u>(); + ctx.execute_vfpu_vcmov_ct<0u, 12u, 1u, 0u, true>(); + ctx.execute_vfpu_vcmov_ct<0u, 108u, 1u, 0u, false>(); + ctx.execute_vfpu_vcmov_ct<32u, 44u, 1u, 1u, true>(); + ctx.execute_vfpu_vcmov_ct<32u, 13u, 1u, 1u, false>(); + ctx.execute_vfpu_vcmov_ct<64u, 76u, 1u, 2u, true>(); + ctx.execute_vfpu_vcmov_ct<64u, 45u, 1u, 2u, false>(); + ctx.execute_vfpu_vhdp_ct<2u, 0u, 51u, 4u>(); + ctx.execute_vfpu_vcmp_ct<2u, 31u, 1u, 2u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) != 0u; + // nop + if (branch_taken) { + goto SB_L_0895B194; + } + goto SB_L_0895B168; + } + +SB_L_0895B168: + ctx.gpr[4] = (ctx.gpr[30] | 0u); + ctx.gpr[31] = (0x0895B174u); + ctx.gpr[5] = (ctx.gpr[17] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0129_entry, 129u, 246u, 0x08A09B2Cu>(ctx, &aot_mem) && ctx.pc == 0x0895B174u) goto SB_L_0895B174; + TIER2_SB_RETURN(); + +SB_L_0895B174: + ctx.gpr[4] = (39680u << 16u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_0895B214; + } + goto SB_L_0895B194; + } + +SB_L_0895B194: + ctx.gpr[5] = (4608u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(277)); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + { const bool branch_taken = ctx.gpr[30] == 0u; + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + if (branch_taken) { + goto SB_L_0895B1FC; + } + goto SB_L_0895B1B4; + } + +SB_L_0895B1B4: + ctx.gpr[5] = (15u << 16u); + ctx.gpr[6] = (ctx.gpr[30] >> 8u); + ctx.gpr[5] = (ctx.gpr[6] & ctx.gpr[5]); + ctx.gpr[6] = (4096u << 16u); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(20), ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + ctx.gpr[6] = (256u << 16u); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + ctx.gpr[7] = (ctx.gpr[30] & ctx.gpr[20]); + ctx.gpr[6] = (ctx.gpr[7] | ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + goto SB_L_0895B1FC; + +SB_L_0895B1FC: + ctx.gpr[4] = (ctx.gpr[17] | ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + goto SB_L_0895B214; + +SB_L_0895B214: + ctx.gpr[4] = (ctx.gpr[17] << 3u); + ctx.gpr[4] = (ctx.gpr[17] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[17] + ctx.gpr[4]); + { const bool branch_taken = 0u == 0u; + ctx.gpr[30] = (ctx.gpr[30] + ctx.gpr[4]); + if (branch_taken) { + goto SB_L_0895B240; + } + goto SB_L_0895B228; + } + +SB_L_0895B228: + ctx.gpr[4] = (ctx.gpr[17] | ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + goto SB_L_0895B240; + +SB_L_0895B240: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[18] + static_cast(2)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32768u); + ctx.gpr[4] = (ctx.gpr[4] >> 15u); + ctx.gpr[4] = (ctx.gpr[4] & 65535u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895B2B0; + } + goto SB_L_0895B258; + } + +SB_L_0895B258: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[23] + static_cast(1468))); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(16))); + ctx.fpr[12] = ctx.fpr[13] + ctx.fpr[12]; + ctx.gpr[4] = (18176u << 16u); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); + ctx.gpr[5] = (ctx.gpr[5] >> 8u); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(64))); + ctx.gpr[5] = (7424u << 16u); + aot_mem.aot_store8(ctx.gpr[23] + static_cast(1472), static_cast(0u)); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + goto SB_L_0895B2B0; + +SB_L_0895B2B0: + ctx.gpr[18] = (ctx.gpr[18] + static_cast(24)); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(56))); + { const bool branch_taken = ctx.gpr[18] != ctx.gpr[4]; + // nop + if (branch_taken) { + goto SB_L_0895A8B4; + } + goto SB_L_0895B2C0; + } + +SB_L_0895B2C0: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[29] + static_cast(48))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895B2EC; + } + goto SB_L_0895B2CC; + } + +SB_L_0895B2CC: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(9004))); + ctx.gpr[6] = (23552u << 16u); + ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + goto SB_L_0895B2EC; + +SB_L_0895B2EC: + ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[29] + static_cast(60))); + { const bool branch_taken = ctx.gpr[5] == 0u; + // nop + if (branch_taken) { + goto SB_L_0895B33C; + } + goto SB_L_0895B2F8; + } + +SB_L_0895B2F8: + ctx.gpr[6] = (std::bit_cast(ctx.fpr[22])); + ctx.gpr[6] = (ctx.gpr[6] >> 8u); + ctx.gpr[7] = (18944u << 16u); + ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[7] + static_cast(0), ctx.gpr[6]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[6]); + ctx.gpr[7] = (std::bit_cast(ctx.fpr[22])); + ctx.gpr[7] = (ctx.gpr[7] >> 8u); + ctx.gpr[8] = (19200u << 16u); + ctx.gpr[7] = (ctx.gpr[7] | ctx.gpr[8]); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[7]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[6]); + goto SB_L_0895B33C; + +SB_L_0895B33C: + ctx.gpr[2] = (ctx.gpr[5] | ctx.gpr[4]); + ctx.gpr[2] = (0u < ctx.gpr[2] ? 1u : 0u); + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(72))); + ctx.fpr[22] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(76))); + ctx.fpr[24] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(80))); + ctx.fpr[26] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(84))); + ctx.fpr[28] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(88))); + ctx.fpr[30] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(92))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(96))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(104))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(108))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(112))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(116))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(120))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(124))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(128))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(132))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(144)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0085; + + +#undef TIER2_SB_RETURN +} + +} // namespace vcs diff --git a/profiles/vcs/host/vcs_tier2_cluster_matrix.cpp b/profiles/vcs/host/vcs_tier2_cluster_matrix.cpp new file mode 100644 index 0000000..e36063a --- /dev/null +++ b/profiles/vcs/host/vcs_tier2_cluster_matrix.cpp @@ -0,0 +1,1463 @@ +// AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. +// Tier-2 SUPERBLOCK V2 cluster: matrix +#include "vcs_tier2_superblocks.hpp" +#include "psprecomp/runtime.hpp" +#include "generated_units.hpp" + +#include + +namespace vcs { +using namespace psprecomp; + +void tier2_superblock_matrix(psprecomp::Runtime &rt, + psprecomp::AllegrexContext &ctx, + psprecomp::GuestMemory::AotFastView &aot_mem, + std::uint32_t entry_pc) { + tier2_detail::SampleScope tier2_scope(Tier2ClusterId::Matrix); + auto &tier2_stats = tier2_scope.stats(); + 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; + +#define TIER2_SB_RETURN() do { 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)rt.tier2_complete_fused_transfers(ctx, tier2_tail_count_); --tier2_return_depth; (void)rt.tier2_complete_fused_transfers(ctx, 1u); } if (tier2_pending_transfers != 0u) { (void)rt.tier2_complete_fused_transfers(ctx, tier2_pending_transfers); tier2_pending_transfers = 0u; } return; } while (false) + + goto TIER2_ENTRY_DISPATCH; + +TIER2_FUSED_RETURN_DISPATCH: + switch (tier2_resume_pc) { + case 0x088B4738u: goto SB_L_088B4738; + case 0x088B47E4u: goto SB_L_088B47E4; + case 0x088B47F0u: goto SB_L_088B47F0; + case 0x088B4810u: goto SB_L_088B4810; + case 0x088B4830u: goto SB_L_088B4830; + case 0x088B483Cu: goto SB_L_088B483C; + case 0x088B4850u: goto SB_L_088B4850; + case 0x088B485Cu: goto SB_L_088B485C; + case 0x088B486Cu: goto SB_L_088B486C; + case 0x088B4878u: goto SB_L_088B4878; + case 0x088B4890u: goto SB_L_088B4890; + case 0x088B4898u: goto SB_L_088B4898; + case 0x088B48A0u: goto SB_L_088B48A0; + case 0x088B48A8u: goto SB_L_088B48A8; + case 0x088B48C0u: goto SB_L_088B48C0; + case 0x088B48D4u: goto SB_L_088B48D4; + case 0x088B48F0u: goto SB_L_088B48F0; + case 0x088B48F4u: goto SB_L_088B48F4; + case 0x088B4948u: goto SB_L_088B4948; + case 0x088B4958u: goto SB_L_088B4958; + case 0x088B4960u: goto SB_L_088B4960; + case 0x088B497Cu: goto SB_L_088B497C; + case 0x088B49ECu: goto SB_L_088B49EC; + case 0x088B4A08u: goto SB_L_088B4A08; + case 0x088B4AC8u: goto SB_L_088B4AC8; + case 0x088B4B18u: goto SB_L_088B4B18; + case 0x088B4B1Cu: goto SB_L_088B4B1C; + case 0x088B4B3Cu: goto SB_L_088B4B3C; + case 0x088B4B44u: goto SB_L_088B4B44; + case 0x088B4B48u: goto SB_L_088B4B48; + case 0x088B4B5Cu: goto SB_L_088B4B5C; + case 0x088B4B6Cu: goto SB_L_088B4B6C; + case 0x088B4B70u: goto SB_L_088B4B70; + case 0x088B4B98u: goto SB_L_088B4B98; + case 0x088B4BA0u: goto SB_L_088B4BA0; + case 0x088B4BA4u: goto SB_L_088B4BA4; + case 0x088B4BB4u: goto SB_L_088B4BB4; + case 0x088B4BBCu: goto SB_L_088B4BBC; + case 0x088B4BD4u: goto SB_L_088B4BD4; + case 0x088B4BDCu: goto SB_L_088B4BDC; + case 0x088B4BE0u: goto SB_L_088B4BE0; + case 0x088B4C28u: goto SB_L_088B4C28; + case 0x088B4C3Cu: goto SB_L_088B4C3C; + case 0x088B4C54u: goto SB_L_088B4C54; + case 0x088B4C7Cu: goto SB_L_088B4C7C; + case 0x088B4D08u: goto SB_L_088B4D08; + case 0x088B4D14u: goto SB_L_088B4D14; + case 0x088B4D1Cu: goto SB_L_088B4D1C; + case 0x088B4D30u: goto SB_L_088B4D30; + case 0x088B4D6Cu: goto SB_L_088B4D6C; + case 0x088B4D94u: goto SB_L_088B4D94; + case 0x088B4DA0u: goto SB_L_088B4DA0; + case 0x088B4DB4u: goto SB_L_088B4DB4; + case 0x088B4DB8u: goto SB_L_088B4DB8; + case 0x088B4DD8u: goto SB_L_088B4DD8; + case 0x088B4DE0u: goto SB_L_088B4DE0; + case 0x088B4DE4u: goto SB_L_088B4DE4; + case 0x088B4DF8u: goto SB_L_088B4DF8; + case 0x088B4E08u: goto SB_L_088B4E08; + case 0x088B4E0Cu: goto SB_L_088B4E0C; + case 0x088B4E34u: goto SB_L_088B4E34; + case 0x088B4E3Cu: goto SB_L_088B4E3C; + case 0x088B4E40u: goto SB_L_088B4E40; + case 0x088B4E50u: goto SB_L_088B4E50; + case 0x088B4E54u: goto SB_L_088B4E54; + case 0x088B4E80u: goto SB_L_088B4E80; + case 0x088B4E94u: goto SB_L_088B4E94; + case 0x088B4EACu: goto SB_L_088B4EAC; + case 0x088B4EBCu: goto SB_L_088B4EBC; + case 0x088B4EE4u: goto SB_L_088B4EE4; + case 0x088B4F60u: goto SB_L_088B4F60; + case 0x088B4F70u: goto SB_L_088B4F70; + case 0x088B4F74u: goto SB_L_088B4F74; + default: break; + } + switch (tier2_resume_unit) { + + default: break; + } + ctx.pc = tier2_resume_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 (!rt.tier2_complete_fused_transfers(ctx, tier2_nested_tail)) + tier2_same_context = false; + } + --tier2_return_depth; + if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + tier2_same_context = false; + if (!tier2_same_context) TIER2_SB_RETURN(); + goto TIER2_FUSED_RETURN_DISPATCH; + } + switch (local_pc) { + case 0x088B4738u: goto SB_L_088B4738; + case 0x088B47E4u: goto SB_L_088B47E4; + case 0x088B47F0u: goto SB_L_088B47F0; + case 0x088B4810u: goto SB_L_088B4810; + case 0x088B4830u: goto SB_L_088B4830; + case 0x088B483Cu: goto SB_L_088B483C; + case 0x088B4850u: goto SB_L_088B4850; + case 0x088B485Cu: goto SB_L_088B485C; + case 0x088B486Cu: goto SB_L_088B486C; + case 0x088B4878u: goto SB_L_088B4878; + case 0x088B4890u: goto SB_L_088B4890; + case 0x088B4898u: goto SB_L_088B4898; + case 0x088B48A0u: goto SB_L_088B48A0; + case 0x088B48A8u: goto SB_L_088B48A8; + case 0x088B48C0u: goto SB_L_088B48C0; + case 0x088B48D4u: goto SB_L_088B48D4; + case 0x088B48F0u: goto SB_L_088B48F0; + case 0x088B48F4u: goto SB_L_088B48F4; + case 0x088B4948u: goto SB_L_088B4948; + case 0x088B4958u: goto SB_L_088B4958; + case 0x088B4960u: goto SB_L_088B4960; + case 0x088B497Cu: goto SB_L_088B497C; + case 0x088B49ECu: goto SB_L_088B49EC; + case 0x088B4A08u: goto SB_L_088B4A08; + case 0x088B4AC8u: goto SB_L_088B4AC8; + case 0x088B4B18u: goto SB_L_088B4B18; + case 0x088B4B1Cu: goto SB_L_088B4B1C; + case 0x088B4B3Cu: goto SB_L_088B4B3C; + case 0x088B4B44u: goto SB_L_088B4B44; + case 0x088B4B48u: goto SB_L_088B4B48; + case 0x088B4B5Cu: goto SB_L_088B4B5C; + case 0x088B4B6Cu: goto SB_L_088B4B6C; + case 0x088B4B70u: goto SB_L_088B4B70; + case 0x088B4B98u: goto SB_L_088B4B98; + case 0x088B4BA0u: goto SB_L_088B4BA0; + case 0x088B4BA4u: goto SB_L_088B4BA4; + case 0x088B4BB4u: goto SB_L_088B4BB4; + case 0x088B4BBCu: goto SB_L_088B4BBC; + case 0x088B4BD4u: goto SB_L_088B4BD4; + case 0x088B4BDCu: goto SB_L_088B4BDC; + case 0x088B4BE0u: goto SB_L_088B4BE0; + case 0x088B4C28u: goto SB_L_088B4C28; + case 0x088B4C3Cu: goto SB_L_088B4C3C; + case 0x088B4C54u: goto SB_L_088B4C54; + case 0x088B4C7Cu: goto SB_L_088B4C7C; + case 0x088B4D08u: goto SB_L_088B4D08; + case 0x088B4D14u: goto SB_L_088B4D14; + case 0x088B4D1Cu: goto SB_L_088B4D1C; + case 0x088B4D30u: goto SB_L_088B4D30; + case 0x088B4D6Cu: goto SB_L_088B4D6C; + case 0x088B4D94u: goto SB_L_088B4D94; + case 0x088B4DA0u: goto SB_L_088B4DA0; + case 0x088B4DB4u: goto SB_L_088B4DB4; + case 0x088B4DB8u: goto SB_L_088B4DB8; + case 0x088B4DD8u: goto SB_L_088B4DD8; + case 0x088B4DE0u: goto SB_L_088B4DE0; + case 0x088B4DE4u: goto SB_L_088B4DE4; + case 0x088B4DF8u: goto SB_L_088B4DF8; + case 0x088B4E08u: goto SB_L_088B4E08; + case 0x088B4E0Cu: goto SB_L_088B4E0C; + case 0x088B4E34u: goto SB_L_088B4E34; + case 0x088B4E3Cu: goto SB_L_088B4E3C; + case 0x088B4E40u: goto SB_L_088B4E40; + case 0x088B4E50u: goto SB_L_088B4E50; + case 0x088B4E54u: goto SB_L_088B4E54; + case 0x088B4E80u: goto SB_L_088B4E80; + case 0x088B4E94u: goto SB_L_088B4E94; + case 0x088B4EACu: goto SB_L_088B4EAC; + case 0x088B4EBCu: goto SB_L_088B4EBC; + case 0x088B4EE4u: goto SB_L_088B4EE4; + case 0x088B4F60u: goto SB_L_088B4F60; + case 0x088B4F70u: goto SB_L_088B4F70; + case 0x088B4F74u: goto SB_L_088B4F74; + default: + ctx.pc = local_pc; + TIER2_SB_RETURN(); + } + + +TIER2_ENTRY_DISPATCH: + switch (entry_pc) { + case 0x088B4738u: goto SB_L_088B4738; + default: + ctx.pc = entry_pc; + ++tier2_stats.fallbacks; + TIER2_SB_RETURN(); + } + +SB_L_088B4738: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-352)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(296), std::bit_cast(ctx.fpr[20])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(300), ctx.gpr[16]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(304), ctx.gpr[17]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(308), ctx.gpr[18]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(312), ctx.gpr[19]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(316), ctx.gpr[20]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(320), ctx.gpr[21]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(324), ctx.gpr[22]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(328), ctx.gpr[23]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(332), ctx.gpr[30]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(336), ctx.gpr[31]); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(16); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(32); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(48); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<3u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[6] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<36u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[6] + static_cast(16); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<37u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[6] + static_cast(32); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<38u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[6] + static_cast(48); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<19u, 4u>(vfpu_value); } + { float vfpu_value[4]{}; + ctx.write_vfpu_vector_with_destination_prefix_ct<39u, 3u>(vfpu_value); } + { float vfpu_value[4]{}; + ctx.write_vfpu_vector_with_destination_prefix_ct<35u, 3u>(vfpu_value); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix(vfpu_matrix, 36u, 3u); + ctx.read_vfpu_vector_ct<19u, 3u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 3u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix(vfpu_result, 7u, vfpu_side); } + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<7u, 3u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = -vfpu_s[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<7u, 3u>(vfpu_d); } + { float vfpu_value[4]{1.0f, 1.0f, 1.0f, 1.0f}; + ctx.write_vfpu_vector_with_destination_prefix_ct<99u, 1u>(vfpu_value); } + { float vfpu_value[4]{1.0f, 1.0f, 1.0f, 1.0f}; + ctx.write_vfpu_vector_with_destination_prefix_ct<103u, 1u>(vfpu_value); } + { float vfpu_s[16]{}, vfpu_t[16]{}, vfpu_d[16]{}; + ctx.read_vfpu_matrix(vfpu_s, 0u, 4u); + ctx.read_vfpu_matrix(vfpu_t, 36u, 4u); + for (std::uint32_t a = 0; a < 4u; ++a) { + for (std::uint32_t b = 0; b < 4u; ++b) { + float sum = 0.0f; + for (std::uint32_t c = 0; c < 4u; ++c) sum += vfpu_s[b * 4u + c] * vfpu_t[a * 4u + c]; + vfpu_d[a * 4u + b] = sum; + } + } + ctx.write_vfpu_matrix(vfpu_d, 44u, 4u); + ctx.eat_vfpu_prefixes(); } + { const std::uint32_t vfpu_address = ctx.gpr[5] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<8u, 4u>(vfpu_value); } + ctx.gpr[4] = (ctx.gpr[7] + static_cast(16)); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<28u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(16); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<29u, 4u>(vfpu_value); } + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<104u, 1u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = vfpu_s[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<117u, 1u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<104u, 1u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = vfpu_s[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<118u, 1u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<104u, 1u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = vfpu_s[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<116u, 1u>(vfpu_d); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix(vfpu_matrix, 44u, 3u); + ctx.read_vfpu_vector_ct<8u, 3u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 3u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix(vfpu_result, 20u, vfpu_side); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<20u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<15u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] + vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<20u, 3u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<28u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<55u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<16u, 3u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<29u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<55u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] + vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<17u, 3u>(vfpu_d); } + ctx.gpr[4] = (ctx.gpr[29] + static_cast(16)); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<20u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.execute_vfpu_vcmp_ct<20u, 16u, 3u, 2u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 4u) & 1u) != 0u; + // nop + if (branch_taken) { + goto SB_L_088B4810; + } + goto SB_L_088B47E4; + } + +SB_L_088B47E4: + ctx.execute_vfpu_vcmp_ct<20u, 17u, 3u, 7u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 4u) & 1u) != 0u; + // nop + if (branch_taken) { + goto SB_L_088B4810; + } + goto SB_L_088B47F0; + } + +SB_L_088B47F0: + ctx.gpr[2] = (0u + static_cast(1)); + ctx.gpr[2] = (ctx.gpr[2] & 255u); + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix(vfpu_matrix, 0u, 3u); + ctx.read_vfpu_vector_ct<3u, 3u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 3u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix(vfpu_result, 35u, vfpu_side); } + { float vfpu_value[4]{}; + ctx.write_vfpu_vector_with_destination_prefix_ct<3u, 3u>(vfpu_value); } + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<35u, 3u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = -vfpu_s[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<35u, 3u>(vfpu_d); } + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<19u, 3u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<39u, 3u>(vfpu_d); } + { float vfpu_value[4]{}; + ctx.write_vfpu_vector_with_destination_prefix_ct<7u, 3u>(vfpu_value); } + { float vfpu_s[16]{}, vfpu_t[16]{}, vfpu_d[16]{}; + ctx.read_vfpu_matrix(vfpu_s, 36u, 4u); + ctx.read_vfpu_matrix(vfpu_t, 0u, 4u); + for (std::uint32_t a = 0; a < 4u; ++a) { + for (std::uint32_t b = 0; b < 4u; ++b) { + float sum = 0.0f; + for (std::uint32_t c = 0; c < 4u; ++c) sum += vfpu_s[b * 4u + c] * vfpu_t[a * 4u + c]; + vfpu_d[a * 4u + b] = sum; + } + } + ctx.write_vfpu_matrix(vfpu_d, 48u, 4u); + ctx.eat_vfpu_prefixes(); } + goto SB_L_088B4810; + +SB_L_088B4810: + ctx.gpr[30] = (ctx.gpr[5] | 0u); + ctx.gpr[23] = (ctx.gpr[7] | 0u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(256), ctx.gpr[6]); + ctx.gpr[17] = (ctx.gpr[9] | 0u); + ctx.gpr[18] = (ctx.gpr[10] | 0u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(292), ctx.gpr[8]); + { const bool branch_taken = ctx.gpr[2] == 0u; + // nop + if (branch_taken) { + goto SB_L_088B48A0; + } + goto SB_L_088B4830; + } + +SB_L_088B4830: + ctx.gpr[4] = (ctx.gpr[30] | 0u); + ctx.gpr[31] = (0x088B483Cu); + ctx.gpr[5] = (ctx.gpr[23] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 138u, 0x088B0E34u>(ctx, &aot_mem) && ctx.pc == 0x088B483Cu) goto SB_L_088B483C; + TIER2_SB_RETURN(); + +SB_L_088B483C: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[30] + static_cast(53))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(276), ctx.gpr[2]); + ctx.gpr[5] = (ctx.gpr[4] | ctx.gpr[2]); + { const bool branch_taken = ctx.gpr[5] == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(272), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_088B4898; + } + goto SB_L_088B4850; + } + +SB_L_088B4850: + aot_mem.aot_store32(ctx.gpr[29] + static_cast(288), ctx.gpr[18]); + ctx.gpr[31] = (0x088B485Cu); + ctx.gpr[4] = (ctx.gpr[30] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 135u, 0x088B0DD4u>(ctx, &aot_mem) && ctx.pc == 0x088B485Cu) goto SB_L_088B485C; + TIER2_SB_RETURN(); + +SB_L_088B485C: + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(276))); + ctx.gpr[4] = (ctx.gpr[23] | 0u); + ctx.gpr[31] = (0x088B486Cu); + ctx.gpr[5] = (ctx.gpr[30] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 145u, 0x088B0EE0u>(ctx, &aot_mem) && ctx.pc == 0x088B486Cu) goto SB_L_088B486C; + TIER2_SB_RETURN(); + +SB_L_088B486C: + ctx.gpr[19] = (ctx.gpr[2] | 0u); + ctx.gpr[31] = (0x088B4878u); + ctx.gpr[4] = (ctx.gpr[23] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 152u, 0x088B0FA4u>(ctx, &aot_mem) && ctx.pc == 0x088B4878u) goto SB_L_088B4878; + TIER2_SB_RETURN(); + +SB_L_088B4878: + ctx.gpr[30] = (ctx.gpr[2] | 0u); + ctx.gpr[16] = (2235u << 16u); + ctx.gpr[16] = (ctx.gpr[16] + static_cast(28480)); + ctx.gpr[8] = (2236u << 16u); + { const bool branch_taken = ctx.gpr[17] != 0u; + ctx.gpr[8] = (ctx.gpr[8] + static_cast(-28864)); + if (branch_taken) { + goto SB_L_088B48A8; + } + goto SB_L_088B4890; + } + +SB_L_088B4890: + { const bool branch_taken = 0u == 0u; + ctx.gpr[11] = (ctx.gpr[8] | 0u); + if (branch_taken) { + goto SB_L_088B48F4; + } + goto SB_L_088B4898; + } + +SB_L_088B4898: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 0u); + if (branch_taken) { + goto SB_L_088B4F74; + } + goto SB_L_088B48A0; + } + +SB_L_088B48A0: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_088B4F74; + } + goto SB_L_088B48A8; + } + +SB_L_088B48A8: + aot_mem.aot_store32(ctx.gpr[29] + static_cast(288), ctx.gpr[18]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(272))); + ctx.gpr[4] = (0u | 0u); + ctx.gpr[5] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[5] == 0u; + // nop + if (branch_taken) { + goto SB_L_088B48F0; + } + goto SB_L_088B48C0; + } + +SB_L_088B48C0: + aot_mem.aot_store32(ctx.gpr[29] + static_cast(288), ctx.gpr[18]); + ctx.gpr[5] = (0u | 0u); + ctx.gpr[5] = (ctx.gpr[17] + ctx.gpr[5]); + ctx.gpr[6] = (ctx.gpr[18] | 0u); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(272))); + goto SB_L_088B48D4; + +SB_L_088B48D4: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(12), std::bit_cast(ctx.fpr[12])); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(32)); + ctx.gpr[9] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[7]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[9] != 0u; + ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); + if (branch_taken) { + goto SB_L_088B48D4; + } + goto SB_L_088B48F0; + } + +SB_L_088B48F0: + ctx.gpr[11] = (ctx.gpr[8] | 0u); + goto SB_L_088B48F4; + +SB_L_088B48F4: + aot_mem.aot_store32(ctx.gpr[29] + static_cast(224), ctx.gpr[19]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(284), ctx.gpr[17]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(280), ctx.gpr[11]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[23] + static_cast(68))); + ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[23] + static_cast(54))); + ctx.gpr[5] = (ctx.gpr[5] << 4u); + ctx.gpr[5] = (ctx.gpr[4] + ctx.gpr[5]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[23] + static_cast(76))); + ctx.gpr[7] = (aot_mem.aot_load16(ctx.gpr[23] + static_cast(50))); + ctx.gpr[8] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(276))); + ctx.gpr[9] = (aot_mem.aot_load32(ctx.gpr[23] + static_cast(72))); + ctx.gpr[2] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(272))); + ctx.gpr[10] = (ctx.gpr[8] << 6u); + ctx.gpr[10] = (ctx.gpr[10] + ctx.gpr[16]); + ctx.gpr[8] = (ctx.gpr[2] << 5u); + ctx.gpr[2] = (ctx.gpr[8] + ctx.gpr[11]); + ctx.gpr[8] = (ctx.gpr[9] | 0u); + ctx.gpr[9] = (ctx.gpr[16] | 0u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[2]); + ctx.gpr[31] = (0x088B4948u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[17]); + if (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 75u, 0x088B08ACu>(ctx, &aot_mem) && ctx.pc == 0x088B4948u) goto SB_L_088B4948; + TIER2_SB_RETURN(); + +SB_L_088B4948: + ctx.gpr[4] = (ctx.gpr[30] | ctx.gpr[19]); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[2]); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_088B4960; + } + goto SB_L_088B4958; + } + +SB_L_088B4958: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 0u); + if (branch_taken) { + goto SB_L_088B4F74; + } + goto SB_L_088B4960; + } + +SB_L_088B4960: + ctx.gpr[4] = (0u | 0u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(260), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(276))); + ctx.gpr[5] = (0u | 0u); + ctx.gpr[4] = (static_cast(ctx.gpr[5]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(252), ctx.gpr[5]); + if (branch_taken) { + goto SB_L_088B4C28; + } + goto SB_L_088B497C; + } + +SB_L_088B497C: + ctx.gpr[21] = (ctx.gpr[29] + static_cast(80)); + ctx.gpr[4] = (2236u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(-27840)); + ctx.gpr[20] = (ctx.gpr[29] + static_cast(64)); + ctx.gpr[5] = (2236u << 16u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(264), ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[5] + static_cast(-28352)); + ctx.gpr[5] = (19224u << 16u); + ctx.gpr[5] = (ctx.gpr[5] | 38528u); + ctx.fpr[20] = std::bit_cast(ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[16] + static_cast(16)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(268), ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[16] + static_cast(32)); + ctx.gpr[6] = (ctx.gpr[16] + static_cast(44)); + ctx.gpr[7] = (ctx.gpr[16] + static_cast(46)); + ctx.gpr[8] = (0u | 0u); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(292))); + ctx.gpr[22] = (ctx.gpr[16] | 0u); + ctx.gpr[9] = (0u | 0u); + ctx.gpr[19] = (ctx.gpr[19] + ctx.gpr[9]); + ctx.gpr[5] = (ctx.gpr[8] + ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[8] + ctx.gpr[4]); + ctx.gpr[6] = (ctx.gpr[8] + ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(248), ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[8] + ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(244), ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(236), ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(240), ctx.gpr[5]); + goto SB_L_088B49EC; + +SB_L_088B49EC: + ctx.gpr[18] = (0u | 0u); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[22] + static_cast(28))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(64), std::bit_cast(ctx.fpr[12])); + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[20])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(236))); + if (branch_taken) { + goto SB_L_088B4AC8; + } + goto SB_L_088B4A08; + } + +SB_L_088B4A08: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(248))); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(112), std::bit_cast(ctx.fpr[12])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[5] + static_cast(4))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(116), std::bit_cast(ctx.fpr[12])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[5] + static_cast(8))); + ctx.gpr[5] = (ctx.gpr[29] + static_cast(112)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(120), std::bit_cast(ctx.fpr[12])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + ctx.gpr[6] = (std::bit_cast(ctx.fpr[12])); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[5] + static_cast(4))); + ctx.gpr[7] = (std::bit_cast(ctx.fpr[13])); + ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[5] + static_cast(8))); + ctx.gpr[8] = (std::bit_cast(ctx.fpr[14])); + aot_mem.aot_store32(ctx.gpr[19] + static_cast(0), ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[19] + static_cast(4), ctx.gpr[7]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(244))); + aot_mem.aot_store32(ctx.gpr[19] + static_cast(8), ctx.gpr[8]); + ctx.fpr[15] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(112), std::bit_cast(ctx.fpr[15])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[6] + static_cast(4))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(116), std::bit_cast(ctx.fpr[12])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[6] + static_cast(8))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(120), std::bit_cast(ctx.fpr[12])); + ctx.gpr[6] = (ctx.gpr[19] + static_cast(16)); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + ctx.gpr[7] = (std::bit_cast(ctx.fpr[12])); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[5] + static_cast(4))); + ctx.gpr[8] = (std::bit_cast(ctx.fpr[13])); + ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[5] + static_cast(8))); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[14])); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[7]); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(4), ctx.gpr[8]); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(8), ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[19] + static_cast(28)); + ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(0))); + ctx.gpr[7] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(1))); + aot_mem.aot_store8(ctx.gpr[5] + static_cast(0), static_cast(ctx.gpr[6])); + aot_mem.aot_store8(ctx.gpr[5] + static_cast(1), static_cast(ctx.gpr[7])); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(240))); + ctx.gpr[6] = (ctx.gpr[19] + static_cast(30)); + ctx.gpr[7] = (aot_mem.aot_load8(ctx.gpr[5] + static_cast(0))); + ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[5] + static_cast(1))); + aot_mem.aot_store8(ctx.gpr[6] + static_cast(0), static_cast(ctx.gpr[7])); + aot_mem.aot_store8(ctx.gpr[6] + static_cast(1), static_cast(ctx.gpr[5])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[22] + static_cast(48))); + aot_mem.aot_store32(ctx.gpr[19] + static_cast(12), std::bit_cast(ctx.fpr[12])); + ctx.gpr[18] = (0u | 1u); + goto SB_L_088B4AC8; + +SB_L_088B4AC8: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[22] + static_cast(0))); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[22] + static_cast(4))); + ctx.gpr[6] = (std::bit_cast(ctx.fpr[13])); + ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[22] + static_cast(8))); + ctx.gpr[7] = (std::bit_cast(ctx.fpr[14])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(80), ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(84), ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(88), ctx.gpr[7]); + ctx.fpr[15] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[22] + static_cast(12))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(92), std::bit_cast(ctx.fpr[15])); + ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(0))); + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(1))); + aot_mem.aot_store8(ctx.gpr[29] + static_cast(96), static_cast(ctx.gpr[5])); + aot_mem.aot_store8(ctx.gpr[29] + static_cast(97), static_cast(ctx.gpr[4])); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(224))); + ctx.gpr[17] = (0u | 0u); + ctx.gpr[4] = (static_cast(ctx.gpr[17]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_088B4B5C; + } + goto SB_L_088B4B18; + } + +SB_L_088B4B18: + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(268))); + goto SB_L_088B4B1C; + +SB_L_088B4B1C: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[23] + static_cast(56))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] << 5u); + ctx.gpr[5] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[6] = (ctx.gpr[19] | 0u); + ctx.gpr[31] = (0x088B4B3Cu); + ctx.gpr[7] = (ctx.gpr[20] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 159u, 0x088B1028u>(ctx, &aot_mem) && ctx.pc == 0x088B4B3Cu) goto SB_L_088B4B3C; + TIER2_SB_RETURN(); + +SB_L_088B4B3C: + { const bool branch_taken = ctx.gpr[2] == 0u; + // nop + if (branch_taken) { + goto SB_L_088B4B48; + } + goto SB_L_088B4B44; + } + +SB_L_088B4B44: + ctx.gpr[18] = (0u | 1u); + goto SB_L_088B4B48; + +SB_L_088B4B48: + ctx.gpr[17] = (ctx.gpr[17] + static_cast(1)); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(224))); + ctx.gpr[4] = (static_cast(ctx.gpr[17]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[16] = (ctx.gpr[16] + static_cast(4)); + if (branch_taken) { + goto SB_L_088B4B1C; + } + goto SB_L_088B4B5C; + } + +SB_L_088B4B5C: + ctx.gpr[17] = (0u | 0u); + ctx.gpr[4] = (static_cast(ctx.gpr[17]) < static_cast(ctx.gpr[30]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_088B4BB4; + } + goto SB_L_088B4B6C; + } + +SB_L_088B4B6C: + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(264))); + goto SB_L_088B4B70; + +SB_L_088B4B70: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[23] + static_cast(64))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] << 4u); + ctx.gpr[6] = (ctx.gpr[4] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[6]); + ctx.gpr[5] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[6] = (ctx.gpr[19] | 0u); + ctx.gpr[31] = (0x088B4B98u); + ctx.gpr[7] = (ctx.gpr[20] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 239u, 0x088B1C50u>(ctx, &aot_mem) && ctx.pc == 0x088B4B98u) goto SB_L_088B4B98; + TIER2_SB_RETURN(); + +SB_L_088B4B98: + { const bool branch_taken = ctx.gpr[2] == 0u; + // nop + if (branch_taken) { + goto SB_L_088B4BA4; + } + goto SB_L_088B4BA0; + } + +SB_L_088B4BA0: + ctx.gpr[18] = (0u | 1u); + goto SB_L_088B4BA4; + +SB_L_088B4BA4: + ctx.gpr[17] = (ctx.gpr[17] + static_cast(1)); + ctx.gpr[4] = (static_cast(ctx.gpr[17]) < static_cast(ctx.gpr[30]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[16] = (ctx.gpr[16] + static_cast(4)); + if (branch_taken) { + goto SB_L_088B4B70; + } + goto SB_L_088B4BB4; + } + +SB_L_088B4BB4: + if (ctx.gpr[18] == 0u) { + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(252))); + goto SB_L_088B4BE0; + } + goto SB_L_088B4BBC; + +SB_L_088B4BBC: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(260))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + ctx.gpr[19] = (ctx.gpr[19] + static_cast(32)); + ctx.gpr[5] = (static_cast(ctx.gpr[4]) < 32 ? 1u : 0u); + { const bool branch_taken = ctx.gpr[5] != 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(260), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_088B4BDC; + } + goto SB_L_088B4BD4; + } + +SB_L_088B4BD4: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_088B4C28; + } + goto SB_L_088B4BDC; + } + +SB_L_088B4BDC: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(252))); + goto SB_L_088B4BE0; + +SB_L_088B4BE0: + ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + ctx.gpr[22] = (ctx.gpr[22] + static_cast(64)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(248))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(252), ctx.gpr[4]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(236))); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(244))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(64)); + ctx.gpr[8] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(240))); + ctx.gpr[7] = (ctx.gpr[7] + static_cast(64)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(248), ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[6] + static_cast(64)); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(276))); + ctx.gpr[8] = (ctx.gpr[8] + static_cast(64)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(244), ctx.gpr[7]); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[6]) ? 1u : 0u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(236), ctx.gpr[5]); + { const bool branch_taken = ctx.gpr[4] != 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(240), ctx.gpr[8]); + if (branch_taken) { + goto SB_L_088B49EC; + } + goto SB_L_088B4C28; + } + +SB_L_088B4C28: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(260))); + ctx.gpr[18] = (0u | 0u); + ctx.gpr[4] = (static_cast(ctx.gpr[18]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[17] = (ctx.gpr[29] + static_cast(128)); + if (branch_taken) { + goto SB_L_088B4D08; + } + goto SB_L_088B4C3C; + } + +SB_L_088B4C3C: + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(292))); + ctx.gpr[19] = (ctx.gpr[29] + static_cast(144)); + ctx.gpr[4] = (0u | 0u); + ctx.gpr[16] = (ctx.gpr[16] + ctx.gpr[4]); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(256))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(260))); + goto SB_L_088B4C54; + +SB_L_088B4C54: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(144), std::bit_cast(ctx.fpr[12])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(4))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(148), std::bit_cast(ctx.fpr[12])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(8))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(152), std::bit_cast(ctx.fpr[12])); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + ctx.gpr[5] = (ctx.gpr[20] | 0u); + ctx.gpr[31] = (0x088B4C7Cu); + ctx.gpr[6] = (ctx.gpr[19] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 73u, 0x088B086Cu>(ctx, &aot_mem) && ctx.pc == 0x088B4C7Cu) goto SB_L_088B4C7C; + TIER2_SB_RETURN(); + +SB_L_088B4C7C: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); + ctx.gpr[4] = (std::bit_cast(ctx.fpr[12])); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(4))); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[13])); + ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(8))); + ctx.gpr[6] = (std::bit_cast(ctx.fpr[14])); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(4), ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(8), ctx.gpr[6]); + ctx.fpr[15] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(16))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(144), std::bit_cast(ctx.fpr[15])); + ctx.fpr[15] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(20))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(148), std::bit_cast(ctx.fpr[15])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(24))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(152), std::bit_cast(ctx.fpr[12])); + { const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast(16); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast(32); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix(vfpu_matrix, 36u, 3u); + ctx.read_vfpu_vector_ct<7u, 3u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 3u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix(vfpu_result, 0u, vfpu_side); } + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.gpr[4] = (ctx.gpr[16] + static_cast(16)); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(4))); + ctx.gpr[6] = (std::bit_cast(ctx.fpr[13])); + ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(8))); + ctx.gpr[7] = (std::bit_cast(ctx.fpr[14])); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(4), ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(8), ctx.gpr[7]); + ctx.gpr[18] = (ctx.gpr[18] + static_cast(1)); + ctx.gpr[4] = (static_cast(ctx.gpr[18]) < static_cast(ctx.gpr[21]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[16] = (ctx.gpr[16] + static_cast(32)); + if (branch_taken) { + goto SB_L_088B4C54; + } + goto SB_L_088B4D08; + } + +SB_L_088B4D08: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(284))); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_088B4D1C; + } + goto SB_L_088B4D14; + } + +SB_L_088B4D14: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(260))); + if (branch_taken) { + goto SB_L_088B4F74; + } + goto SB_L_088B4D1C; + } + +SB_L_088B4D1C: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(272))); + ctx.gpr[6] = (0u | 0u); + ctx.gpr[5] = (static_cast(ctx.gpr[6]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[5] == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(232), ctx.gpr[6]); + if (branch_taken) { + goto SB_L_088B4E80; + } + goto SB_L_088B4D30; + } + +SB_L_088B4D30: + ctx.gpr[5] = (2236u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(-27840)); + ctx.gpr[22] = (0u | 1u); + ctx.gpr[6] = (2236u << 16u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(264), ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[6] + static_cast(-28352)); + ctx.gpr[21] = (0u | 0u); + ctx.gpr[19] = (ctx.gpr[4] + ctx.gpr[21]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(268), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(288))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(280))); + ctx.gpr[20] = (0u | 0u); + ctx.gpr[21] = (ctx.gpr[21] + ctx.gpr[5]); + ctx.gpr[20] = (ctx.gpr[4] + ctx.gpr[20]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(228), ctx.gpr[4]); + goto SB_L_088B4D6C; + +SB_L_088B4D6C: + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(232))); + ctx.gpr[18] = (ctx.gpr[29] + ctx.gpr[18]); + aot_mem.aot_store8(ctx.gpr[18] + static_cast(48), static_cast(0u)); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(228))); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[19] + static_cast(12))); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(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_088B4DA0; + } + goto SB_L_088B4D94; + } + +SB_L_088B4D94: + aot_mem.aot_store8(ctx.gpr[18] + static_cast(48), static_cast(ctx.gpr[22])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[19] + static_cast(12))); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), std::bit_cast(ctx.fpr[12])); + goto SB_L_088B4DA0; + +SB_L_088B4DA0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(224))); + ctx.gpr[17] = (0u | 0u); + ctx.gpr[4] = (static_cast(ctx.gpr[17]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_088B4DF8; + } + goto SB_L_088B4DB4; + } + +SB_L_088B4DB4: + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(268))); + goto SB_L_088B4DB8; + +SB_L_088B4DB8: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[23] + static_cast(56))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] << 5u); + ctx.gpr[5] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[6] = (ctx.gpr[19] | 0u); + ctx.gpr[31] = (0x088B4DD8u); + ctx.gpr[7] = (ctx.gpr[20] | 0u); + ctx.pc = 0x088B1554u; + rt.invoke_native_fast_path(0x088B1554u, ctx); + if (ctx.pc == 0x088B4DD8u) goto SB_L_088B4DD8; + TIER2_SB_RETURN(); + +SB_L_088B4DD8: + { const bool branch_taken = ctx.gpr[2] == 0u; + // nop + if (branch_taken) { + goto SB_L_088B4DE4; + } + goto SB_L_088B4DE0; + } + +SB_L_088B4DE0: + aot_mem.aot_store8(ctx.gpr[18] + static_cast(48), static_cast(ctx.gpr[22])); + goto SB_L_088B4DE4; + +SB_L_088B4DE4: + ctx.gpr[17] = (ctx.gpr[17] + static_cast(1)); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(224))); + ctx.gpr[4] = (static_cast(ctx.gpr[17]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[16] = (ctx.gpr[16] + static_cast(4)); + if (branch_taken) { + goto SB_L_088B4DB8; + } + goto SB_L_088B4DF8; + } + +SB_L_088B4DF8: + ctx.gpr[17] = (0u | 0u); + ctx.gpr[4] = (static_cast(ctx.gpr[17]) < static_cast(ctx.gpr[30]) ? 1u : 0u); + if (ctx.gpr[4] == 0u) { + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(232))); + goto SB_L_088B4E54; + } + goto SB_L_088B4E08; + +SB_L_088B4E08: + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(264))); + goto SB_L_088B4E0C; + +SB_L_088B4E0C: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[23] + static_cast(64))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] << 4u); + ctx.gpr[6] = (ctx.gpr[4] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[6]); + ctx.gpr[5] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[21] | 0u); + ctx.gpr[6] = (ctx.gpr[19] | 0u); + ctx.gpr[31] = (0x088B4E34u); + ctx.gpr[7] = (ctx.gpr[20] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 382u, 0x088B3060u>(ctx, &aot_mem) && ctx.pc == 0x088B4E34u) goto SB_L_088B4E34; + TIER2_SB_RETURN(); + +SB_L_088B4E34: + { const bool branch_taken = ctx.gpr[2] == 0u; + // nop + if (branch_taken) { + goto SB_L_088B4E40; + } + goto SB_L_088B4E3C; + } + +SB_L_088B4E3C: + aot_mem.aot_store8(ctx.gpr[18] + static_cast(48), static_cast(ctx.gpr[22])); + goto SB_L_088B4E40; + +SB_L_088B4E40: + ctx.gpr[17] = (ctx.gpr[17] + static_cast(1)); + ctx.gpr[4] = (static_cast(ctx.gpr[17]) < static_cast(ctx.gpr[30]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[16] = (ctx.gpr[16] + static_cast(4)); + if (branch_taken) { + goto SB_L_088B4E0C; + } + goto SB_L_088B4E50; + } + +SB_L_088B4E50: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(232))); + goto SB_L_088B4E54; + +SB_L_088B4E54: + ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(228))); + ctx.gpr[19] = (ctx.gpr[19] + static_cast(32)); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(232), ctx.gpr[4]); + ctx.gpr[21] = (ctx.gpr[21] + static_cast(32)); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(272))); + ctx.gpr[20] = (ctx.gpr[20] + static_cast(4)); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[6]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(228), ctx.gpr[5]); + if (branch_taken) { + goto SB_L_088B4D6C; + } + goto SB_L_088B4E80; + } + +SB_L_088B4E80: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(272))); + ctx.gpr[16] = (0u | 0u); + ctx.gpr[4] = (static_cast(ctx.gpr[16]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[18] = (ctx.gpr[29] + static_cast(160)); + if (branch_taken) { + goto SB_L_088B4F70; + } + goto SB_L_088B4E94; + } + +SB_L_088B4E94: + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(284))); + ctx.gpr[19] = (ctx.gpr[29] + static_cast(176)); + ctx.gpr[4] = (0u | 0u); + ctx.gpr[17] = (ctx.gpr[17] + ctx.gpr[4]); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(256))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(272))); + goto SB_L_088B4EAC; + +SB_L_088B4EAC: + ctx.gpr[4] = (ctx.gpr[29] + ctx.gpr[16]); + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(48))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_088B4F60; + } + goto SB_L_088B4EBC; + } + +SB_L_088B4EBC: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(176), std::bit_cast(ctx.fpr[12])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(4))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(180), std::bit_cast(ctx.fpr[12])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(8))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(184), std::bit_cast(ctx.fpr[12])); + ctx.gpr[4] = (ctx.gpr[18] | 0u); + ctx.gpr[5] = (ctx.gpr[20] | 0u); + ctx.gpr[31] = (0x088B4EE4u); + ctx.gpr[6] = (ctx.gpr[19] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 73u, 0x088B086Cu>(ctx, &aot_mem) && ctx.pc == 0x088B4EE4u) goto SB_L_088B4EE4; + TIER2_SB_RETURN(); + +SB_L_088B4EE4: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + ctx.gpr[4] = (std::bit_cast(ctx.fpr[12])); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[18] + static_cast(4))); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[13])); + ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[18] + static_cast(8))); + ctx.gpr[6] = (std::bit_cast(ctx.fpr[14])); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(0), ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(4), ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(8), ctx.gpr[6]); + ctx.fpr[15] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(16))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(176), std::bit_cast(ctx.fpr[15])); + ctx.fpr[15] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(20))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(180), std::bit_cast(ctx.fpr[15])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(24))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(184), std::bit_cast(ctx.fpr[12])); + { const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast(16); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast(32); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } + { const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix(vfpu_matrix, 36u, 3u); + ctx.read_vfpu_vector_ct<7u, 3u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 3u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix(vfpu_result, 0u, vfpu_side); } + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[18] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.gpr[4] = (ctx.gpr[17] + static_cast(16)); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[18] + static_cast(4))); + ctx.gpr[6] = (std::bit_cast(ctx.fpr[13])); + ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[18] + static_cast(8))); + ctx.gpr[7] = (std::bit_cast(ctx.fpr[14])); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(4), ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(8), ctx.gpr[7]); + goto SB_L_088B4F60; + +SB_L_088B4F60: + ctx.gpr[16] = (ctx.gpr[16] + static_cast(1)); + ctx.gpr[4] = (static_cast(ctx.gpr[16]) < static_cast(ctx.gpr[21]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[17] = (ctx.gpr[17] + static_cast(32)); + if (branch_taken) { + goto SB_L_088B4EAC; + } + goto SB_L_088B4F70; + } + +SB_L_088B4F70: + ctx.gpr[2] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(260))); + goto SB_L_088B4F74; + +SB_L_088B4F74: + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(296))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(300))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(304))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(308))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(312))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(316))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(320))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(324))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(328))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(332))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(336))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(352)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0044; + + +#undef TIER2_SB_RETURN +} + +} // namespace vcs diff --git a/profiles/vcs/host/vcs_tier2_cluster_physics.cpp b/profiles/vcs/host/vcs_tier2_cluster_physics.cpp new file mode 100644 index 0000000..9779100 --- /dev/null +++ b/profiles/vcs/host/vcs_tier2_cluster_physics.cpp @@ -0,0 +1,428 @@ +// AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. +// Tier-2 SUPERBLOCK V2 cluster: physics +#include "vcs_tier2_superblocks.hpp" +#include "psprecomp/runtime.hpp" +#include "generated_units.hpp" + +#include + +namespace vcs { +using namespace psprecomp; + +void tier2_superblock_physics(psprecomp::Runtime &rt, + psprecomp::AllegrexContext &ctx, + psprecomp::GuestMemory::AotFastView &aot_mem, + std::uint32_t entry_pc) { + tier2_detail::SampleScope tier2_scope(Tier2ClusterId::Physics); + auto &tier2_stats = tier2_scope.stats(); + 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; + +#define TIER2_SB_RETURN() do { 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)rt.tier2_complete_fused_transfers(ctx, tier2_tail_count_); --tier2_return_depth; (void)rt.tier2_complete_fused_transfers(ctx, 1u); } if (tier2_pending_transfers != 0u) { (void)rt.tier2_complete_fused_transfers(ctx, tier2_pending_transfers); tier2_pending_transfers = 0u; } return; } while (false) + + goto TIER2_ENTRY_DISPATCH; + +TIER2_FUSED_RETURN_DISPATCH: + switch (tier2_resume_pc) { + case 0x08A094D8u: goto SB_L_08A094D8; + case 0x08A094E0u: goto SB_L_08A094E0; + case 0x08A09524u: goto SB_L_08A09524; + case 0x08A09574u: goto SB_L_08A09574; + case 0x08A0958Cu: goto SB_L_08A0958C; + case 0x08A09B2Cu: goto SB_L_08A09B2C; + case 0x08A09BE4u: goto SB_L_08A09BE4; + case 0x08A09C10u: goto SB_L_08A09C10; + case 0x08A09C1Cu: goto SB_L_08A09C1C; + case 0x08A09C44u: goto SB_L_08A09C44; + case 0x08A09C4Cu: goto SB_L_08A09C4C; + case 0x08A09C64u: goto SB_L_08A09C64; + case 0x08A09C9Cu: goto SB_L_08A09C9C; + case 0x08A09CA4u: goto SB_L_08A09CA4; + case 0x08A09CBCu: goto SB_L_08A09CBC; + default: break; + } + switch (tier2_resume_unit) { + + default: break; + } + ctx.pc = tier2_resume_pc; + TIER2_SB_RETURN(); + +TIER2_LOCAL_DISPATCH_U0129: + 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 (!rt.tier2_complete_fused_transfers(ctx, tier2_nested_tail)) + tier2_same_context = false; + } + --tier2_return_depth; + if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + tier2_same_context = false; + if (!tier2_same_context) TIER2_SB_RETURN(); + goto TIER2_FUSED_RETURN_DISPATCH; + } + switch (local_pc) { + case 0x08A094D8u: goto SB_L_08A094D8; + case 0x08A094E0u: goto SB_L_08A094E0; + case 0x08A09524u: goto SB_L_08A09524; + case 0x08A09574u: goto SB_L_08A09574; + case 0x08A0958Cu: goto SB_L_08A0958C; + case 0x08A09B2Cu: goto SB_L_08A09B2C; + case 0x08A09BE4u: goto SB_L_08A09BE4; + case 0x08A09C10u: goto SB_L_08A09C10; + case 0x08A09C1Cu: goto SB_L_08A09C1C; + case 0x08A09C44u: goto SB_L_08A09C44; + case 0x08A09C4Cu: goto SB_L_08A09C4C; + case 0x08A09C64u: goto SB_L_08A09C64; + case 0x08A09C9Cu: goto SB_L_08A09C9C; + case 0x08A09CA4u: goto SB_L_08A09CA4; + case 0x08A09CBCu: goto SB_L_08A09CBC; + default: + ctx.pc = local_pc; + TIER2_SB_RETURN(); + } + + +TIER2_ENTRY_DISPATCH: + switch (entry_pc) { + case 0x08A09B2Cu: goto SB_L_08A09B2C; + default: + ctx.pc = entry_pc; + ++tier2_stats.fallbacks; + TIER2_SB_RETURN(); + } + +SB_L_08A094D8: + { const bool branch_taken = ctx.gpr[5] == 0u; + ctx.gpr[6] = (ctx.gpr[6] & 1u); + if (branch_taken) { + goto SB_L_08A0958C; + } + goto SB_L_08A094E0; + } + +SB_L_08A094E0: + ctx.gpr[6] = (ctx.gpr[6] & 255u); + ctx.gpr[7] = (39680u << 16u); + ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); + ctx.gpr[7] = (2236u << 16u); + ctx.gpr[8] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast(29552))); + aot_mem.aot_store32(ctx.gpr[8] + static_cast(0), ctx.gpr[6]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast(29552))); + ctx.gpr[8] = (4608u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[7] + static_cast(29552), ctx.gpr[6]); + ctx.gpr[8] = (ctx.gpr[8] + static_cast(277)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[8]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast(29552))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(2)); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); + { const bool branch_taken = ctx.gpr[4] == 0u; + aot_mem.aot_store32(ctx.gpr[7] + static_cast(29552), ctx.gpr[6]); + if (branch_taken) { + goto SB_L_08A09574; + } + goto SB_L_08A09524; + } + +SB_L_08A09524: + ctx.gpr[8] = (ctx.gpr[4] >> 8u); + ctx.gpr[9] = (15u << 16u); + ctx.gpr[8] = (ctx.gpr[8] & ctx.gpr[9]); + ctx.gpr[9] = (ctx.gpr[7] + static_cast(29552)); + aot_mem.aot_store32(ctx.gpr[9] + static_cast(20), ctx.gpr[8]); + ctx.gpr[9] = (4096u << 16u); + ctx.gpr[8] = (ctx.gpr[8] | ctx.gpr[9]); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[8]); + ctx.gpr[8] = (256u << 16u); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast(29552))); + ctx.gpr[8] = (ctx.gpr[8] + static_cast(-1)); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[8]); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); + ctx.gpr[8] = (256u << 16u); + aot_mem.aot_store32(ctx.gpr[7] + static_cast(29552), ctx.gpr[6]); + ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[8]); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast(29552))); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[7] + static_cast(29552), ctx.gpr[6]); + goto SB_L_08A09574; + +SB_L_08A09574: + ctx.gpr[4] = (1028u << 16u); + ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast(29552))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[7] + static_cast(29552), ctx.gpr[4]); + goto SB_L_08A0958C; + +SB_L_08A0958C: + jump_target = ctx.gpr[31]; + // nop + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0129; + +SB_L_08A09B2C: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-16)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[16]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[17]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), ctx.gpr[18]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[19]); + // PSP CACHE is a no-op in coherent host memory. + ctx.set_vfpu_scalar_bits_ct<30u>(ctx.gpr[16]); + ctx.set_vfpu_scalar_bits_ct<62u>(ctx.gpr[17]); + ctx.set_vfpu_scalar_bits_ct<94u>(ctx.gpr[18]); + ctx.set_vfpu_scalar_bits_ct<126u>(ctx.gpr[31]); + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-16)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[19]); + ctx.gpr[19] = (0u | 0u); + ctx.gpr[8] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(4)))))); + ctx.gpr[9] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(6)))))); + ctx.gpr[10] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(8)))))); + ctx.set_vfpu_scalar_bits_ct<29u>(ctx.gpr[8]); + ctx.set_vfpu_scalar_bits_ct<61u>(ctx.gpr[9]); + ctx.set_vfpu_scalar_bits_ct<93u>(ctx.gpr[10]); + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_ct<29u, 3u>(vfpu_s); + ctx.apply_vfpu_source_prefix_ct<3u, 0u>(vfpu_s); + const float vfpu_scale = std::ldexp(1.0f, -static_cast(15u)); + for (std::uint32_t vfpu_i = 0; vfpu_i < 3u; ++vfpu_i) { + const auto vfpu_integer = static_cast(std::bit_cast(vfpu_s[vfpu_i])); + vfpu_d[vfpu_i] = static_cast(vfpu_integer) * vfpu_scale; + } + ctx.write_vfpu_vector_with_destination_prefix_ct<29u, 3u>(vfpu_d); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix(vfpu_matrix, 48u, 4u); + ctx.read_vfpu_vector_ct<29u, 4u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 4u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix(vfpu_result, 12u, vfpu_side); } + ctx.execute_vfpu_vcmp_ct<12u, 31u, 4u, 7u>(); + // vflush: architectural no-op that retains VFPU prefixes + ctx.gpr[11] = (ctx.vfpu_scalar_bits_ct<131u>()); + ctx.gpr[11] = (ctx.gpr[11] & 15u); + ctx.gpr[11] = (ctx.gpr[11] << 16u); + ctx.gpr[8] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(14)))))); + ctx.gpr[9] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(16)))))); + ctx.gpr[10] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(18)))))); + ctx.set_vfpu_scalar_bits_ct<28u>(ctx.gpr[8]); + ctx.set_vfpu_scalar_bits_ct<60u>(ctx.gpr[9]); + ctx.set_vfpu_scalar_bits_ct<92u>(ctx.gpr[10]); + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_ct<28u, 3u>(vfpu_s); + ctx.apply_vfpu_source_prefix_ct<3u, 0u>(vfpu_s); + const float vfpu_scale = std::ldexp(1.0f, -static_cast(15u)); + for (std::uint32_t vfpu_i = 0; vfpu_i < 3u; ++vfpu_i) { + const auto vfpu_integer = static_cast(std::bit_cast(vfpu_s[vfpu_i])); + vfpu_d[vfpu_i] = static_cast(vfpu_integer) * vfpu_scale; + } + ctx.write_vfpu_vector_with_destination_prefix_ct<28u, 3u>(vfpu_d); } + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix(vfpu_matrix, 48u, 4u); + ctx.read_vfpu_vector_ct<28u, 4u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 4u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix(vfpu_result, 12u, vfpu_side); } + ctx.execute_vfpu_vcmp_ct<12u, 31u, 4u, 7u>(); + // vflush: architectural no-op that retains VFPU prefixes + ctx.gpr[12] = (ctx.vfpu_scalar_bits_ct<131u>()); + ctx.gpr[12] = (ctx.gpr[12] & 15u); + ctx.gpr[12] = (ctx.gpr[12] << 8u); + if (!ctx.execute_signed_add(5u, 5u, 5u)) { rt.arithmetic_overflow(0x08A09BC8u, 0x00A52820u); TIER2_SB_RETURN(); } + ctx.gpr[8] = (ctx.gpr[5] << 2u); + if (!ctx.execute_signed_add(5u, 5u, 8u)) { rt.arithmetic_overflow(0x08A09BD0u, 0x00A82820u); TIER2_SB_RETURN(); } + if (!ctx.execute_signed_add(18u, 4u, 5u)) { rt.arithmetic_overflow(0x08A09BD4u, 0x00859020u); TIER2_SB_RETURN(); } + ctx.gpr[16] = (ctx.gpr[11] | ctx.gpr[12]); + ctx.gpr[17] = (ctx.gpr[4] + static_cast(20)); + ctx.gpr[5] = (0u + static_cast(0)); + goto SB_L_08A09BE4; + +SB_L_08A09BE4: + // PSP CACHE is a no-op in coherent host memory. + ctx.gpr[8] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(4)))))); + ctx.gpr[9] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(6)))))); + ctx.gpr[10] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(8)))))); + ctx.set_vfpu_scalar_bits_ct<15u>(ctx.gpr[8]); + ctx.set_vfpu_scalar_bits_ct<47u>(ctx.gpr[9]); + ctx.set_vfpu_scalar_bits_ct<79u>(ctx.gpr[10]); + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_ct<15u, 3u>(vfpu_s); + ctx.apply_vfpu_source_prefix_ct<3u, 0u>(vfpu_s); + const float vfpu_scale = std::ldexp(1.0f, -static_cast(15u)); + for (std::uint32_t vfpu_i = 0; vfpu_i < 3u; ++vfpu_i) { + const auto vfpu_integer = static_cast(std::bit_cast(vfpu_s[vfpu_i])); + vfpu_d[vfpu_i] = static_cast(vfpu_integer) * vfpu_scale; + } + ctx.write_vfpu_vector_with_destination_prefix_ct<15u, 3u>(vfpu_d); } + ctx.execute_vfpu_vcmp_ct<15u, 28u, 3u, 1u>(); + if (((ctx.vfpu_ctrl[3] >> 5u) & 1u) != 0u) { + ctx.gpr[11] = ((ctx.gpr[16] >> 8u) & 0x000000FFu); + goto SB_L_08A09C9C; + } + goto SB_L_08A09C10; + +SB_L_08A09C10: + ctx.execute_vfpu_vcmp_ct<15u, 29u, 3u, 1u>(); + if (((ctx.vfpu_ctrl[3] >> 5u) & 1u) != 0u) { + ctx.gpr[11] = ((ctx.gpr[16] >> 16u) & 0x000000FFu); + goto SB_L_08A09C9C; + } + goto SB_L_08A09C1C; + +SB_L_08A09C1C: + { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; + ctx.read_vfpu_matrix(vfpu_matrix, 48u, 4u); + ctx.read_vfpu_vector_ct<15u, 4u>(vfpu_target_raw); + constexpr std::uint32_t vfpu_side = 4u; + constexpr std::uint32_t vfpu_input_length = 3u; + for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; + if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } + float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], + vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; + ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); + ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); + for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; + const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; + const std::uint32_t vfpu_last_lane = vfpu_side - 1u; + ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | + ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); + ctx.write_vfpu_vector_with_destination_prefix(vfpu_result, 12u, vfpu_side); } + ctx.execute_vfpu_vcmp_ct<12u, 31u, 4u, 7u>(); + // vflush: architectural no-op that retains VFPU prefixes + ctx.gpr[11] = (ctx.vfpu_scalar_bits_ct<131u>()); + ctx.gpr[11] = (ctx.gpr[11] & 15u); + ctx.gpr[16] = (ctx.gpr[16] | ctx.gpr[11]); + ctx.gpr[16] = (ctx.gpr[16] << 8u); + ctx.execute_vfpu_vcmp_ct<28u, 29u, 3u, 1u>(); + { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 5u) & 1u) != 0u; + // nop + if (branch_taken) { + goto SB_L_08A09CA4; + } + goto SB_L_08A09C44; + } + +SB_L_08A09C44: + { const bool branch_taken = ctx.gpr[16] == 0u; + ctx.gpr[11] = (ctx.gpr[16] | 0u); + if (branch_taken) { + goto SB_L_08A09CA4; + } + goto SB_L_08A09C4C; + } + +SB_L_08A09C4C: + ctx.gpr[11] = (ctx.gpr[11] >> 8u); + ctx.gpr[11] = (ctx.gpr[11] & ctx.gpr[16]); + ctx.gpr[11] = (ctx.gpr[11] >> 8u); + ctx.gpr[11] = (ctx.gpr[11] & ctx.gpr[16]); + { const bool branch_taken = ctx.gpr[11] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A09CA4; + } + goto SB_L_08A09C64; + } + +SB_L_08A09C64: + ctx.gpr[31] = (0x08A09C6Cu); + ctx.gpr[6] = (ctx.gpr[19] ^ ctx.gpr[5]); + goto SB_L_08A094D8; + +SB_L_08A09C9C: + ctx.gpr[16] = (ctx.gpr[16] | ctx.gpr[11]); + ctx.gpr[16] = (ctx.gpr[16] << 8u); + goto SB_L_08A09CA4; + +SB_L_08A09CA4: + ctx.gpr[19] = (ctx.gpr[19] ^ 1u); + ctx.gpr[17] = (ctx.gpr[17] + static_cast(10)); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(1)); + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<28u, 3u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<29u, 3u>(vfpu_d); } + if (ctx.gpr[17] != ctx.gpr[18]) { + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<15u, 3u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<28u, 3u>(vfpu_d); } + goto SB_L_08A09BE4; + } + goto SB_L_08A09CBC; + +SB_L_08A09CBC: + ctx.gpr[31] = (0x08A09CC4u); + ctx.gpr[6] = (ctx.gpr[19] ^ ctx.gpr[5]); + goto SB_L_08A094D8; + + +#undef TIER2_SB_RETURN +} + +} // namespace vcs diff --git a/profiles/vcs/host/vcs_tier2_cluster_world.cpp b/profiles/vcs/host/vcs_tier2_cluster_world.cpp new file mode 100644 index 0000000..2ed374e --- /dev/null +++ b/profiles/vcs/host/vcs_tier2_cluster_world.cpp @@ -0,0 +1,5106 @@ +// AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. +// Tier-2 SUPERBLOCK V2 cluster: world +#include "vcs_tier2_superblocks.hpp" +#include "psprecomp/runtime.hpp" +#include "generated_units.hpp" + +#include + +namespace vcs { +using namespace psprecomp; + +void tier2_superblock_world(psprecomp::Runtime &rt, + psprecomp::AllegrexContext &ctx, + psprecomp::GuestMemory::AotFastView &aot_mem, + std::uint32_t entry_pc) { + tier2_detail::SampleScope tier2_scope(Tier2ClusterId::World); + auto &tier2_stats = tier2_scope.stats(); + 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; + +#define TIER2_SB_RETURN() do { 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)rt.tier2_complete_fused_transfers(ctx, tier2_tail_count_); --tier2_return_depth; (void)rt.tier2_complete_fused_transfers(ctx, 1u); } if (tier2_pending_transfers != 0u) { (void)rt.tier2_complete_fused_transfers(ctx, tier2_pending_transfers); tier2_pending_transfers = 0u; } return; } while (false) + + goto TIER2_ENTRY_DISPATCH; + +TIER2_FUSED_RETURN_DISPATCH: + switch (tier2_resume_pc) { + case 0x08A79AB4u: goto SB_L_08A79AB4; + case 0x08A79AD4u: goto SB_L_08A79AD4; + case 0x08A79ADCu: goto SB_L_08A79ADC; + case 0x08A79AE4u: goto SB_L_08A79AE4; + case 0x08A79AF0u: goto SB_L_08A79AF0; + case 0x08A79B00u: goto SB_L_08A79B00; + case 0x08A79B08u: goto SB_L_08A79B08; + case 0x08A79B10u: goto SB_L_08A79B10; + case 0x08A79B14u: goto SB_L_08A79B14; + case 0x08A79DF8u: goto SB_L_08A79DF8; + case 0x08A79E30u: goto SB_L_08A79E30; + case 0x08A79E34u: goto SB_L_08A79E34; + case 0x08A79E50u: goto SB_L_08A79E50; + case 0x08A79E64u: goto SB_L_08A79E64; + case 0x08A79E78u: goto SB_L_08A79E78; + case 0x08A79E7Cu: goto SB_L_08A79E7C; + case 0x08A79E98u: goto SB_L_08A79E98; + case 0x08A79EACu: goto SB_L_08A79EAC; + case 0x08A79EC0u: goto SB_L_08A79EC0; + case 0x08A79EC4u: goto SB_L_08A79EC4; + case 0x08A79EE0u: goto SB_L_08A79EE0; + case 0x08A79EF4u: goto SB_L_08A79EF4; + case 0x08A79F00u: goto SB_L_08A79F00; + case 0x08A79F04u: goto SB_L_08A79F04; + case 0x08A79F1Cu: goto SB_L_08A79F1C; + case 0x08A79F28u: goto SB_L_08A79F28; + case 0x08A79F5Cu: goto SB_L_08A79F5C; + case 0x08A79F80u: goto SB_L_08A79F80; + case 0x08A79F88u: goto SB_L_08A79F88; + case 0x08A79F90u: goto SB_L_08A79F90; + case 0x08A79FB0u: goto SB_L_08A79FB0; + case 0x08A79FB4u: goto SB_L_08A79FB4; + case 0x08A79FC8u: goto SB_L_08A79FC8; + case 0x08A79FD4u: goto SB_L_08A79FD4; + case 0x08A79FF0u: goto SB_L_08A79FF0; + case 0x08A79FF8u: goto SB_L_08A79FF8; + case 0x08A7A00Cu: goto SB_L_08A7A00C; + case 0x08A7A014u: goto SB_L_08A7A014; + case 0x08A7A01Cu: goto SB_L_08A7A01C; + case 0x08A7A024u: goto SB_L_08A7A024; + case 0x08A7A038u: goto SB_L_08A7A038; + case 0x08A7A040u: goto SB_L_08A7A040; + case 0x08A7A044u: goto SB_L_08A7A044; + case 0x08A7A054u: goto SB_L_08A7A054; + case 0x08A7A060u: goto SB_L_08A7A060; + case 0x08A7A068u: goto SB_L_08A7A068; + case 0x08A7A06Cu: goto SB_L_08A7A06C; + case 0x08A7A074u: goto SB_L_08A7A074; + case 0x08A7A664u: goto SB_L_08A7A664; + case 0x08A7A690u: goto SB_L_08A7A690; + case 0x08A7A6ACu: goto SB_L_08A7A6AC; + case 0x08A7A6B8u: goto SB_L_08A7A6B8; + case 0x08A7A6C0u: goto SB_L_08A7A6C0; + case 0x08A7A6D0u: goto SB_L_08A7A6D0; + case 0x08A7A6ECu: goto SB_L_08A7A6EC; + case 0x08A7A704u: goto SB_L_08A7A704; + case 0x08A7A708u: goto SB_L_08A7A708; + case 0x08A7A70Cu: goto SB_L_08A7A70C; + case 0x08A7A714u: goto SB_L_08A7A714; + case 0x08A7A730u: goto SB_L_08A7A730; + case 0x08A7A738u: goto SB_L_08A7A738; + case 0x08A7A75Cu: goto SB_L_08A7A75C; + case 0x08A7A774u: goto SB_L_08A7A774; + case 0x08A7A778u: goto SB_L_08A7A778; + case 0x08A7A784u: goto SB_L_08A7A784; + case 0x08A7A79Cu: goto SB_L_08A7A79C; + case 0x08A7A7B8u: goto SB_L_08A7A7B8; + case 0x08A7A7C0u: goto SB_L_08A7A7C0; + case 0x08A7A7C8u: goto SB_L_08A7A7C8; + case 0x08A7A7E0u: goto SB_L_08A7A7E0; + case 0x08A7A7F0u: goto SB_L_08A7A7F0; + case 0x08A7A7F8u: goto SB_L_08A7A7F8; + case 0x08A7A800u: goto SB_L_08A7A800; + case 0x08A7A808u: goto SB_L_08A7A808; + case 0x08A7A810u: goto SB_L_08A7A810; + case 0x08A7A818u: goto SB_L_08A7A818; + case 0x08A7A834u: goto SB_L_08A7A834; + case 0x08A7A844u: goto SB_L_08A7A844; + case 0x08A7A854u: goto SB_L_08A7A854; + case 0x08A7A86Cu: goto SB_L_08A7A86C; + case 0x08A7A880u: goto SB_L_08A7A880; + case 0x08A7A88Cu: goto SB_L_08A7A88C; + case 0x08A7A894u: goto SB_L_08A7A894; + case 0x08A7A89Cu: goto SB_L_08A7A89C; + case 0x08A7A8ACu: goto SB_L_08A7A8AC; + case 0x08A7A8B8u: goto SB_L_08A7A8B8; + case 0x08A7A8D0u: goto SB_L_08A7A8D0; + case 0x08A7A8E4u: goto SB_L_08A7A8E4; + case 0x08A7A8FCu: goto SB_L_08A7A8FC; + case 0x08A7A904u: goto SB_L_08A7A904; + case 0x08A7A90Cu: goto SB_L_08A7A90C; + case 0x08A7A928u: goto SB_L_08A7A928; + case 0x08A7A94Cu: goto SB_L_08A7A94C; + case 0x08A7AA6Cu: goto SB_L_08A7AA6C; + case 0x08A7AA74u: goto SB_L_08A7AA74; + case 0x08A7AA7Cu: goto SB_L_08A7AA7C; + case 0x08A7AA90u: goto SB_L_08A7AA90; + case 0x08A7AAB0u: goto SB_L_08A7AAB0; + case 0x08A7AAD0u: goto SB_L_08A7AAD0; + case 0x08A7AADCu: goto SB_L_08A7AADC; + case 0x08A7AAE4u: goto SB_L_08A7AAE4; + case 0x08A7AAECu: goto SB_L_08A7AAEC; + case 0x08A7AAF0u: goto SB_L_08A7AAF0; + case 0x08A7AB0Cu: goto SB_L_08A7AB0C; + case 0x08A7AB24u: goto SB_L_08A7AB24; + case 0x08A7AB28u: goto SB_L_08A7AB28; + case 0x08A7AB30u: goto SB_L_08A7AB30; + case 0x08A7AB38u: goto SB_L_08A7AB38; + case 0x08A7AB54u: goto SB_L_08A7AB54; + case 0x08A7AB6Cu: goto SB_L_08A7AB6C; + case 0x08A7AB80u: goto SB_L_08A7AB80; + case 0x08A7AB9Cu: goto SB_L_08A7AB9C; + case 0x08A7ABA4u: goto SB_L_08A7ABA4; + case 0x08A7ABC0u: goto SB_L_08A7ABC0; + case 0x08A7ABD0u: goto SB_L_08A7ABD0; + case 0x08A7ABE0u: goto SB_L_08A7ABE0; + case 0x08A7ABE4u: goto SB_L_08A7ABE4; + case 0x08A7AC10u: goto SB_L_08A7AC10; + case 0x08A7AC40u: goto SB_L_08A7AC40; + case 0x08A7AC48u: goto SB_L_08A7AC48; + case 0x08A7AC50u: goto SB_L_08A7AC50; + case 0x08A7AC58u: goto SB_L_08A7AC58; + case 0x08A7AC60u: goto SB_L_08A7AC60; + case 0x08A7AC68u: goto SB_L_08A7AC68; + case 0x08A7AC74u: goto SB_L_08A7AC74; + case 0x08A7AC7Cu: goto SB_L_08A7AC7C; + case 0x08A7AC98u: goto SB_L_08A7AC98; + case 0x08A7ACACu: goto SB_L_08A7ACAC; + case 0x08A7ACB0u: goto SB_L_08A7ACB0; + case 0x08A7ACB8u: goto SB_L_08A7ACB8; + case 0x08A7ACECu: goto SB_L_08A7ACEC; + case 0x08A7ACF4u: goto SB_L_08A7ACF4; + case 0x08A7AD00u: goto SB_L_08A7AD00; + case 0x08A7AD14u: goto SB_L_08A7AD14; + case 0x08A7AD1Cu: goto SB_L_08A7AD1C; + case 0x08A7AD24u: goto SB_L_08A7AD24; + case 0x08A7AD34u: goto SB_L_08A7AD34; + case 0x08A7AD3Cu: goto SB_L_08A7AD3C; + case 0x08A7AD40u: goto SB_L_08A7AD40; + case 0x08A7AD48u: goto SB_L_08A7AD48; + case 0x08A7AD54u: goto SB_L_08A7AD54; + case 0x08A7AF74u: goto SB_L_08A7AF74; + case 0x08A7AFB8u: goto SB_L_08A7AFB8; + case 0x08A7AFC0u: goto SB_L_08A7AFC0; + case 0x08A7AFC8u: goto SB_L_08A7AFC8; + case 0x08A7AFD0u: goto SB_L_08A7AFD0; + case 0x08A7B5A0u: goto SB_L_08A7B5A0; + case 0x08A7B5A8u: goto SB_L_08A7B5A8; + case 0x08A7B5B0u: goto SB_L_08A7B5B0; + case 0x08A7B5C4u: goto SB_L_08A7B5C4; + case 0x08A7B5CCu: goto SB_L_08A7B5CC; + case 0x08A7B604u: goto SB_L_08A7B604; + case 0x08A7B610u: goto SB_L_08A7B610; + case 0x08A7B61Cu: goto SB_L_08A7B61C; + case 0x08A7B630u: goto SB_L_08A7B630; + case 0x08A7B64Cu: goto SB_L_08A7B64C; + case 0x08A7B654u: goto SB_L_08A7B654; + case 0x08A7B65Cu: goto SB_L_08A7B65C; + case 0x08A7B660u: goto SB_L_08A7B660; + case 0x08A7B910u: goto SB_L_08A7B910; + case 0x08A7CEC8u: goto SB_L_08A7CEC8; + case 0x08A7CEFCu: goto SB_L_08A7CEFC; + case 0x08A7CF0Cu: goto SB_L_08A7CF0C; + case 0x08A7CF1Cu: goto SB_L_08A7CF1C; + case 0x08A7CF28u: goto SB_L_08A7CF28; + case 0x08A7CF44u: goto SB_L_08A7CF44; + case 0x08A7CF4Cu: goto SB_L_08A7CF4C; + case 0x08A7CF54u: goto SB_L_08A7CF54; + case 0x08A7CF5Cu: goto SB_L_08A7CF5C; + case 0x08A7CF64u: goto SB_L_08A7CF64; + case 0x08A7CF74u: goto SB_L_08A7CF74; + case 0x08A7CF90u: goto SB_L_08A7CF90; + case 0x08A7CFACu: goto SB_L_08A7CFAC; + case 0x08A7CFC8u: goto SB_L_08A7CFC8; + case 0x08A7CFDCu: goto SB_L_08A7CFDC; + case 0x08A7CFF0u: goto SB_L_08A7CFF0; + case 0x08A7D000u: goto SB_L_08A7D000; + case 0x08A7D008u: goto SB_L_08A7D008; + case 0x08A7D014u: goto SB_L_08A7D014; + case 0x08A7D01Cu: goto SB_L_08A7D01C; + case 0x08A7D020u: goto SB_L_08A7D020; + case 0x08A7D02Cu: goto SB_L_08A7D02C; + case 0x08A7D038u: goto SB_L_08A7D038; + case 0x08A7D054u: goto SB_L_08A7D054; + case 0x08A7D05Cu: goto SB_L_08A7D05C; + case 0x08A7D064u: goto SB_L_08A7D064; + case 0x08A7D070u: goto SB_L_08A7D070; + case 0x08A7D078u: goto SB_L_08A7D078; + case 0x08A7D080u: goto SB_L_08A7D080; + case 0x08A7D088u: goto SB_L_08A7D088; + case 0x08A7D090u: goto SB_L_08A7D090; + case 0x08A7D094u: goto SB_L_08A7D094; + case 0x08A7D0A0u: goto SB_L_08A7D0A0; + case 0x08A7D0A8u: goto SB_L_08A7D0A8; + case 0x08A7D0B8u: goto SB_L_08A7D0B8; + case 0x08A7D0D0u: goto SB_L_08A7D0D0; + case 0x08A7D0D8u: goto SB_L_08A7D0D8; + case 0x08A7D0E4u: goto SB_L_08A7D0E4; + case 0x08A7D0F4u: goto SB_L_08A7D0F4; + case 0x08A7D104u: goto SB_L_08A7D104; + case 0x08A7D11Cu: goto SB_L_08A7D11C; + case 0x08A7D124u: goto SB_L_08A7D124; + case 0x08A7D12Cu: goto SB_L_08A7D12C; + case 0x08A7D144u: goto SB_L_08A7D144; + case 0x08A7D14Cu: goto SB_L_08A7D14C; + case 0x08A7D158u: goto SB_L_08A7D158; + case 0x08A7D168u: goto SB_L_08A7D168; + case 0x08A7D178u: goto SB_L_08A7D178; + case 0x08A7D190u: goto SB_L_08A7D190; + case 0x08A7D198u: goto SB_L_08A7D198; + case 0x08A7D1A4u: goto SB_L_08A7D1A4; + case 0x08A7D1B4u: goto SB_L_08A7D1B4; + case 0x08A7D1C4u: goto SB_L_08A7D1C4; + case 0x08A7D1D0u: goto SB_L_08A7D1D0; + case 0x08A7D1ECu: goto SB_L_08A7D1EC; + case 0x08A7D1F4u: goto SB_L_08A7D1F4; + case 0x08A7D210u: goto SB_L_08A7D210; + case 0x08A7D214u: goto SB_L_08A7D214; + case 0x08A7D228u: goto SB_L_08A7D228; + case 0x08A7D238u: goto SB_L_08A7D238; + case 0x08A7D23Cu: goto SB_L_08A7D23C; + case 0x08A7D244u: goto SB_L_08A7D244; + case 0x08A7D258u: goto SB_L_08A7D258; + case 0x08A7D270u: goto SB_L_08A7D270; + case 0x08A7D274u: goto SB_L_08A7D274; + case 0x08A7D280u: goto SB_L_08A7D280; + case 0x08A7D2BCu: goto SB_L_08A7D2BC; + case 0x08A7D2C4u: goto SB_L_08A7D2C4; + case 0x08A7D2C8u: goto SB_L_08A7D2C8; + case 0x08A7D2D0u: goto SB_L_08A7D2D0; + case 0x08A7D2DCu: goto SB_L_08A7D2DC; + case 0x08A7D314u: goto SB_L_08A7D314; + case 0x08A7D31Cu: goto SB_L_08A7D31C; + case 0x08A7D32Cu: goto SB_L_08A7D32C; + case 0x08A7D334u: goto SB_L_08A7D334; + case 0x08A7D344u: goto SB_L_08A7D344; + case 0x08A7D350u: goto SB_L_08A7D350; + case 0x08A7D360u: goto SB_L_08A7D360; + case 0x08A7D370u: goto SB_L_08A7D370; + case 0x08A7D380u: goto SB_L_08A7D380; + case 0x08A7D390u: goto SB_L_08A7D390; + case 0x08A7D398u: goto SB_L_08A7D398; + case 0x08A7D3B4u: goto SB_L_08A7D3B4; + case 0x08A7D3C4u: goto SB_L_08A7D3C4; + case 0x08A7D3CCu: goto SB_L_08A7D3CC; + case 0x08A7D3D4u: goto SB_L_08A7D3D4; + case 0x08A7D3E8u: goto SB_L_08A7D3E8; + case 0x08A7D3F0u: goto SB_L_08A7D3F0; + case 0x08A7D400u: goto SB_L_08A7D400; + case 0x08A7D410u: goto SB_L_08A7D410; + case 0x08A7D420u: goto SB_L_08A7D420; + case 0x08A7D430u: goto SB_L_08A7D430; + case 0x08A7D440u: goto SB_L_08A7D440; + case 0x08A7D45Cu: goto SB_L_08A7D45C; + case 0x08A7D464u: goto SB_L_08A7D464; + case 0x08A7D46Cu: goto SB_L_08A7D46C; + case 0x08A7D474u: goto SB_L_08A7D474; + case 0x08A7D4ACu: goto SB_L_08A7D4AC; + case 0x08A7D4DCu: goto SB_L_08A7D4DC; + case 0x08A7D4E4u: goto SB_L_08A7D4E4; + case 0x08A7D4F4u: goto SB_L_08A7D4F4; + case 0x08A7D4FCu: goto SB_L_08A7D4FC; + case 0x08A7D50Cu: goto SB_L_08A7D50C; + case 0x08A7D518u: goto SB_L_08A7D518; + case 0x08A7D528u: goto SB_L_08A7D528; + case 0x08A7D538u: goto SB_L_08A7D538; + case 0x08A7D548u: goto SB_L_08A7D548; + case 0x08A7D558u: goto SB_L_08A7D558; + case 0x08A7D560u: goto SB_L_08A7D560; + case 0x08A7D580u: goto SB_L_08A7D580; + case 0x08A7D588u: goto SB_L_08A7D588; + case 0x08A7D590u: goto SB_L_08A7D590; + case 0x08A7D5A4u: goto SB_L_08A7D5A4; + case 0x08A7D5B0u: goto SB_L_08A7D5B0; + case 0x08A7D5C0u: goto SB_L_08A7D5C0; + case 0x08A7D5D0u: goto SB_L_08A7D5D0; + case 0x08A7D5E0u: goto SB_L_08A7D5E0; + case 0x08A7D5F0u: goto SB_L_08A7D5F0; + case 0x08A7D60Cu: goto SB_L_08A7D60C; + case 0x08A7D618u: goto SB_L_08A7D618; + case 0x08A7D62Cu: goto SB_L_08A7D62C; + case 0x08A7D634u: goto SB_L_08A7D634; + case 0x08A7D63Cu: goto SB_L_08A7D63C; + case 0x08A7D644u: goto SB_L_08A7D644; + case 0x08A7D64Cu: goto SB_L_08A7D64C; + case 0x08A7D65Cu: goto SB_L_08A7D65C; + case 0x08A7D664u: goto SB_L_08A7D664; + case 0x08A7D66Cu: goto SB_L_08A7D66C; + case 0x08A7D674u: goto SB_L_08A7D674; + case 0x08A7D6ACu: goto SB_L_08A7D6AC; + case 0x08A7D6C4u: goto SB_L_08A7D6C4; + case 0x08A7D6D4u: goto SB_L_08A7D6D4; + case 0x08A7D6E0u: goto SB_L_08A7D6E0; + case 0x08A7D6F4u: goto SB_L_08A7D6F4; + case 0x08A7D6FCu: goto SB_L_08A7D6FC; + case 0x08A7D704u: goto SB_L_08A7D704; + case 0x08A7D70Cu: goto SB_L_08A7D70C; + case 0x08A7D714u: goto SB_L_08A7D714; + case 0x08A7D724u: goto SB_L_08A7D724; + case 0x08A7D72Cu: goto SB_L_08A7D72C; + case 0x08A7D734u: goto SB_L_08A7D734; + case 0x08A7D73Cu: goto SB_L_08A7D73C; + case 0x08A7D774u: goto SB_L_08A7D774; + case 0x08A7D78Cu: goto SB_L_08A7D78C; + case 0x08A7D7A4u: goto SB_L_08A7D7A4; + case 0x08A7D7D0u: goto SB_L_08A7D7D0; + case 0x08A7D7D8u: goto SB_L_08A7D7D8; + case 0x08A7D7E8u: goto SB_L_08A7D7E8; + case 0x08A7D7F0u: goto SB_L_08A7D7F0; + case 0x08A7D7F4u: goto SB_L_08A7D7F4; + case 0x08A7D810u: goto SB_L_08A7D810; + case 0x08A7D824u: goto SB_L_08A7D824; + case 0x08A7D830u: goto SB_L_08A7D830; + case 0x08A7D840u: goto SB_L_08A7D840; + case 0x08A7D84Cu: goto SB_L_08A7D84C; + case 0x08A7D858u: goto SB_L_08A7D858; + case 0x08A7D864u: goto SB_L_08A7D864; + case 0x08A7D870u: goto SB_L_08A7D870; + case 0x08A7D880u: goto SB_L_08A7D880; + case 0x08A7D88Cu: goto SB_L_08A7D88C; + case 0x08A7D898u: goto SB_L_08A7D898; + case 0x08A7D8B0u: goto SB_L_08A7D8B0; + case 0x08A7D8C4u: goto SB_L_08A7D8C4; + case 0x08A7D8D0u: goto SB_L_08A7D8D0; + case 0x08A7D8E0u: goto SB_L_08A7D8E0; + case 0x08A7D8F0u: goto SB_L_08A7D8F0; + case 0x08A7D8F4u: goto SB_L_08A7D8F4; + case 0x08A7D900u: goto SB_L_08A7D900; + case 0x08A7D914u: goto SB_L_08A7D914; + case 0x08A7D91Cu: goto SB_L_08A7D91C; + case 0x08A7D924u: goto SB_L_08A7D924; + case 0x08A7D92Cu: goto SB_L_08A7D92C; + case 0x08A7D934u: goto SB_L_08A7D934; + case 0x08A7D944u: goto SB_L_08A7D944; + case 0x08A7D954u: goto SB_L_08A7D954; + case 0x08A7D95Cu: goto SB_L_08A7D95C; + case 0x08A7D968u: goto SB_L_08A7D968; + case 0x08A7D97Cu: goto SB_L_08A7D97C; + case 0x08A7D98Cu: goto SB_L_08A7D98C; + case 0x08A7D994u: goto SB_L_08A7D994; + case 0x08A7D9A0u: goto SB_L_08A7D9A0; + case 0x08A7D9ACu: goto SB_L_08A7D9AC; + case 0x08A7D9C4u: goto SB_L_08A7D9C4; + case 0x08A7D9CCu: goto SB_L_08A7D9CC; + case 0x08A7D9DCu: goto SB_L_08A7D9DC; + case 0x08A7D9E8u: goto SB_L_08A7D9E8; + case 0x08A7D9F8u: goto SB_L_08A7D9F8; + case 0x08A7DA04u: goto SB_L_08A7DA04; + case 0x08A7DA0Cu: goto SB_L_08A7DA0C; + case 0x08A7DA28u: goto SB_L_08A7DA28; + case 0x08A7DA30u: goto SB_L_08A7DA30; + case 0x08A7DA38u: goto SB_L_08A7DA38; + case 0x08A7DA4Cu: goto SB_L_08A7DA4C; + case 0x08A7DA58u: goto SB_L_08A7DA58; + case 0x08A7DA68u: goto SB_L_08A7DA68; + case 0x08A7DA78u: goto SB_L_08A7DA78; + case 0x08A7DA80u: goto SB_L_08A7DA80; + case 0x08A7DA8Cu: goto SB_L_08A7DA8C; + case 0x08A7DAA4u: goto SB_L_08A7DAA4; + case 0x08A7DAB8u: goto SB_L_08A7DAB8; + case 0x08A7DAC4u: goto SB_L_08A7DAC4; + case 0x08A7DAD4u: goto SB_L_08A7DAD4; + case 0x08A7DAE4u: goto SB_L_08A7DAE4; + case 0x08A7DAE8u: goto SB_L_08A7DAE8; + case 0x08A7DAF4u: goto SB_L_08A7DAF4; + case 0x08A7DB08u: goto SB_L_08A7DB08; + case 0x08A7DB10u: goto SB_L_08A7DB10; + case 0x08A7DB18u: goto SB_L_08A7DB18; + case 0x08A7DB20u: goto SB_L_08A7DB20; + case 0x08A7DB28u: goto SB_L_08A7DB28; + case 0x08A7DB30u: goto SB_L_08A7DB30; + case 0x08A7DB38u: goto SB_L_08A7DB38; + case 0x08A7DB44u: goto SB_L_08A7DB44; + case 0x08A7DB54u: goto SB_L_08A7DB54; + case 0x08A7DB5Cu: goto SB_L_08A7DB5C; + case 0x08A7DB64u: goto SB_L_08A7DB64; + case 0x08A7DB6Cu: goto SB_L_08A7DB6C; + case 0x08A7DB88u: goto SB_L_08A7DB88; + case 0x08A7DB90u: goto SB_L_08A7DB90; + case 0x08A7DB98u: goto SB_L_08A7DB98; + case 0x08A7DB9Cu: goto SB_L_08A7DB9C; + case 0x08A7EC68u: goto SB_L_08A7EC68; + case 0x08A7ECB4u: goto SB_L_08A7ECB4; + case 0x08A7ECBCu: goto SB_L_08A7ECBC; + case 0x08A7ECD0u: goto SB_L_08A7ECD0; + case 0x08A7ED14u: goto SB_L_08A7ED14; + case 0x08A7ED28u: goto SB_L_08A7ED28; + case 0x08A7ED3Cu: goto SB_L_08A7ED3C; + case 0x08A7F028u: goto SB_L_08A7F028; + case 0x08A7F030u: goto SB_L_08A7F030; + case 0x08A7F048u: goto SB_L_08A7F048; + case 0x08A7F080u: goto SB_L_08A7F080; + case 0x08A7F0CCu: goto SB_L_08A7F0CC; + case 0x08A7F0D4u: goto SB_L_08A7F0D4; + case 0x08A7F0E8u: goto SB_L_08A7F0E8; + case 0x08A7F12Cu: goto SB_L_08A7F12C; + case 0x08A7F140u: goto SB_L_08A7F140; + case 0x08A7F154u: goto SB_L_08A7F154; + case 0x08A7F480u: goto SB_L_08A7F480; + case 0x08A7F488u: goto SB_L_08A7F488; + case 0x08A7F4A0u: goto SB_L_08A7F4A0; + case 0x08A7FAA4u: goto SB_L_08A7FAA4; + default: break; + } + switch (tier2_resume_unit) { + + default: break; + } + ctx.pc = tier2_resume_pc; + TIER2_SB_RETURN(); + +TIER2_LOCAL_DISPATCH_U0157: + 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 (!rt.tier2_complete_fused_transfers(ctx, tier2_nested_tail)) + tier2_same_context = false; + } + --tier2_return_depth; + if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + tier2_same_context = false; + if (!tier2_same_context) TIER2_SB_RETURN(); + goto TIER2_FUSED_RETURN_DISPATCH; + } + switch (local_pc) { + case 0x08A79AB4u: goto SB_L_08A79AB4; + case 0x08A79AD4u: goto SB_L_08A79AD4; + case 0x08A79ADCu: goto SB_L_08A79ADC; + case 0x08A79AE4u: goto SB_L_08A79AE4; + case 0x08A79AF0u: goto SB_L_08A79AF0; + case 0x08A79B00u: goto SB_L_08A79B00; + case 0x08A79B08u: goto SB_L_08A79B08; + case 0x08A79B10u: goto SB_L_08A79B10; + case 0x08A79B14u: goto SB_L_08A79B14; + case 0x08A79DF8u: goto SB_L_08A79DF8; + case 0x08A79E30u: goto SB_L_08A79E30; + case 0x08A79E34u: goto SB_L_08A79E34; + case 0x08A79E50u: goto SB_L_08A79E50; + case 0x08A79E64u: goto SB_L_08A79E64; + case 0x08A79E78u: goto SB_L_08A79E78; + case 0x08A79E7Cu: goto SB_L_08A79E7C; + case 0x08A79E98u: goto SB_L_08A79E98; + case 0x08A79EACu: goto SB_L_08A79EAC; + case 0x08A79EC0u: goto SB_L_08A79EC0; + case 0x08A79EC4u: goto SB_L_08A79EC4; + case 0x08A79EE0u: goto SB_L_08A79EE0; + case 0x08A79EF4u: goto SB_L_08A79EF4; + case 0x08A79F00u: goto SB_L_08A79F00; + case 0x08A79F04u: goto SB_L_08A79F04; + case 0x08A79F1Cu: goto SB_L_08A79F1C; + case 0x08A79F28u: goto SB_L_08A79F28; + case 0x08A79F5Cu: goto SB_L_08A79F5C; + case 0x08A79F80u: goto SB_L_08A79F80; + case 0x08A79F88u: goto SB_L_08A79F88; + case 0x08A79F90u: goto SB_L_08A79F90; + case 0x08A79FB0u: goto SB_L_08A79FB0; + case 0x08A79FB4u: goto SB_L_08A79FB4; + case 0x08A79FC8u: goto SB_L_08A79FC8; + case 0x08A79FD4u: goto SB_L_08A79FD4; + case 0x08A79FF0u: goto SB_L_08A79FF0; + case 0x08A79FF8u: goto SB_L_08A79FF8; + case 0x08A7A00Cu: goto SB_L_08A7A00C; + case 0x08A7A014u: goto SB_L_08A7A014; + case 0x08A7A01Cu: goto SB_L_08A7A01C; + case 0x08A7A024u: goto SB_L_08A7A024; + case 0x08A7A038u: goto SB_L_08A7A038; + case 0x08A7A040u: goto SB_L_08A7A040; + case 0x08A7A044u: goto SB_L_08A7A044; + case 0x08A7A054u: goto SB_L_08A7A054; + case 0x08A7A060u: goto SB_L_08A7A060; + case 0x08A7A068u: goto SB_L_08A7A068; + case 0x08A7A06Cu: goto SB_L_08A7A06C; + case 0x08A7A074u: goto SB_L_08A7A074; + case 0x08A7A664u: goto SB_L_08A7A664; + case 0x08A7A690u: goto SB_L_08A7A690; + case 0x08A7A6ACu: goto SB_L_08A7A6AC; + case 0x08A7A6B8u: goto SB_L_08A7A6B8; + case 0x08A7A6C0u: goto SB_L_08A7A6C0; + case 0x08A7A6D0u: goto SB_L_08A7A6D0; + case 0x08A7A6ECu: goto SB_L_08A7A6EC; + case 0x08A7A704u: goto SB_L_08A7A704; + case 0x08A7A708u: goto SB_L_08A7A708; + case 0x08A7A70Cu: goto SB_L_08A7A70C; + case 0x08A7A714u: goto SB_L_08A7A714; + case 0x08A7A730u: goto SB_L_08A7A730; + case 0x08A7A738u: goto SB_L_08A7A738; + case 0x08A7A75Cu: goto SB_L_08A7A75C; + case 0x08A7A774u: goto SB_L_08A7A774; + case 0x08A7A778u: goto SB_L_08A7A778; + case 0x08A7A784u: goto SB_L_08A7A784; + case 0x08A7A79Cu: goto SB_L_08A7A79C; + case 0x08A7A7B8u: goto SB_L_08A7A7B8; + case 0x08A7A7C0u: goto SB_L_08A7A7C0; + case 0x08A7A7C8u: goto SB_L_08A7A7C8; + case 0x08A7A7E0u: goto SB_L_08A7A7E0; + case 0x08A7A7F0u: goto SB_L_08A7A7F0; + case 0x08A7A7F8u: goto SB_L_08A7A7F8; + case 0x08A7A800u: goto SB_L_08A7A800; + case 0x08A7A808u: goto SB_L_08A7A808; + case 0x08A7A810u: goto SB_L_08A7A810; + case 0x08A7A818u: goto SB_L_08A7A818; + case 0x08A7A834u: goto SB_L_08A7A834; + case 0x08A7A844u: goto SB_L_08A7A844; + case 0x08A7A854u: goto SB_L_08A7A854; + case 0x08A7A86Cu: goto SB_L_08A7A86C; + case 0x08A7A880u: goto SB_L_08A7A880; + case 0x08A7A88Cu: goto SB_L_08A7A88C; + case 0x08A7A894u: goto SB_L_08A7A894; + case 0x08A7A89Cu: goto SB_L_08A7A89C; + case 0x08A7A8ACu: goto SB_L_08A7A8AC; + case 0x08A7A8B8u: goto SB_L_08A7A8B8; + case 0x08A7A8D0u: goto SB_L_08A7A8D0; + case 0x08A7A8E4u: goto SB_L_08A7A8E4; + case 0x08A7A8FCu: goto SB_L_08A7A8FC; + case 0x08A7A904u: goto SB_L_08A7A904; + case 0x08A7A90Cu: goto SB_L_08A7A90C; + case 0x08A7A928u: goto SB_L_08A7A928; + case 0x08A7A94Cu: goto SB_L_08A7A94C; + case 0x08A7AA6Cu: goto SB_L_08A7AA6C; + case 0x08A7AA74u: goto SB_L_08A7AA74; + case 0x08A7AA7Cu: goto SB_L_08A7AA7C; + case 0x08A7AA90u: goto SB_L_08A7AA90; + case 0x08A7AAB0u: goto SB_L_08A7AAB0; + case 0x08A7AAD0u: goto SB_L_08A7AAD0; + case 0x08A7AADCu: goto SB_L_08A7AADC; + case 0x08A7AAE4u: goto SB_L_08A7AAE4; + case 0x08A7AAECu: goto SB_L_08A7AAEC; + case 0x08A7AAF0u: goto SB_L_08A7AAF0; + case 0x08A7AB0Cu: goto SB_L_08A7AB0C; + case 0x08A7AB24u: goto SB_L_08A7AB24; + case 0x08A7AB28u: goto SB_L_08A7AB28; + case 0x08A7AB30u: goto SB_L_08A7AB30; + case 0x08A7AB38u: goto SB_L_08A7AB38; + case 0x08A7AB54u: goto SB_L_08A7AB54; + case 0x08A7AB6Cu: goto SB_L_08A7AB6C; + case 0x08A7AB80u: goto SB_L_08A7AB80; + case 0x08A7AB9Cu: goto SB_L_08A7AB9C; + case 0x08A7ABA4u: goto SB_L_08A7ABA4; + case 0x08A7ABC0u: goto SB_L_08A7ABC0; + case 0x08A7ABD0u: goto SB_L_08A7ABD0; + case 0x08A7ABE0u: goto SB_L_08A7ABE0; + case 0x08A7ABE4u: goto SB_L_08A7ABE4; + case 0x08A7AC10u: goto SB_L_08A7AC10; + case 0x08A7AC40u: goto SB_L_08A7AC40; + case 0x08A7AC48u: goto SB_L_08A7AC48; + case 0x08A7AC50u: goto SB_L_08A7AC50; + case 0x08A7AC58u: goto SB_L_08A7AC58; + case 0x08A7AC60u: goto SB_L_08A7AC60; + case 0x08A7AC68u: goto SB_L_08A7AC68; + case 0x08A7AC74u: goto SB_L_08A7AC74; + case 0x08A7AC7Cu: goto SB_L_08A7AC7C; + case 0x08A7AC98u: goto SB_L_08A7AC98; + case 0x08A7ACACu: goto SB_L_08A7ACAC; + case 0x08A7ACB0u: goto SB_L_08A7ACB0; + case 0x08A7ACB8u: goto SB_L_08A7ACB8; + case 0x08A7ACECu: goto SB_L_08A7ACEC; + case 0x08A7ACF4u: goto SB_L_08A7ACF4; + case 0x08A7AD00u: goto SB_L_08A7AD00; + case 0x08A7AD14u: goto SB_L_08A7AD14; + case 0x08A7AD1Cu: goto SB_L_08A7AD1C; + case 0x08A7AD24u: goto SB_L_08A7AD24; + case 0x08A7AD34u: goto SB_L_08A7AD34; + case 0x08A7AD3Cu: goto SB_L_08A7AD3C; + case 0x08A7AD40u: goto SB_L_08A7AD40; + case 0x08A7AD48u: goto SB_L_08A7AD48; + case 0x08A7AD54u: goto SB_L_08A7AD54; + case 0x08A7AF74u: goto SB_L_08A7AF74; + case 0x08A7AFB8u: goto SB_L_08A7AFB8; + case 0x08A7AFC0u: goto SB_L_08A7AFC0; + case 0x08A7AFC8u: goto SB_L_08A7AFC8; + case 0x08A7AFD0u: goto SB_L_08A7AFD0; + case 0x08A7B5A0u: goto SB_L_08A7B5A0; + case 0x08A7B5A8u: goto SB_L_08A7B5A8; + case 0x08A7B5B0u: goto SB_L_08A7B5B0; + case 0x08A7B5C4u: goto SB_L_08A7B5C4; + case 0x08A7B5CCu: goto SB_L_08A7B5CC; + case 0x08A7B604u: goto SB_L_08A7B604; + case 0x08A7B610u: goto SB_L_08A7B610; + case 0x08A7B61Cu: goto SB_L_08A7B61C; + case 0x08A7B630u: goto SB_L_08A7B630; + case 0x08A7B64Cu: goto SB_L_08A7B64C; + case 0x08A7B654u: goto SB_L_08A7B654; + case 0x08A7B65Cu: goto SB_L_08A7B65C; + case 0x08A7B660u: goto SB_L_08A7B660; + case 0x08A7B910u: goto SB_L_08A7B910; + default: + ctx.pc = local_pc; + TIER2_SB_RETURN(); + } + +TIER2_LOCAL_DISPATCH_U0158: + 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 (!rt.tier2_complete_fused_transfers(ctx, tier2_nested_tail)) + tier2_same_context = false; + } + --tier2_return_depth; + if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + tier2_same_context = false; + if (!tier2_same_context) TIER2_SB_RETURN(); + goto TIER2_FUSED_RETURN_DISPATCH; + } + switch (local_pc) { + case 0x08A7CEC8u: goto SB_L_08A7CEC8; + case 0x08A7CEFCu: goto SB_L_08A7CEFC; + case 0x08A7CF0Cu: goto SB_L_08A7CF0C; + case 0x08A7CF1Cu: goto SB_L_08A7CF1C; + case 0x08A7CF28u: goto SB_L_08A7CF28; + case 0x08A7CF44u: goto SB_L_08A7CF44; + case 0x08A7CF4Cu: goto SB_L_08A7CF4C; + case 0x08A7CF54u: goto SB_L_08A7CF54; + case 0x08A7CF5Cu: goto SB_L_08A7CF5C; + case 0x08A7CF64u: goto SB_L_08A7CF64; + case 0x08A7CF74u: goto SB_L_08A7CF74; + case 0x08A7CF90u: goto SB_L_08A7CF90; + case 0x08A7CFACu: goto SB_L_08A7CFAC; + case 0x08A7CFC8u: goto SB_L_08A7CFC8; + case 0x08A7CFDCu: goto SB_L_08A7CFDC; + case 0x08A7CFF0u: goto SB_L_08A7CFF0; + case 0x08A7D000u: goto SB_L_08A7D000; + case 0x08A7D008u: goto SB_L_08A7D008; + case 0x08A7D014u: goto SB_L_08A7D014; + case 0x08A7D01Cu: goto SB_L_08A7D01C; + case 0x08A7D020u: goto SB_L_08A7D020; + case 0x08A7D02Cu: goto SB_L_08A7D02C; + case 0x08A7D038u: goto SB_L_08A7D038; + case 0x08A7D054u: goto SB_L_08A7D054; + case 0x08A7D05Cu: goto SB_L_08A7D05C; + case 0x08A7D064u: goto SB_L_08A7D064; + case 0x08A7D070u: goto SB_L_08A7D070; + case 0x08A7D078u: goto SB_L_08A7D078; + case 0x08A7D080u: goto SB_L_08A7D080; + case 0x08A7D088u: goto SB_L_08A7D088; + case 0x08A7D090u: goto SB_L_08A7D090; + case 0x08A7D094u: goto SB_L_08A7D094; + case 0x08A7D0A0u: goto SB_L_08A7D0A0; + case 0x08A7D0A8u: goto SB_L_08A7D0A8; + case 0x08A7D0B8u: goto SB_L_08A7D0B8; + case 0x08A7D0D0u: goto SB_L_08A7D0D0; + case 0x08A7D0D8u: goto SB_L_08A7D0D8; + case 0x08A7D0E4u: goto SB_L_08A7D0E4; + case 0x08A7D0F4u: goto SB_L_08A7D0F4; + case 0x08A7D104u: goto SB_L_08A7D104; + case 0x08A7D11Cu: goto SB_L_08A7D11C; + case 0x08A7D124u: goto SB_L_08A7D124; + case 0x08A7D12Cu: goto SB_L_08A7D12C; + case 0x08A7D144u: goto SB_L_08A7D144; + case 0x08A7D14Cu: goto SB_L_08A7D14C; + case 0x08A7D158u: goto SB_L_08A7D158; + case 0x08A7D168u: goto SB_L_08A7D168; + case 0x08A7D178u: goto SB_L_08A7D178; + case 0x08A7D190u: goto SB_L_08A7D190; + case 0x08A7D198u: goto SB_L_08A7D198; + case 0x08A7D1A4u: goto SB_L_08A7D1A4; + case 0x08A7D1B4u: goto SB_L_08A7D1B4; + case 0x08A7D1C4u: goto SB_L_08A7D1C4; + case 0x08A7D1D0u: goto SB_L_08A7D1D0; + case 0x08A7D1ECu: goto SB_L_08A7D1EC; + case 0x08A7D1F4u: goto SB_L_08A7D1F4; + case 0x08A7D210u: goto SB_L_08A7D210; + case 0x08A7D214u: goto SB_L_08A7D214; + case 0x08A7D228u: goto SB_L_08A7D228; + case 0x08A7D238u: goto SB_L_08A7D238; + case 0x08A7D23Cu: goto SB_L_08A7D23C; + case 0x08A7D244u: goto SB_L_08A7D244; + case 0x08A7D258u: goto SB_L_08A7D258; + case 0x08A7D270u: goto SB_L_08A7D270; + case 0x08A7D274u: goto SB_L_08A7D274; + case 0x08A7D280u: goto SB_L_08A7D280; + case 0x08A7D2BCu: goto SB_L_08A7D2BC; + case 0x08A7D2C4u: goto SB_L_08A7D2C4; + case 0x08A7D2C8u: goto SB_L_08A7D2C8; + case 0x08A7D2D0u: goto SB_L_08A7D2D0; + case 0x08A7D2DCu: goto SB_L_08A7D2DC; + case 0x08A7D314u: goto SB_L_08A7D314; + case 0x08A7D31Cu: goto SB_L_08A7D31C; + case 0x08A7D32Cu: goto SB_L_08A7D32C; + case 0x08A7D334u: goto SB_L_08A7D334; + case 0x08A7D344u: goto SB_L_08A7D344; + case 0x08A7D350u: goto SB_L_08A7D350; + case 0x08A7D360u: goto SB_L_08A7D360; + case 0x08A7D370u: goto SB_L_08A7D370; + case 0x08A7D380u: goto SB_L_08A7D380; + case 0x08A7D390u: goto SB_L_08A7D390; + case 0x08A7D398u: goto SB_L_08A7D398; + case 0x08A7D3B4u: goto SB_L_08A7D3B4; + case 0x08A7D3C4u: goto SB_L_08A7D3C4; + case 0x08A7D3CCu: goto SB_L_08A7D3CC; + case 0x08A7D3D4u: goto SB_L_08A7D3D4; + case 0x08A7D3E8u: goto SB_L_08A7D3E8; + case 0x08A7D3F0u: goto SB_L_08A7D3F0; + case 0x08A7D400u: goto SB_L_08A7D400; + case 0x08A7D410u: goto SB_L_08A7D410; + case 0x08A7D420u: goto SB_L_08A7D420; + case 0x08A7D430u: goto SB_L_08A7D430; + case 0x08A7D440u: goto SB_L_08A7D440; + case 0x08A7D45Cu: goto SB_L_08A7D45C; + case 0x08A7D464u: goto SB_L_08A7D464; + case 0x08A7D46Cu: goto SB_L_08A7D46C; + case 0x08A7D474u: goto SB_L_08A7D474; + case 0x08A7D4ACu: goto SB_L_08A7D4AC; + case 0x08A7D4DCu: goto SB_L_08A7D4DC; + case 0x08A7D4E4u: goto SB_L_08A7D4E4; + case 0x08A7D4F4u: goto SB_L_08A7D4F4; + case 0x08A7D4FCu: goto SB_L_08A7D4FC; + case 0x08A7D50Cu: goto SB_L_08A7D50C; + case 0x08A7D518u: goto SB_L_08A7D518; + case 0x08A7D528u: goto SB_L_08A7D528; + case 0x08A7D538u: goto SB_L_08A7D538; + case 0x08A7D548u: goto SB_L_08A7D548; + case 0x08A7D558u: goto SB_L_08A7D558; + case 0x08A7D560u: goto SB_L_08A7D560; + case 0x08A7D580u: goto SB_L_08A7D580; + case 0x08A7D588u: goto SB_L_08A7D588; + case 0x08A7D590u: goto SB_L_08A7D590; + case 0x08A7D5A4u: goto SB_L_08A7D5A4; + case 0x08A7D5B0u: goto SB_L_08A7D5B0; + case 0x08A7D5C0u: goto SB_L_08A7D5C0; + case 0x08A7D5D0u: goto SB_L_08A7D5D0; + case 0x08A7D5E0u: goto SB_L_08A7D5E0; + case 0x08A7D5F0u: goto SB_L_08A7D5F0; + case 0x08A7D60Cu: goto SB_L_08A7D60C; + case 0x08A7D618u: goto SB_L_08A7D618; + case 0x08A7D62Cu: goto SB_L_08A7D62C; + case 0x08A7D634u: goto SB_L_08A7D634; + case 0x08A7D63Cu: goto SB_L_08A7D63C; + case 0x08A7D644u: goto SB_L_08A7D644; + case 0x08A7D64Cu: goto SB_L_08A7D64C; + case 0x08A7D65Cu: goto SB_L_08A7D65C; + case 0x08A7D664u: goto SB_L_08A7D664; + case 0x08A7D66Cu: goto SB_L_08A7D66C; + case 0x08A7D674u: goto SB_L_08A7D674; + case 0x08A7D6ACu: goto SB_L_08A7D6AC; + case 0x08A7D6C4u: goto SB_L_08A7D6C4; + case 0x08A7D6D4u: goto SB_L_08A7D6D4; + case 0x08A7D6E0u: goto SB_L_08A7D6E0; + case 0x08A7D6F4u: goto SB_L_08A7D6F4; + case 0x08A7D6FCu: goto SB_L_08A7D6FC; + case 0x08A7D704u: goto SB_L_08A7D704; + case 0x08A7D70Cu: goto SB_L_08A7D70C; + case 0x08A7D714u: goto SB_L_08A7D714; + case 0x08A7D724u: goto SB_L_08A7D724; + case 0x08A7D72Cu: goto SB_L_08A7D72C; + case 0x08A7D734u: goto SB_L_08A7D734; + case 0x08A7D73Cu: goto SB_L_08A7D73C; + case 0x08A7D774u: goto SB_L_08A7D774; + case 0x08A7D78Cu: goto SB_L_08A7D78C; + case 0x08A7D7A4u: goto SB_L_08A7D7A4; + case 0x08A7D7D0u: goto SB_L_08A7D7D0; + case 0x08A7D7D8u: goto SB_L_08A7D7D8; + case 0x08A7D7E8u: goto SB_L_08A7D7E8; + case 0x08A7D7F0u: goto SB_L_08A7D7F0; + case 0x08A7D7F4u: goto SB_L_08A7D7F4; + case 0x08A7D810u: goto SB_L_08A7D810; + case 0x08A7D824u: goto SB_L_08A7D824; + case 0x08A7D830u: goto SB_L_08A7D830; + case 0x08A7D840u: goto SB_L_08A7D840; + case 0x08A7D84Cu: goto SB_L_08A7D84C; + case 0x08A7D858u: goto SB_L_08A7D858; + case 0x08A7D864u: goto SB_L_08A7D864; + case 0x08A7D870u: goto SB_L_08A7D870; + case 0x08A7D880u: goto SB_L_08A7D880; + case 0x08A7D88Cu: goto SB_L_08A7D88C; + case 0x08A7D898u: goto SB_L_08A7D898; + case 0x08A7D8B0u: goto SB_L_08A7D8B0; + case 0x08A7D8C4u: goto SB_L_08A7D8C4; + case 0x08A7D8D0u: goto SB_L_08A7D8D0; + case 0x08A7D8E0u: goto SB_L_08A7D8E0; + case 0x08A7D8F0u: goto SB_L_08A7D8F0; + case 0x08A7D8F4u: goto SB_L_08A7D8F4; + case 0x08A7D900u: goto SB_L_08A7D900; + case 0x08A7D914u: goto SB_L_08A7D914; + case 0x08A7D91Cu: goto SB_L_08A7D91C; + case 0x08A7D924u: goto SB_L_08A7D924; + case 0x08A7D92Cu: goto SB_L_08A7D92C; + case 0x08A7D934u: goto SB_L_08A7D934; + case 0x08A7D944u: goto SB_L_08A7D944; + case 0x08A7D954u: goto SB_L_08A7D954; + case 0x08A7D95Cu: goto SB_L_08A7D95C; + case 0x08A7D968u: goto SB_L_08A7D968; + case 0x08A7D97Cu: goto SB_L_08A7D97C; + case 0x08A7D98Cu: goto SB_L_08A7D98C; + case 0x08A7D994u: goto SB_L_08A7D994; + case 0x08A7D9A0u: goto SB_L_08A7D9A0; + case 0x08A7D9ACu: goto SB_L_08A7D9AC; + case 0x08A7D9C4u: goto SB_L_08A7D9C4; + case 0x08A7D9CCu: goto SB_L_08A7D9CC; + case 0x08A7D9DCu: goto SB_L_08A7D9DC; + case 0x08A7D9E8u: goto SB_L_08A7D9E8; + case 0x08A7D9F8u: goto SB_L_08A7D9F8; + case 0x08A7DA04u: goto SB_L_08A7DA04; + case 0x08A7DA0Cu: goto SB_L_08A7DA0C; + case 0x08A7DA28u: goto SB_L_08A7DA28; + case 0x08A7DA30u: goto SB_L_08A7DA30; + case 0x08A7DA38u: goto SB_L_08A7DA38; + case 0x08A7DA4Cu: goto SB_L_08A7DA4C; + case 0x08A7DA58u: goto SB_L_08A7DA58; + case 0x08A7DA68u: goto SB_L_08A7DA68; + case 0x08A7DA78u: goto SB_L_08A7DA78; + case 0x08A7DA80u: goto SB_L_08A7DA80; + case 0x08A7DA8Cu: goto SB_L_08A7DA8C; + case 0x08A7DAA4u: goto SB_L_08A7DAA4; + case 0x08A7DAB8u: goto SB_L_08A7DAB8; + case 0x08A7DAC4u: goto SB_L_08A7DAC4; + case 0x08A7DAD4u: goto SB_L_08A7DAD4; + case 0x08A7DAE4u: goto SB_L_08A7DAE4; + case 0x08A7DAE8u: goto SB_L_08A7DAE8; + case 0x08A7DAF4u: goto SB_L_08A7DAF4; + case 0x08A7DB08u: goto SB_L_08A7DB08; + case 0x08A7DB10u: goto SB_L_08A7DB10; + case 0x08A7DB18u: goto SB_L_08A7DB18; + case 0x08A7DB20u: goto SB_L_08A7DB20; + case 0x08A7DB28u: goto SB_L_08A7DB28; + case 0x08A7DB30u: goto SB_L_08A7DB30; + case 0x08A7DB38u: goto SB_L_08A7DB38; + case 0x08A7DB44u: goto SB_L_08A7DB44; + case 0x08A7DB54u: goto SB_L_08A7DB54; + case 0x08A7DB5Cu: goto SB_L_08A7DB5C; + case 0x08A7DB64u: goto SB_L_08A7DB64; + case 0x08A7DB6Cu: goto SB_L_08A7DB6C; + case 0x08A7DB88u: goto SB_L_08A7DB88; + case 0x08A7DB90u: goto SB_L_08A7DB90; + case 0x08A7DB98u: goto SB_L_08A7DB98; + case 0x08A7DB9Cu: goto SB_L_08A7DB9C; + case 0x08A7EC68u: goto SB_L_08A7EC68; + case 0x08A7ECB4u: goto SB_L_08A7ECB4; + case 0x08A7ECBCu: goto SB_L_08A7ECBC; + case 0x08A7ECD0u: goto SB_L_08A7ECD0; + case 0x08A7ED14u: goto SB_L_08A7ED14; + case 0x08A7ED28u: goto SB_L_08A7ED28; + case 0x08A7ED3Cu: goto SB_L_08A7ED3C; + case 0x08A7F028u: goto SB_L_08A7F028; + case 0x08A7F030u: goto SB_L_08A7F030; + case 0x08A7F048u: goto SB_L_08A7F048; + case 0x08A7F080u: goto SB_L_08A7F080; + case 0x08A7F0CCu: goto SB_L_08A7F0CC; + case 0x08A7F0D4u: goto SB_L_08A7F0D4; + case 0x08A7F0E8u: goto SB_L_08A7F0E8; + case 0x08A7F12Cu: goto SB_L_08A7F12C; + case 0x08A7F140u: goto SB_L_08A7F140; + case 0x08A7F154u: goto SB_L_08A7F154; + case 0x08A7F480u: goto SB_L_08A7F480; + case 0x08A7F488u: goto SB_L_08A7F488; + case 0x08A7F4A0u: goto SB_L_08A7F4A0; + case 0x08A7FAA4u: goto SB_L_08A7FAA4; + default: + ctx.pc = local_pc; + TIER2_SB_RETURN(); + } + + +TIER2_ENTRY_DISPATCH: + switch (entry_pc) { + case 0x08A79DF8u: goto SB_L_08A79DF8; + case 0x08A7A94Cu: goto SB_L_08A7A94C; + case 0x08A7A664u: goto SB_L_08A7A664; + case 0x08A7B5A8u: goto SB_L_08A7B5A8; + case 0x08A7EC68u: goto SB_L_08A7EC68; + case 0x08A7F080u: goto SB_L_08A7F080; + default: + ctx.pc = entry_pc; + ++tier2_stats.fallbacks; + TIER2_SB_RETURN(); + } + +SB_L_08A79AB4: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-16)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(472))); + ctx.gpr[6] = (32768u << 16u); + ctx.gpr[5] = (ctx.gpr[5] & ctx.gpr[6]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[16]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[31]); + { const bool branch_taken = ctx.gpr[5] != 0u; + ctx.gpr[16] = (ctx.gpr[4] | 0u); + if (branch_taken) { + goto SB_L_08A79B08; + } + goto SB_L_08A79AD4; + } + +SB_L_08A79AD4: + ctx.gpr[31] = (0x08A79ADCu); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0067_entry, 67u, 195u, 0x08910B38u>(ctx, &aot_mem) && ctx.pc == 0x08A79ADCu) goto SB_L_08A79ADC; + TIER2_SB_RETURN(); + +SB_L_08A79ADC: + { const bool branch_taken = ctx.gpr[2] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A79B00; + } + goto SB_L_08A79AE4; + } + +SB_L_08A79AE4: + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(1152))); + { const bool branch_taken = ctx.gpr[16] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A79B00; + } + goto SB_L_08A79AF0; + } + +SB_L_08A79AF0: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[16] + static_cast(619)))))); + ctx.gpr[4] = (ctx.gpr[4] & 32u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A79B10; + } + goto SB_L_08A79B00; + } + +SB_L_08A79B00: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A79B14; + } + goto SB_L_08A79B08; + } + +SB_L_08A79B08: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 1u); + if (branch_taken) { + goto SB_L_08A79B14; + } + goto SB_L_08A79B10; + } + +SB_L_08A79B10: + ctx.gpr[2] = (0u | 1u); + goto SB_L_08A79B14; + +SB_L_08A79B14: + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(0))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(4))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(16)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0157; + +SB_L_08A79DF8: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-32)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[17]); + ctx.gpr[17] = (2238u << 16u); + ctx.gpr[17] = (ctx.gpr[17] + static_cast(17440)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[16]); + ctx.gpr[16] = (ctx.gpr[17] + static_cast(16)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), ctx.gpr[18]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[19]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[31]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10064))); + ctx.gpr[19] = (0u | 0u); + ctx.gpr[4] = (static_cast(ctx.gpr[19]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[18] = (2279u << 16u); + if (branch_taken) { + goto SB_L_08A79E64; + } + goto SB_L_08A79E30; + } + +SB_L_08A79E30: + ctx.gpr[18] = (ctx.gpr[18] + static_cast(27328)); + goto SB_L_08A79E34; + +SB_L_08A79E34: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(92))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(120)); + ctx.gpr[6] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[5] + static_cast(0)))))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(4))); + jump_target = ctx.gpr[5]; + ctx.gpr[31] = (0x08A79E50u); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[6]); + ctx.pc = jump_target; + if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A79E50u) goto SB_L_08A79E50; + TIER2_SB_RETURN(); + +SB_L_08A79E50: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10064))); + ctx.gpr[19] = (ctx.gpr[19] + static_cast(1)); + ctx.gpr[4] = (static_cast(ctx.gpr[19]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[18] = (ctx.gpr[18] + static_cast(4)); + if (branch_taken) { + goto SB_L_08A79E34; + } + goto SB_L_08A79E64; + } + +SB_L_08A79E64: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10072))); + ctx.gpr[19] = (0u | 0u); + ctx.gpr[4] = (static_cast(ctx.gpr[19]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[18] = (2280u << 16u); + if (branch_taken) { + goto SB_L_08A79EAC; + } + goto SB_L_08A79E78; + } + +SB_L_08A79E78: + ctx.gpr[18] = (ctx.gpr[18] + static_cast(-29568)); + goto SB_L_08A79E7C; + +SB_L_08A79E7C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(92))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(120)); + ctx.gpr[6] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[5] + static_cast(0)))))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(4))); + jump_target = ctx.gpr[5]; + ctx.gpr[31] = (0x08A79E98u); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[6]); + ctx.pc = jump_target; + if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A79E98u) goto SB_L_08A79E98; + TIER2_SB_RETURN(); + +SB_L_08A79E98: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10072))); + ctx.gpr[19] = (ctx.gpr[19] + static_cast(1)); + ctx.gpr[4] = (static_cast(ctx.gpr[19]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[18] = (ctx.gpr[18] + static_cast(4)); + if (branch_taken) { + goto SB_L_08A79E7C; + } + goto SB_L_08A79EAC; + } + +SB_L_08A79EAC: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10068))); + ctx.gpr[19] = (0u | 0u); + ctx.gpr[4] = (static_cast(ctx.gpr[19]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[18] = (2280u << 16u); + if (branch_taken) { + goto SB_L_08A79EF4; + } + goto SB_L_08A79EC0; + } + +SB_L_08A79EC0: + ctx.gpr[18] = (ctx.gpr[18] + static_cast(-30208)); + goto SB_L_08A79EC4; + +SB_L_08A79EC4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(92))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(120)); + ctx.gpr[6] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[5] + static_cast(0)))))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(4))); + jump_target = ctx.gpr[5]; + ctx.gpr[31] = (0x08A79EE0u); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[6]); + ctx.pc = jump_target; + if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A79EE0u) goto SB_L_08A79EE0; + TIER2_SB_RETURN(); + +SB_L_08A79EE0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10068))); + ctx.gpr[19] = (ctx.gpr[19] + static_cast(1)); + ctx.gpr[4] = (static_cast(ctx.gpr[19]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[18] = (ctx.gpr[18] + static_cast(4)); + if (branch_taken) { + goto SB_L_08A79EC4; + } + goto SB_L_08A79EF4; + } + +SB_L_08A79EF4: + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(12))); + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[16]; + // nop + if (branch_taken) { + goto SB_L_08A79F28; + } + goto SB_L_08A79F00; + } + +SB_L_08A79F00: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); + goto SB_L_08A79F04; + +SB_L_08A79F04: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(92))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(120)); + ctx.gpr[6] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[5] + static_cast(0)))))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(4))); + jump_target = ctx.gpr[5]; + ctx.gpr[31] = (0x08A79F1Cu); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[6]); + ctx.pc = jump_target; + if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A79F1Cu) goto SB_L_08A79F1C; + TIER2_SB_RETURN(); + +SB_L_08A79F1C: + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(12))); + if (ctx.gpr[17] != ctx.gpr[16]) { + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); + goto SB_L_08A79F04; + } + goto SB_L_08A79F28; + +SB_L_08A79F28: + ctx.gpr[31] = (0x08A79F30u); + // nop + goto SB_L_08A79F5C; + +SB_L_08A79F5C: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-32)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), std::bit_cast(ctx.fpr[20])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[16]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), ctx.gpr[17]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[18]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[19]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(20), ctx.gpr[31]); + ctx.gpr[31] = (0x08A79F80u); + ctx.gpr[19] = (0u | 1u); + if (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 47u, 0x08960424u>(ctx, &aot_mem) && ctx.pc == 0x08A79F80u) goto SB_L_08A79F80; + TIER2_SB_RETURN(); + +SB_L_08A79F80: + { const bool branch_taken = ctx.gpr[2] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A79FB4; + } + goto SB_L_08A79F88; + } + +SB_L_08A79F88: + ctx.gpr[31] = (0x08A79F90u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 47u, 0x08960424u>(ctx, &aot_mem) && ctx.pc == 0x08A79F90u) goto SB_L_08A79F90; + TIER2_SB_RETURN(); + +SB_L_08A79F90: + ctx.gpr[4] = (ctx.gpr[2] + static_cast(48)); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + ctx.gpr[4] = (49736u << 16u); + ctx.fpr[13] = std::bit_cast(ctx.gpr[4]); + 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_08A79FB4; + } + goto SB_L_08A79FB0; + } + +SB_L_08A79FB0: + ctx.gpr[19] = (0u | 0u); + goto SB_L_08A79FB4; + +SB_L_08A79FB4: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-5496))); + ctx.gpr[18] = (0u | 0u); + ctx.gpr[4] = (static_cast(ctx.gpr[18]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[4] = (49736u << 16u); + if (branch_taken) { + goto SB_L_08A7A054; + } + goto SB_L_08A79FC8; + } + +SB_L_08A79FC8: + ctx.gpr[17] = (0u | 0u); + ctx.fpr[20] = std::bit_cast(ctx.gpr[4]); + ctx.gpr[16] = (8u << 16u); + goto SB_L_08A79FD4; + +SB_L_08A79FD4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-5500))); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[17]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(72))); + ctx.gpr[6] = (ctx.gpr[6] & ctx.gpr[16]); + { const bool branch_taken = ctx.gpr[6] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7A044; + } + goto SB_L_08A79FF0; + } + +SB_L_08A79FF0: + { const bool branch_taken = ctx.gpr[19] == 0u; + ctx.gpr[6] = (ctx.gpr[4] + static_cast(48)); + if (branch_taken) { + goto SB_L_08A7A01C; + } + goto SB_L_08A79FF8; + } + +SB_L_08A79FF8: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[6] + static_cast(8))); + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[20])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = ((ctx.fcr31 & 0x00800000u) != 0u); + // nop + if (branch_taken) { + goto SB_L_08A7A01C; + } + goto SB_L_08A7A00C; + } + +SB_L_08A7A00C: + ctx.gpr[31] = (0x08A7A014u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0142_entry, 142u, 167u, 0x08A3CC80u>(ctx, &aot_mem) && ctx.pc == 0x08A7A014u) goto SB_L_08A7A014; + TIER2_SB_RETURN(); + +SB_L_08A7A014: + { const bool branch_taken = 0u == 0u; + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-5496))); + if (branch_taken) { + goto SB_L_08A7A044; + } + goto SB_L_08A7A01C; + } + +SB_L_08A7A01C: + { const bool branch_taken = ctx.gpr[19] != 0u; + ctx.gpr[6] = (ctx.gpr[4] + static_cast(48)); + if (branch_taken) { + goto SB_L_08A7A044; + } + goto SB_L_08A7A024; + } + +SB_L_08A7A024: + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[6] + static_cast(8))); + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] <= ctx.fpr[20])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); + // nop + if (branch_taken) { + goto SB_L_08A7A044; + } + goto SB_L_08A7A038; + } + +SB_L_08A7A038: + ctx.gpr[31] = (0x08A7A040u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0142_entry, 142u, 167u, 0x08A3CC80u>(ctx, &aot_mem) && ctx.pc == 0x08A7A040u) goto SB_L_08A7A040; + TIER2_SB_RETURN(); + +SB_L_08A7A040: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-5496))); + goto SB_L_08A7A044; + +SB_L_08A7A044: + ctx.gpr[18] = (ctx.gpr[18] + static_cast(1)); + ctx.gpr[4] = (static_cast(ctx.gpr[18]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[17] = (ctx.gpr[17] + static_cast(4)); + if (branch_taken) { + goto SB_L_08A79FD4; + } + goto SB_L_08A7A054; + } + +SB_L_08A7A054: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7A06C; + } + goto SB_L_08A7A060; + } + +SB_L_08A7A060: + ctx.gpr[31] = (0x08A7A068u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0216_entry, 216u, 413u, 0x08B65B0Cu>(ctx, &aot_mem) && ctx.pc == 0x08A7A068u) goto SB_L_08A7A068; + TIER2_SB_RETURN(); + +SB_L_08A7A068: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); + goto SB_L_08A7A06C; + +SB_L_08A7A06C: + ctx.gpr[31] = (0x08A7A074u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 221u, 0x08954F80u>(ctx, &aot_mem) && ctx.pc == 0x08A7A074u) goto SB_L_08A7A074; + TIER2_SB_RETURN(); + +SB_L_08A7A074: + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(0))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(4))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(8))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(16))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(20))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(32)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0157; + +SB_L_08A7A664: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-32)); + ctx.gpr[5] = (ctx.gpr[5] & 255u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[16]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[17]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), ctx.gpr[18]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[19]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[20]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(20), ctx.gpr[21]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(24), ctx.gpr[31]); + { const bool branch_taken = ctx.gpr[5] == 0u; + ctx.gpr[16] = (ctx.gpr[4] | 0u); + if (branch_taken) { + goto SB_L_08A7A714; + } + goto SB_L_08A7A690; + } + +SB_L_08A7A690: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 10u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[17] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7A6D0; + } + goto SB_L_08A7A6AC; + } + +SB_L_08A7A6AC: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5844))); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[18] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + if (branch_taken) { + goto SB_L_08A7A6C0; + } + goto SB_L_08A7A6B8; + } + +SB_L_08A7A6B8: + ctx.gpr[31] = (0x08A7A6C0u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0216_entry, 216u, 339u, 0x08B6572Cu>(ctx, &aot_mem) && ctx.pc == 0x08A7A6C0u) goto SB_L_08A7A6C0; + TIER2_SB_RETURN(); + +SB_L_08A7A6C0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5844))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(276))); + if (ctx.gpr[18] != ctx.gpr[4]) { + ctx.gpr[17] = (0u | 1u); + goto SB_L_08A7A708; + } + goto SB_L_08A7A6D0; + +SB_L_08A7A6D0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 8u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[4] = (ctx.gpr[17] & 255u); + if (branch_taken) { + goto SB_L_08A7A70C; + } + goto SB_L_08A7A6EC; + } + +SB_L_08A7A6EC: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[16] + static_cast(483)))))); + ctx.gpr[4] = (ctx.gpr[4] & 16u); + ctx.gpr[4] = (0u < ctx.gpr[4] ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[4] = (ctx.gpr[17] & 255u); + if (branch_taken) { + goto SB_L_08A7A70C; + } + goto SB_L_08A7A704; + } + +SB_L_08A7A704: + ctx.gpr[17] = (0u | 1u); + goto SB_L_08A7A708; + +SB_L_08A7A708: + ctx.gpr[4] = (ctx.gpr[17] & 255u); + goto SB_L_08A7A70C; + +SB_L_08A7A70C: + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7A738; + } + goto SB_L_08A7A714; + } + +SB_L_08A7A714: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 6u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + if (ctx.gpr[4] != 0u) { + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(2228))); + goto SB_L_08A7A778; + } + goto SB_L_08A7A730; + +SB_L_08A7A730: + { const bool branch_taken = 0u == 0u; + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + if (branch_taken) { + goto SB_L_08A7A75C; + } + goto SB_L_08A7A738; + } + +SB_L_08A7A738: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10076))); + ctx.gpr[5] = (2280u << 16u); + ctx.gpr[6] = (ctx.gpr[4] << 2u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(-21568)); + aot_mem.aot_store32(ctx.gpr[28] + static_cast(10076), ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[6] + ctx.gpr[5]); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[16]); + if (branch_taken) { + goto SB_L_08A7A928; + } + goto SB_L_08A7A75C; + } + +SB_L_08A7A75C: + ctx.gpr[5] = (2u << 16u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + ctx.gpr[4] = (0u < ctx.gpr[4] ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7A784; + } + goto SB_L_08A7A774; + } + +SB_L_08A7A774: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(2228))); + goto SB_L_08A7A778; + +SB_L_08A7A778: + ctx.gpr[5] = (0u | 55u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7A7C0; + } + goto SB_L_08A7A784; + } + +SB_L_08A7A784: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(92))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(144)); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(0)))))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(4))); + jump_target = ctx.gpr[6]; + ctx.gpr[31] = (0x08A7A79Cu); + ctx.gpr[4] = (ctx.gpr[16] + ctx.gpr[5]); + ctx.pc = jump_target; + if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7A79Cu) goto SB_L_08A7A79C; + TIER2_SB_RETURN(); + +SB_L_08A7A79C: + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[19] = (ctx.gpr[19] & 14u); + ctx.gpr[4] = (ctx.gpr[19] ^ 14u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[18] = (ctx.gpr[2] | 0u); + if (branch_taken) { + goto SB_L_08A7A7C8; + } + goto SB_L_08A7A7B8; + } + +SB_L_08A7A7B8: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7A7F8; + } + goto SB_L_08A7A7C0; + } + +SB_L_08A7A7C0: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7A928; + } + goto SB_L_08A7A7C8; + } + +SB_L_08A7A7C8: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(352))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(108))); + ctx.gpr[17] = (ctx.gpr[5] + static_cast(16)); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[31] = (0x08A7A7E0u); + ctx.gpr[19] = (ctx.gpr[4] + ctx.gpr[5]); + if (tier2_return_depth < kTier2ReturnCapacity) { + if (!rt.tier2_enter_fused_transfer<158u, 0x08A7FAA4u>(ctx)) { + ctx.pc = 0x08A7FAA4u; + TIER2_SB_RETURN(); + } + tier2_return_pc[tier2_return_depth] = 0x08A7A7E0u; + tier2_return_unit[tier2_return_depth] = 157u; + tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers; + ++tier2_return_depth; + ++tier2_stats.fused_calls; + goto SB_L_08A7FAA4; + } + ++tier2_stats.fallbacks; + if (rt.invoke_chained_direct<&recomp_unit_0158_entry, 158u, 666u, 0x08A7FAA4u>(ctx, &aot_mem) && ctx.pc == 0x08A7A7E0u) goto SB_L_08A7A7E0; + TIER2_SB_RETURN(); + +SB_L_08A7A7E0: + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(4))); + ctx.gpr[4] = (ctx.gpr[19] | 0u); + jump_target = ctx.gpr[6]; + ctx.gpr[31] = (0x08A7A7F0u); + ctx.gpr[5] = (ctx.gpr[2] | 0u); + ctx.pc = jump_target; + if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7A7F0u) goto SB_L_08A7A7F0; + TIER2_SB_RETURN(); + +SB_L_08A7A7F0: + { const bool branch_taken = 0u == 0u; + ctx.gpr[19] = (ctx.gpr[2] | 0u); + if (branch_taken) { + goto SB_L_08A7A800; + } + goto SB_L_08A7A7F8; + } + +SB_L_08A7A7F8: + ctx.gpr[19] = (ctx.gpr[19] ^ 4u); + ctx.gpr[19] = (ctx.gpr[19] < static_cast(1) ? 1u : 0u); + goto SB_L_08A7A800; + +SB_L_08A7A800: + { const bool branch_taken = ctx.gpr[19] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7A818; + } + goto SB_L_08A7A808; + } + +SB_L_08A7A808: + ctx.gpr[31] = (0x08A7A810u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(80))); + if (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 192u, 0x08945314u>(ctx, &aot_mem) && ctx.pc == 0x08A7A810u) goto SB_L_08A7A810; + TIER2_SB_RETURN(); + +SB_L_08A7A810: + ctx.gpr[31] = (0x08A7A818u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 125u, 0x08944F2Cu>(ctx, &aot_mem) && ctx.pc == 0x08A7A818u) goto SB_L_08A7A818; + TIER2_SB_RETURN(); + +SB_L_08A7A818: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 4u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7A8E4; + } + goto SB_L_08A7A834; + } + +SB_L_08A7A834: + ctx.gpr[20] = (ctx.gpr[16] | 0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(900))); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[5] = (ctx.gpr[4] + static_cast(2228)); + if (branch_taken) { + goto SB_L_08A7A86C; + } + goto SB_L_08A7A844; + } + +SB_L_08A7A844: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); + ctx.gpr[6] = (0u | 55u); + { const bool branch_taken = ctx.gpr[5] != ctx.gpr[6]; + // nop + if (branch_taken) { + goto SB_L_08A7A86C; + } + goto SB_L_08A7A854; + } + +SB_L_08A7A854: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(92))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(128)); + ctx.gpr[6] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[5] + static_cast(0)))))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(4))); + jump_target = ctx.gpr[5]; + ctx.gpr[31] = (0x08A7A86Cu); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[6]); + ctx.pc = jump_target; + if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7A86Cu) goto SB_L_08A7A86C; + TIER2_SB_RETURN(); + +SB_L_08A7A86C: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[20] + static_cast(565))); + ctx.gpr[21] = (0u | 0u); + ctx.gpr[4] = (static_cast(ctx.gpr[21]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[17] = (0u | 55u); + if (branch_taken) { + goto SB_L_08A7A8E4; + } + goto SB_L_08A7A880; + } + +SB_L_08A7A880: + ctx.gpr[4] = (ctx.gpr[20] | 0u); + ctx.gpr[31] = (0x08A7A88Cu); + ctx.gpr[5] = (ctx.gpr[21] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0190_entry, 190u, 663u, 0x08AFEF7Cu>(ctx, &aot_mem) && ctx.pc == 0x08A7A88Cu) goto SB_L_08A7A88C; + TIER2_SB_RETURN(); + +SB_L_08A7A88C: + { const bool branch_taken = ctx.gpr[2] == 0u; + ctx.gpr[4] = (ctx.gpr[20] | 0u); + if (branch_taken) { + goto SB_L_08A7A8D0; + } + goto SB_L_08A7A894; + } + +SB_L_08A7A894: + ctx.gpr[31] = (0x08A7A89Cu); + ctx.gpr[5] = (ctx.gpr[21] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0190_entry, 190u, 663u, 0x08AFEF7Cu>(ctx, &aot_mem) && ctx.pc == 0x08A7A89Cu) goto SB_L_08A7A89C; + TIER2_SB_RETURN(); + +SB_L_08A7A89C: + ctx.gpr[4] = (ctx.gpr[2] + static_cast(2228)); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[17]; + // nop + if (branch_taken) { + goto SB_L_08A7A8D0; + } + goto SB_L_08A7A8AC; + } + +SB_L_08A7A8AC: + ctx.gpr[4] = (ctx.gpr[20] | 0u); + ctx.gpr[31] = (0x08A7A8B8u); + ctx.gpr[5] = (ctx.gpr[21] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0190_entry, 190u, 663u, 0x08AFEF7Cu>(ctx, &aot_mem) && ctx.pc == 0x08A7A8B8u) goto SB_L_08A7A8B8; + TIER2_SB_RETURN(); + +SB_L_08A7A8B8: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[2] + static_cast(92))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(128)); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(0)))))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(4))); + jump_target = ctx.gpr[6]; + ctx.gpr[31] = (0x08A7A8D0u); + ctx.gpr[4] = (ctx.gpr[2] + ctx.gpr[5]); + ctx.pc = jump_target; + if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7A8D0u) goto SB_L_08A7A8D0; + TIER2_SB_RETURN(); + +SB_L_08A7A8D0: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[20] + static_cast(565))); + ctx.gpr[21] = (ctx.gpr[21] + static_cast(1)); + ctx.gpr[4] = (static_cast(ctx.gpr[21]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7A880; + } + goto SB_L_08A7A8E4; + } + +SB_L_08A7A8E4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(92))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(128)); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(0)))))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(4))); + jump_target = ctx.gpr[6]; + ctx.gpr[31] = (0x08A7A8FCu); + ctx.gpr[4] = (ctx.gpr[16] + ctx.gpr[5]); + ctx.pc = jump_target; + if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7A8FCu) goto SB_L_08A7A8FC; + TIER2_SB_RETURN(); + +SB_L_08A7A8FC: + { const bool branch_taken = ctx.gpr[19] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7A90C; + } + goto SB_L_08A7A904; + } + +SB_L_08A7A904: + ctx.gpr[31] = (0x08A7A90Cu); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 132u, 0x08944F98u>(ctx, &aot_mem) && ctx.pc == 0x08A7A90Cu) goto SB_L_08A7A90C; + TIER2_SB_RETURN(); + +SB_L_08A7A90C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(92))); + ctx.gpr[5] = (ctx.gpr[18] | 0u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(152)); + ctx.gpr[6] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(0)))))); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(4))); + jump_target = ctx.gpr[7]; + ctx.gpr[31] = (0x08A7A928u); + ctx.gpr[4] = (ctx.gpr[16] + ctx.gpr[6]); + ctx.pc = jump_target; + if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7A928u) goto SB_L_08A7A928; + TIER2_SB_RETURN(); + +SB_L_08A7A928: + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(0))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(4))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(8))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(16))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(20))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(24))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(32)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0157; + +SB_L_08A7A94C: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-80)); + ctx.gpr[4] = (2236u << 16u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(56), ctx.gpr[20]); + ctx.gpr[20] = (ctx.gpr[4] + static_cast(29552)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + ctx.gpr[6] = (8448u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(1)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + ctx.gpr[6] = (59136u << 16u); + aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + ctx.gpr[6] = (8704u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(1)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + ctx.gpr[6] = (8960u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(1)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(40), ctx.gpr[16]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(44), ctx.gpr[17]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(48), ctx.gpr[18]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(52), ctx.gpr[19]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(60), ctx.gpr[21]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(64), ctx.gpr[22]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(68), ctx.gpr[23]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(72), ctx.gpr[30]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(76), ctx.gpr[31]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + ctx.gpr[6] = (51200u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(2)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + ctx.gpr[6] = (57088u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), ctx.gpr[5]); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(50)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + ctx.gpr[6] = (57344u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + ctx.gpr[6] = (57600u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + ctx.gpr[6] = (5888u << 16u); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(29552))); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(1)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (0u | 1u); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(29552))); + aot_mem.aot_store8(ctx.gpr[28] + static_cast(-24632), static_cast(ctx.gpr[5])); + ctx.gpr[5] = (ctx.gpr[6] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(29552), ctx.gpr[5]); + ctx.gpr[4] = (0u | 11u); + ctx.gpr[31] = (0x08A7AA6Cu); + ctx.gpr[5] = (0u | 1u); + if (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 203u, 0x08861668u>(ctx, &aot_mem) && ctx.pc == 0x08A7AA6Cu) goto SB_L_08A7AA6C; + TIER2_SB_RETURN(); + +SB_L_08A7AA6C: + ctx.gpr[31] = (0x08A7AA74u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 129u, 0x08944F6Cu>(ctx, &aot_mem) && ctx.pc == 0x08A7AA74u) goto SB_L_08A7AA74; + TIER2_SB_RETURN(); + +SB_L_08A7AA74: + ctx.gpr[31] = (0x08A7AA7Cu); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 127u, 0x08944F4Cu>(ctx, &aot_mem) && ctx.pc == 0x08A7AA7Cu) goto SB_L_08A7AA7C; + TIER2_SB_RETURN(); + +SB_L_08A7AA7C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10072))); + ctx.gpr[20] = (0u | 0u); + ctx.gpr[4] = (static_cast(ctx.gpr[20]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[4] = (ctx.gpr[28] + static_cast(10048)); + if (branch_taken) { + goto SB_L_08A7AD14; + } + goto SB_L_08A7AA90; + } + +SB_L_08A7AA90: + ctx.gpr[22] = (2280u << 16u); + ctx.gpr[18] = (2236u << 16u); + ctx.gpr[30] = (0u | 55u); + ctx.gpr[23] = (0u | 3u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(36), ctx.gpr[4]); + ctx.gpr[22] = (ctx.gpr[22] + static_cast(-29568)); + ctx.gpr[18] = (ctx.gpr[18] + static_cast(32304)); + ctx.gpr[21] = (2u << 16u); + goto SB_L_08A7AAB0; + +SB_L_08A7AAB0: + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[22] + static_cast(0))); + ctx.gpr[19] = (0u | 0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[21]); + ctx.gpr[4] = (0u < ctx.gpr[4] ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[17] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7AAF0; + } + goto SB_L_08A7AAD0; + } + +SB_L_08A7AAD0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(2228))); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[30]; + // nop + if (branch_taken) { + goto SB_L_08A7AAF0; + } + goto SB_L_08A7AADC; + } + +SB_L_08A7AADC: + ctx.gpr[31] = (0x08A7AAE4u); + ctx.gpr[4] = (ctx.gpr[18] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0134_entry, 134u, 56u, 0x08A1C658u>(ctx, &aot_mem) && ctx.pc == 0x08A7AAE4u) goto SB_L_08A7AAE4; + TIER2_SB_RETURN(); + +SB_L_08A7AAE4: + { const bool branch_taken = ctx.gpr[2] != ctx.gpr[23]; + // nop + if (branch_taken) { + goto SB_L_08A7AAF0; + } + goto SB_L_08A7AAEC; + } + +SB_L_08A7AAEC: + ctx.gpr[17] = (0u | 1u); + goto SB_L_08A7AAF0; + +SB_L_08A7AAF0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 6u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + if (ctx.gpr[4] != 0u) { + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(2228))); + goto SB_L_08A7AB28; + } + goto SB_L_08A7AB0C; + +SB_L_08A7AB0C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[21]); + ctx.gpr[4] = (0u < ctx.gpr[4] ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7ABA4; + } + goto SB_L_08A7AB24; + } + +SB_L_08A7AB24: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(2228))); + goto SB_L_08A7AB28; + +SB_L_08A7AB28: + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[30]; + // nop + if (branch_taken) { + goto SB_L_08A7ABA4; + } + goto SB_L_08A7AB30; + } + +SB_L_08A7AB30: + { const bool branch_taken = ctx.gpr[17] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7ABA4; + } + goto SB_L_08A7AB38; + } + +SB_L_08A7AB38: + ctx.gpr[4] = (ctx.gpr[16] | 0u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(76))); + ctx.gpr[5] = (ctx.gpr[5] & ctx.gpr[21]); + ctx.gpr[5] = (0u < ctx.gpr[5] ? 1u : 0u); + ctx.gpr[5] = (ctx.gpr[5] & 255u); + { const bool branch_taken = ctx.gpr[5] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7AB80; + } + goto SB_L_08A7AB54; + } + +SB_L_08A7AB54: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(236))); + ctx.gpr[4] = (ctx.gpr[4] & 256u); + ctx.gpr[4] = (0u < ctx.gpr[4] ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7AB9C; + } + goto SB_L_08A7AB6C; + } + +SB_L_08A7AB6C: + ctx.gpr[4] = (ctx.gpr[16] | 0u); + ctx.gpr[31] = (0x08A7AB78u); + ctx.gpr[5] = (0u | 0u); + goto SB_L_08A7A664; + +SB_L_08A7AB80: + ctx.gpr[31] = (0x08A7AB88u); + // nop + goto SB_L_08A79AB4; + +SB_L_08A7AB9C: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7AD00; + } + goto SB_L_08A7ABA4; + } + +SB_L_08A7ABA4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 4u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7ACB0; + } + goto SB_L_08A7ABC0; + } + +SB_L_08A7ABC0: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(852))); + ctx.gpr[4] = (0u | 1u); + if (ctx.gpr[5] == ctx.gpr[4]) { + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[18] + static_cast(80))); + goto SB_L_08A7ABE4; + } + goto SB_L_08A7ABD0; + +SB_L_08A7ABD0: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(852))); + ctx.gpr[6] = (0u | 2u); + { const bool branch_taken = ctx.gpr[5] != ctx.gpr[6]; + // nop + if (branch_taken) { + goto SB_L_08A7AC7C; + } + goto SB_L_08A7ABE0; + } + +SB_L_08A7ABE0: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[18] + static_cast(80))); + goto SB_L_08A7ABE4; + +SB_L_08A7ABE4: + ctx.gpr[4] = (ctx.gpr[4] << 5u); + ctx.gpr[5] = (0u - ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] << 2u); + ctx.gpr[5] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] << 2u); + ctx.gpr[4] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[18]); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(112)))))); + ctx.gpr[5] = (0u | 14u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7ACB0; + } + goto SB_L_08A7AC10; + } + +SB_L_08A7AC10: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[18] + static_cast(80))); + ctx.gpr[4] = (ctx.gpr[4] << 5u); + ctx.gpr[5] = (0u - ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] << 2u); + ctx.gpr[5] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] << 2u); + ctx.gpr[4] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[18]); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(112)))))); + ctx.gpr[5] = (0u | 16u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7AC60; + } + goto SB_L_08A7AC40; + } + +SB_L_08A7AC40: + ctx.gpr[31] = (0x08A7AC48u); + ctx.gpr[4] = (ctx.gpr[18] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0134_entry, 134u, 56u, 0x08A1C658u>(ctx, &aot_mem) && ctx.pc == 0x08A7AC48u) goto SB_L_08A7AC48; + TIER2_SB_RETURN(); + +SB_L_08A7AC48: + { const bool branch_taken = ctx.gpr[2] == ctx.gpr[23]; + // nop + if (branch_taken) { + goto SB_L_08A7AC60; + } + goto SB_L_08A7AC50; + } + +SB_L_08A7AC50: + ctx.gpr[31] = (0x08A7AC58u); + ctx.gpr[4] = (ctx.gpr[18] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0134_entry, 134u, 56u, 0x08A1C658u>(ctx, &aot_mem) && ctx.pc == 0x08A7AC58u) goto SB_L_08A7AC58; + TIER2_SB_RETURN(); + +SB_L_08A7AC58: + { const bool branch_taken = ctx.gpr[2] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7ACB0; + } + goto SB_L_08A7AC60; + } + +SB_L_08A7AC60: + ctx.gpr[31] = (0x08A7AC68u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(80))); + if (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 191u, 0x0894530Cu>(ctx, &aot_mem) && ctx.pc == 0x08A7AC68u) goto SB_L_08A7AC68; + TIER2_SB_RETURN(); + +SB_L_08A7AC68: + ctx.gpr[4] = (0u | 255u); + { const bool branch_taken = ctx.gpr[2] != ctx.gpr[4]; + // nop + if (branch_taken) { + goto SB_L_08A7ACB0; + } + goto SB_L_08A7AC74; + } + +SB_L_08A7AC74: + { const bool branch_taken = 0u == 0u; + ctx.gpr[19] = (0u | 1u); + if (branch_taken) { + goto SB_L_08A7ACB0; + } + goto SB_L_08A7AC7C; + } + +SB_L_08A7AC7C: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[5] = (ctx.gpr[5] & 14u); + ctx.gpr[5] = (ctx.gpr[5] ^ 4u); + ctx.gpr[5] = (ctx.gpr[5] < static_cast(1) ? 1u : 0u); + ctx.gpr[5] = (ctx.gpr[5] & 255u); + { const bool branch_taken = ctx.gpr[5] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7ACB0; + } + goto SB_L_08A7AC98; + } + +SB_L_08A7AC98: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(236))); + ctx.gpr[6] = (1024u << 16u); + ctx.gpr[5] = (ctx.gpr[5] & ctx.gpr[6]); + { const bool branch_taken = ctx.gpr[5] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7ACB0; + } + goto SB_L_08A7ACAC; + } + +SB_L_08A7ACAC: + ctx.gpr[19] = (ctx.gpr[4] | 0u); + goto SB_L_08A7ACB0; + +SB_L_08A7ACB0: + { const bool branch_taken = ctx.gpr[19] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7AD00; + } + goto SB_L_08A7ACB8; + } + +SB_L_08A7ACB8: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(36))); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + ctx.gpr[4] = (ctx.gpr[16] + static_cast(48)); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<1u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[29] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + { const std::uint32_t vfpu_address = ctx.gpr[29] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + ctx.execute_vfpu_vdot_ct<28u, 0u, 0u, 3u>(); + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<28u, 1u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = std::fabs(std::sqrt(vfpu_s[i])); + ctx.write_vfpu_vector_with_destination_prefix_ct<28u, 1u>(vfpu_d); } + ctx.gpr[4] = (ctx.vfpu_scalar_bits_ct<28u>()); + ctx.fpr[12] = std::bit_cast(ctx.gpr[4]); + ctx.gpr[31] = (0x08A7ACECu); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 165u, 0x089451D8u>(ctx, &aot_mem) && ctx.pc == 0x08A7ACECu) goto SB_L_08A7ACEC; + TIER2_SB_RETURN(); + +SB_L_08A7ACEC: + { const bool branch_taken = ctx.gpr[2] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7AD00; + } + goto SB_L_08A7ACF4; + } + +SB_L_08A7ACF4: + ctx.gpr[4] = (ctx.gpr[16] | 0u); + ctx.gpr[31] = (0x08A7AD00u); + ctx.gpr[5] = (0u | 0u); + goto SB_L_08A7A664; + +SB_L_08A7AD00: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10072))); + ctx.gpr[20] = (ctx.gpr[20] + static_cast(1)); + ctx.gpr[4] = (static_cast(ctx.gpr[20]) < static_cast(ctx.gpr[4]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] != 0u; + ctx.gpr[22] = (ctx.gpr[22] + static_cast(4)); + if (branch_taken) { + goto SB_L_08A7AAB0; + } + goto SB_L_08A7AD14; + } + +SB_L_08A7AD14: + ctx.gpr[31] = (0x08A7AD1Cu); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 142u, 0x08945050u>(ctx, &aot_mem) && ctx.pc == 0x08A7AD1Cu) goto SB_L_08A7AD1C; + TIER2_SB_RETURN(); + +SB_L_08A7AD1C: + ctx.gpr[31] = (0x08A7AD24u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0126_entry, 126u, 361u, 0x089FD7E4u>(ctx, &aot_mem) && ctx.pc == 0x08A7AD24u) goto SB_L_08A7AD24; + TIER2_SB_RETURN(); + +SB_L_08A7AD24: + aot_mem.aot_store32(ctx.gpr[28] + static_cast(-17680), 0u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5856))); + if (ctx.gpr[4] != 0u) { + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5856))); + goto SB_L_08A7AD40; + } + goto SB_L_08A7AD34; + +SB_L_08A7AD34: + ctx.gpr[31] = (0x08A7AD3Cu); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0216_entry, 216u, 399u, 0x08B65A54u>(ctx, &aot_mem) && ctx.pc == 0x08A7AD3Cu) goto SB_L_08A7AD3C; + TIER2_SB_RETURN(); + +SB_L_08A7AD3C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5856))); + goto SB_L_08A7AD40; + +SB_L_08A7AD40: + ctx.gpr[31] = (0x08A7AD48u); + ctx.gpr[16] = (2236u << 16u); + if (rt.invoke_chained_direct<&recomp_unit_0000_entry, 0u, 199u, 0x08805630u>(ctx, &aot_mem) && ctx.pc == 0x08A7AD48u) goto SB_L_08A7AD48; + TIER2_SB_RETURN(); + +SB_L_08A7AD48: + ctx.gpr[4] = (0u | 11u); + ctx.gpr[31] = (0x08A7AD54u); + ctx.gpr[5] = (0u | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 203u, 0x08861668u>(ctx, &aot_mem) && ctx.pc == 0x08A7AD54u) goto SB_L_08A7AD54; + TIER2_SB_RETURN(); + +SB_L_08A7AD54: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(29552))); + ctx.gpr[5] = (5888u << 16u); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[4] = (0u | 0u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(29552))); + aot_mem.aot_store8(ctx.gpr[28] + static_cast(-24632), static_cast(ctx.gpr[4])); + ctx.gpr[4] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(40))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(44))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(48))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(52))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(56))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(60))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(64))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(68))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(72))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(76))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(80)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0157; + +SB_L_08A7AF74: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-16)); + ctx.gpr[6] = (2236u << 16u); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(29552))); + ctx.gpr[8] = (51456u << 16u); + ctx.gpr[8] = (ctx.gpr[8] + static_cast(256)); + aot_mem.aot_store32(ctx.gpr[7] + static_cast(0), ctx.gpr[8]); + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(29552))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[16]); + ctx.gpr[16] = (ctx.gpr[5] & 255u); + ctx.gpr[5] = (ctx.gpr[7] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[6] + static_cast(29552), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(72))); + ctx.gpr[5] = (32u << 16u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[31]); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7AFD0; + } + goto SB_L_08A7AFB8; + } + +SB_L_08A7AFB8: + ctx.gpr[31] = (0x08A7AFC0u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0200_entry, 200u, 432u, 0x08B26030u>(ctx, &aot_mem) && ctx.pc == 0x08A7AFC0u) goto SB_L_08A7AFC0; + TIER2_SB_RETURN(); + +SB_L_08A7AFC0: + { const bool branch_taken = ctx.gpr[16] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7AFD0; + } + goto SB_L_08A7AFC8; + } + +SB_L_08A7AFC8: + ctx.gpr[31] = (0x08A7AFD0u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0044_entry, 44u, 663u, 0x088B7A4Cu>(ctx, &aot_mem) && ctx.pc == 0x08A7AFD0u) goto SB_L_08A7AFD0; + TIER2_SB_RETURN(); + +SB_L_08A7AFD0: + aot_mem.aot_store8(ctx.gpr[28] + static_cast(-17675), static_cast(0u)); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(0))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(4))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(16)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0157; + +SB_L_08A7B5A0: + jump_target = ctx.gpr[31]; + ctx.gpr[2] = (0u | 0u); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0157; + +SB_L_08A7B5A8: + jump_target = ctx.gpr[31]; + // nop + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0157; + +SB_L_08A7B5B0: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-32)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[16]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(20), ctx.gpr[31]); + ctx.gpr[31] = (0x08A7B5C4u); + ctx.gpr[16] = (ctx.gpr[4] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0044_entry, 44u, 666u, 0x088B7AE4u>(ctx, &aot_mem) && ctx.pc == 0x08A7B5C4u) goto SB_L_08A7B5C4; + TIER2_SB_RETURN(); + +SB_L_08A7B5C4: + ctx.gpr[31] = (0x08A7B5CCu); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0044_entry, 44u, 670u, 0x088B7B84u>(ctx, &aot_mem) && ctx.pc == 0x08A7B5CCu) goto SB_L_08A7B5CC; + TIER2_SB_RETURN(); + +SB_L_08A7B5CC: + aot_mem.aot_store8(ctx.gpr[28] + static_cast(-17675), static_cast(0u)); + ctx.gpr[4] = (2236u << 16u); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(29552))); + ctx.gpr[6] = (51457u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(256)); + aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(29552))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[4] + static_cast(29552), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[6] = (32u << 16u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[6]); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[4] = (15820u << 16u); + if (branch_taken) { + goto SB_L_08A7B61C; + } + goto SB_L_08A7B604; + } + +SB_L_08A7B604: + ctx.gpr[4] = (ctx.gpr[4] | 52429u); + ctx.gpr[31] = (0x08A7B610u); + ctx.fpr[12] = std::bit_cast(ctx.gpr[4]); + if (rt.invoke_chained_direct<&recomp_unit_0044_entry, 44u, 644u, 0x088B76E8u>(ctx, &aot_mem) && ctx.pc == 0x08A7B610u) goto SB_L_08A7B610; + TIER2_SB_RETURN(); + +SB_L_08A7B610: + ctx.gpr[4] = (0u | 1u); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store8(ctx.gpr[28] + static_cast(-17675), static_cast(ctx.gpr[4])); + if (branch_taken) { + goto SB_L_08A7B65C; + } + goto SB_L_08A7B61C; + } + +SB_L_08A7B61C: + ctx.gpr[4] = (ctx.gpr[16] + static_cast(48)); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + 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[29] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.gpr[31] = (0x08A7B630u); + ctx.gpr[4] = (ctx.gpr[29] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0200_entry, 200u, 414u, 0x08B25E10u>(ctx, &aot_mem) && ctx.pc == 0x08A7B630u) goto SB_L_08A7B630; + TIER2_SB_RETURN(); + +SB_L_08A7B630: + ctx.fpr[12] = std::bit_cast(std::bit_cast(ctx.fpr[0])); + ctx.gpr[4] = (16256u << 16u); + ctx.fpr[13] = std::bit_cast(ctx.gpr[4]); + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((!(std::isnan(ctx.fpr[12]) || std::isnan(ctx.fpr[13])) && ctx.fpr[12] == ctx.fpr[13])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = ((ctx.fcr31 & 0x00800000u) != 0u); + // nop + if (branch_taken) { + goto SB_L_08A7B65C; + } + goto SB_L_08A7B64C; + } + +SB_L_08A7B64C: + ctx.gpr[31] = (0x08A7B654u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0044_entry, 44u, 661u, 0x088B78CCu>(ctx, &aot_mem) && ctx.pc == 0x08A7B654u) goto SB_L_08A7B654; + TIER2_SB_RETURN(); + +SB_L_08A7B654: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 1u); + if (branch_taken) { + goto SB_L_08A7B660; + } + goto SB_L_08A7B65C; + } + +SB_L_08A7B65C: + ctx.gpr[2] = (0u | 0u); + goto SB_L_08A7B660; + +SB_L_08A7B660: + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(16))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(20))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(32)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0157; + +SB_L_08A7B910: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-16)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[31]); + ctx.gpr[31] = (0x08A7B920u); + ctx.gpr[5] = (ctx.gpr[5] & 255u); + goto SB_L_08A7AF74; + +SB_L_08A7CEC8: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-144)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(120), ctx.gpr[16]); + ctx.gpr[16] = (ctx.gpr[4] | 0u); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(116), std::bit_cast(ctx.fpr[20])); + ctx.gpr[5] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(124), ctx.gpr[17]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(128), ctx.gpr[18]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(132), ctx.gpr[19]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(136), ctx.gpr[31]); + { const bool branch_taken = ctx.gpr[5] == 0u; + ctx.gpr[17] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7CF0C; + } + goto SB_L_08A7CEFC; + } + +SB_L_08A7CEFC: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); + ctx.gpr[4] = (ctx.gpr[4] << 2u); + ctx.gpr[4] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + goto SB_L_08A7CF0C; + +SB_L_08A7CF0C: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (0u | 7466u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7CF28; + } + goto SB_L_08A7CF1C; + } + +SB_L_08A7CF1C: + ctx.gpr[4] = (17302u << 16u); + ctx.fpr[12] = std::bit_cast(ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(44), std::bit_cast(ctx.fpr[12])); + goto SB_L_08A7CF28; + +SB_L_08A7CF28: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 10u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7CF64; + } + goto SB_L_08A7CF44; + } + +SB_L_08A7CF44: + ctx.gpr[31] = (0x08A7CF4Cu); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0179_entry, 179u, 51u, 0x08AD0598u>(ctx, &aot_mem) && ctx.pc == 0x08A7CF4Cu) goto SB_L_08A7CF4C; + TIER2_SB_RETURN(); + +SB_L_08A7CF4C: + { const bool branch_taken = ctx.gpr[2] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7CF5C; + } + goto SB_L_08A7CF54; + } + +SB_L_08A7CF54: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 2u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7CF5C; + } + +SB_L_08A7CF5C: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 1u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7CF64; + } + +SB_L_08A7CF64: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(16))); + ctx.gpr[5] = (0u | 1u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D0A8; + } + goto SB_L_08A7CF74; + } + +SB_L_08A7CF74: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 12u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7CFAC; + } + goto SB_L_08A7CF90; + } + +SB_L_08A7CF90: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 8u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D0A8; + } + goto SB_L_08A7CFAC; + } + +SB_L_08A7CFAC: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 8u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[18] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7D008; + } + goto SB_L_08A7CFC8; + } + +SB_L_08A7CFC8: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[5] = (512u << 16u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D008; + } + goto SB_L_08A7CFDC; + } + +SB_L_08A7CFDC: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); + ctx.gpr[5] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[5] == 0u; + ctx.gpr[18] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7D000; + } + goto SB_L_08A7CFF0; + } + +SB_L_08A7CFF0: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); + ctx.gpr[4] = (ctx.gpr[4] << 2u); + ctx.gpr[4] = (ctx.gpr[5] + ctx.gpr[4]); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + goto SB_L_08A7D000; + +SB_L_08A7D000: + ctx.gpr[18] = (aot_mem.aot_load16(ctx.gpr[18] + static_cast(58))); + ctx.gpr[18] = (ctx.gpr[18] & 3u); + goto SB_L_08A7D008; + +SB_L_08A7D008: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); + if (ctx.gpr[4] != 0u) { + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); + goto SB_L_08A7D020; + } + goto SB_L_08A7D014; + +SB_L_08A7D014: + ctx.gpr[31] = (0x08A7D01Cu); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0216_entry, 216u, 413u, 0x08B65B0Cu>(ctx, &aot_mem) && ctx.pc == 0x08A7D01Cu) goto SB_L_08A7D01C; + TIER2_SB_RETURN(); + +SB_L_08A7D01C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); + goto SB_L_08A7D020; + +SB_L_08A7D020: + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[31] = (0x08A7D02Cu); + ctx.gpr[6] = (ctx.gpr[18] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 174u, 0x08954B84u>(ctx, &aot_mem) && ctx.pc == 0x08A7D02Cu) goto SB_L_08A7D02C; + TIER2_SB_RETURN(); + +SB_L_08A7D02C: + ctx.gpr[18] = (ctx.gpr[2] | 0u); + { const bool branch_taken = ctx.gpr[18] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D0A8; + } + goto SB_L_08A7D038; + } + +SB_L_08A7D038: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[5] = (8u << 16u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + ctx.gpr[4] = (0u < ctx.gpr[4] ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D080; + } + goto SB_L_08A7D054; + } + +SB_L_08A7D054: + ctx.gpr[31] = (0x08A7D05Cu); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0179_entry, 179u, 50u, 0x08AD0530u>(ctx, &aot_mem) && ctx.pc == 0x08A7D05Cu) goto SB_L_08A7D05C; + TIER2_SB_RETURN(); + +SB_L_08A7D05C: + { const bool branch_taken = ctx.gpr[2] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D078; + } + goto SB_L_08A7D064; + } + +SB_L_08A7D064: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D088; + } + goto SB_L_08A7D070; + } + +SB_L_08A7D070: + { const bool branch_taken = 0u == 0u; + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); + if (branch_taken) { + goto SB_L_08A7D094; + } + goto SB_L_08A7D078; + } + +SB_L_08A7D078: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 2u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D080; + } + +SB_L_08A7D080: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D088; + } + +SB_L_08A7D088: + ctx.gpr[31] = (0x08A7D090u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0216_entry, 216u, 413u, 0x08B65B0Cu>(ctx, &aot_mem) && ctx.pc == 0x08A7D090u) goto SB_L_08A7D090; + TIER2_SB_RETURN(); + +SB_L_08A7D090: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); + goto SB_L_08A7D094; + +SB_L_08A7D094: + ctx.gpr[5] = (ctx.gpr[18] | 0u); + ctx.gpr[31] = (0x08A7D0A0u); + ctx.gpr[6] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 191u, 0x08954C44u>(ctx, &aot_mem) && ctx.pc == 0x08A7D0A0u) goto SB_L_08A7D0A0; + TIER2_SB_RETURN(); + +SB_L_08A7D0A0: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 1u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D0A8; + } + +SB_L_08A7D0A8: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(16))); + ctx.gpr[5] = (0u | 3u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + ctx.gpr[18] = (0u | 1u); + if (branch_taken) { + goto SB_L_08A7D1A4; + } + goto SB_L_08A7D0B8; + } + +SB_L_08A7D0B8: + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(72))); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(64))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(68))); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + ctx.gpr[31] = (0x08A7D0D0u); + ctx.gpr[5] = (ctx.gpr[5] & 255u); + if (rt.invoke_chained_direct<&recomp_unit_0079_entry, 79u, 248u, 0x08941B38u>(ctx, &aot_mem) && ctx.pc == 0x08A7D0D0u) goto SB_L_08A7D0D0; + TIER2_SB_RETURN(); + +SB_L_08A7D0D0: + { const bool branch_taken = ctx.gpr[2] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D14C; + } + goto SB_L_08A7D0D8; + } + +SB_L_08A7D0D8: + ctx.gpr[4] = (0u + static_cast(-1)); + { const bool branch_taken = ctx.gpr[19] == ctx.gpr[4]; + // nop + if (branch_taken) { + goto SB_L_08A7D12C; + } + goto SB_L_08A7D0E4; + } + +SB_L_08A7D0E4: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); + ctx.gpr[5] = (static_cast(ctx.gpr[19]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[5] == 0u; + ctx.gpr[4] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7D104; + } + goto SB_L_08A7D0F4; + } + +SB_L_08A7D0F4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); + ctx.gpr[5] = (ctx.gpr[19] << 2u); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + goto SB_L_08A7D104; + +SB_L_08A7D104: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(36))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(48)); + ctx.gpr[6] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[5] + static_cast(0)))))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(4))); + jump_target = ctx.gpr[5]; + ctx.gpr[31] = (0x08A7D11Cu); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[6]); + ctx.pc = jump_target; + if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7D11Cu) goto SB_L_08A7D11C; + TIER2_SB_RETURN(); + +SB_L_08A7D11C: + { const bool branch_taken = ctx.gpr[2] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D12C; + } + goto SB_L_08A7D124; + } + +SB_L_08A7D124: + { const bool branch_taken = 0u == 0u; + ctx.gpr[18] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7D78C; + } + goto SB_L_08A7D12C; + } + +SB_L_08A7D12C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(92))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(72)); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(0)))))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(4))); + jump_target = ctx.gpr[6]; + ctx.gpr[31] = (0x08A7D144u); + ctx.gpr[4] = (ctx.gpr[16] + ctx.gpr[5]); + ctx.pc = jump_target; + if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7D144u) goto SB_L_08A7D144; + TIER2_SB_RETURN(); + +SB_L_08A7D144: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D14C; + } + +SB_L_08A7D14C: + ctx.gpr[4] = (0u + static_cast(-1)); + { const bool branch_taken = ctx.gpr[19] == ctx.gpr[4]; + // nop + if (branch_taken) { + goto SB_L_08A7D78C; + } + goto SB_L_08A7D158; + } + +SB_L_08A7D158: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); + ctx.gpr[5] = (static_cast(ctx.gpr[19]) < static_cast(ctx.gpr[5]) ? 1u : 0u); + { const bool branch_taken = ctx.gpr[5] == 0u; + ctx.gpr[4] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7D178; + } + goto SB_L_08A7D168; + } + +SB_L_08A7D168: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); + ctx.gpr[5] = (ctx.gpr[19] << 2u); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + goto SB_L_08A7D178; + +SB_L_08A7D178: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(36))); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(48)); + ctx.gpr[6] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[5] + static_cast(0)))))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(4))); + jump_target = ctx.gpr[5]; + ctx.gpr[31] = (0x08A7D190u); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[6]); + ctx.pc = jump_target; + if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7D190u) goto SB_L_08A7D190; + TIER2_SB_RETURN(); + +SB_L_08A7D190: + { const bool branch_taken = ctx.gpr[2] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D78C; + } + goto SB_L_08A7D198; + } + +SB_L_08A7D198: + ctx.gpr[4] = (0u | 255u); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(ctx.gpr[4])); + if (branch_taken) { + goto SB_L_08A7D78C; + } + goto SB_L_08A7D1A4; + } + +SB_L_08A7D1A4: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(16))); + ctx.gpr[5] = (0u | 1u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D6C4; + } + goto SB_L_08A7D1B4; + } + +SB_L_08A7D1B4: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(16))); + ctx.gpr[5] = (0u | 4u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D6C4; + } + goto SB_L_08A7D1C4; + } + +SB_L_08A7D1C4: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-7080))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D464; + } + goto SB_L_08A7D1D0; + } + +SB_L_08A7D1D0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 14u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D464; + } + goto SB_L_08A7D1EC; + } + +SB_L_08A7D1EC: + ctx.gpr[31] = (0x08A7D1F4u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 28u, 0x089602C8u>(ctx, &aot_mem) && ctx.pc == 0x08A7D1F4u) goto SB_L_08A7D1F4; + TIER2_SB_RETURN(); + +SB_L_08A7D1F4: + ctx.gpr[4] = (2237u << 16u); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(-28736)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(104))); + ctx.gpr[6] = (ctx.gpr[5] + static_cast(4)); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + { const bool branch_taken = ctx.gpr[6] == 0u; + ctx.gpr[4] = (ctx.gpr[2] | 0u); + if (branch_taken) { + goto SB_L_08A7D244; + } + goto SB_L_08A7D210; + } + +SB_L_08A7D210: + aot_mem.aot_store8(ctx.gpr[29] + static_cast(92), static_cast(0u)); + goto SB_L_08A7D214; + +SB_L_08A7D214: + ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(16))); + ctx.gpr[7] = (ctx.gpr[7] < ctx.gpr[4] ? 1u : 0u); + ctx.gpr[7] = (ctx.gpr[7] & 255u); + if (ctx.gpr[7] != 0u) { + ctx.gpr[6] = (ctx.gpr[6] + static_cast(12)); + goto SB_L_08A7D238; + } + goto SB_L_08A7D228; + +SB_L_08A7D228: + ctx.gpr[5] = (ctx.gpr[6] | 0u); + ctx.gpr[6] = (ctx.gpr[5] + static_cast(8)); + { const bool branch_taken = 0u == 0u; + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + if (branch_taken) { + goto SB_L_08A7D23C; + } + goto SB_L_08A7D238; + } + +SB_L_08A7D238: + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + goto SB_L_08A7D23C; + +SB_L_08A7D23C: + if (ctx.gpr[6] != 0u) { + aot_mem.aot_store8(ctx.gpr[29] + static_cast(92), static_cast(0u)); + goto SB_L_08A7D214; + } + goto SB_L_08A7D244; + +SB_L_08A7D244: + ctx.gpr[6] = (2237u << 16u); + ctx.gpr[6] = (ctx.gpr[6] + static_cast(-28736)); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(104))); + if (ctx.gpr[5] == ctx.gpr[6]) { + ctx.gpr[4] = (2237u << 16u); + goto SB_L_08A7D274; + } + goto SB_L_08A7D258; + +SB_L_08A7D258: + aot_mem.aot_store8(ctx.gpr[29] + static_cast(93), static_cast(0u)); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(16))); + ctx.gpr[4] = (ctx.gpr[4] < ctx.gpr[6] ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[4] = (2237u << 16u); + if (branch_taken) { + goto SB_L_08A7D280; + } + goto SB_L_08A7D270; + } + +SB_L_08A7D270: + ctx.gpr[4] = (2237u << 16u); + goto SB_L_08A7D274; + +SB_L_08A7D274: + ctx.gpr[4] = (ctx.gpr[4] + static_cast(-28736)); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(104))); + ctx.gpr[4] = (2237u << 16u); + goto SB_L_08A7D280; + +SB_L_08A7D280: + aot_mem.aot_store32(ctx.gpr[29] + static_cast(88), ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(-28736)); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(104))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(88))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(104), ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(84), ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(104))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(84))); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(80), ctx.gpr[4]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(80))); + ctx.gpr[4] = (ctx.gpr[5] ^ ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + if (ctx.gpr[4] == 0u) { + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(84))); + goto SB_L_08A7D2C4; + } + goto SB_L_08A7D2BC; + +SB_L_08A7D2BC: + { const bool branch_taken = 0u == 0u; + ctx.gpr[4] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7D2C8; + } + goto SB_L_08A7D2C4; + } + +SB_L_08A7D2C4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(20))); + goto SB_L_08A7D2C8; + +SB_L_08A7D2C8: + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D45C; + } + goto SB_L_08A7D2D0; + } + +SB_L_08A7D2D0: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(352))); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + ctx.gpr[4] = (2236u << 16u); + if (branch_taken) { + goto SB_L_08A7D45C; + } + goto SB_L_08A7D2DC; + } + +SB_L_08A7D2DC: + ctx.gpr[4] = (ctx.gpr[4] + static_cast(32304)); + ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(80))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(112)); + ctx.gpr[5] = (ctx.gpr[5] << 5u); + ctx.gpr[6] = (0u - ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[5] << 2u); + ctx.gpr[6] = (ctx.gpr[6] + ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[5] << 2u); + ctx.gpr[17] = (ctx.gpr[6] + ctx.gpr[5]); + ctx.gpr[17] = (ctx.gpr[17] + ctx.gpr[4]); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[5] = (0u | 16u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D45C; + } + goto SB_L_08A7D314; + } + +SB_L_08A7D314: + ctx.gpr[31] = (0x08A7D31Cu); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(116))); + if (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 28u, 0x089602C8u>(ctx, &aot_mem) && ctx.pc == 0x08A7D31Cu) goto SB_L_08A7D31C; + TIER2_SB_RETURN(); + +SB_L_08A7D31C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[2] + static_cast(852))); + ctx.gpr[5] = (0u | 6u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D344; + } + goto SB_L_08A7D32C; + } + +SB_L_08A7D32C: + ctx.gpr[31] = (0x08A7D334u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 28u, 0x089602C8u>(ctx, &aot_mem) && ctx.pc == 0x08A7D334u) goto SB_L_08A7D334; + TIER2_SB_RETURN(); + +SB_L_08A7D334: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[2] + static_cast(1280)))))); + ctx.gpr[4] = (ctx.gpr[4] & 16u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D45C; + } + goto SB_L_08A7D344; + } + +SB_L_08A7D344: + ctx.gpr[4] = (0u | 3u); + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[4]; + // nop + if (branch_taken) { + goto SB_L_08A7D3D4; + } + goto SB_L_08A7D350; + } + +SB_L_08A7D350: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (0u | 246u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D3D4; + } + goto SB_L_08A7D360; + } + +SB_L_08A7D360: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (0u | 237u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D3D4; + } + goto SB_L_08A7D370; + } + +SB_L_08A7D370: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (0u + static_cast(-966)); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + ctx.gpr[4] = (2236u << 16u); + if (branch_taken) { + goto SB_L_08A7D3D4; + } + goto SB_L_08A7D380; + } + +SB_L_08A7D380: + ctx.gpr[4] = (ctx.gpr[4] + static_cast(32304)); + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(1956))); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D3D4; + } + goto SB_L_08A7D390; + } + +SB_L_08A7D390: + { const bool branch_taken = ctx.gpr[17] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D3C4; + } + goto SB_L_08A7D398; + } + +SB_L_08A7D398: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[5] = (1u << 16u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + ctx.gpr[4] = (0u < ctx.gpr[4] ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D3C4; + } + goto SB_L_08A7D3B4; + } + +SB_L_08A7D3B4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(380))); + ctx.gpr[5] = (0u | 4u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D3D4; + } + goto SB_L_08A7D3C4; + } + +SB_L_08A7D3C4: + { const bool branch_taken = ctx.gpr[17] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D440; + } + goto SB_L_08A7D3CC; + } + +SB_L_08A7D3CC: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D3E8; + } + goto SB_L_08A7D3D4; + } + +SB_L_08A7D3D4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[2] = (0u | 2u); + ctx.gpr[4] = (ctx.gpr[4] | 32u); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store32(ctx.gpr[16] + static_cast(76), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D3E8; + } + +SB_L_08A7D3E8: + ctx.gpr[31] = (0x08A7D3F0u); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 28u, 0x089602C8u>(ctx, &aot_mem) && ctx.pc == 0x08A7D3F0u) goto SB_L_08A7D3F0; + TIER2_SB_RETURN(); + +SB_L_08A7D3F0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[2] + static_cast(852))); + ctx.gpr[5] = (0u | 1u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D440; + } + goto SB_L_08A7D400; + } + +SB_L_08A7D400: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (0u | 214u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D440; + } + goto SB_L_08A7D410; + } + +SB_L_08A7D410: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (0u | 250u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D440; + } + goto SB_L_08A7D420; + } + +SB_L_08A7D420: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (0u | 219u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D440; + } + goto SB_L_08A7D430; + } + +SB_L_08A7D430: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (0u | 278u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D45C; + } + goto SB_L_08A7D440; + } + +SB_L_08A7D440: + aot_mem.aot_store32(ctx.gpr[28] + static_cast(10080), ctx.gpr[16]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[5] = (0u + static_cast(-33)); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(76), ctx.gpr[4]); + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 2u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D45C; + } + +SB_L_08A7D45C: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D60C; + } + goto SB_L_08A7D464; + } + +SB_L_08A7D464: + ctx.gpr[31] = (0x08A7D46Cu); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 28u, 0x089602C8u>(ctx, &aot_mem) && ctx.pc == 0x08A7D46Cu) goto SB_L_08A7D46C; + TIER2_SB_RETURN(); + +SB_L_08A7D46C: + { const bool branch_taken = ctx.gpr[2] != ctx.gpr[16]; + ctx.gpr[4] = (2236u << 16u); + if (branch_taken) { + goto SB_L_08A7D60C; + } + goto SB_L_08A7D474; + } + +SB_L_08A7D474: + ctx.gpr[4] = (ctx.gpr[4] + static_cast(32304)); + ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(80))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(112)); + ctx.gpr[5] = (ctx.gpr[5] << 5u); + ctx.gpr[6] = (0u - ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[5] << 2u); + ctx.gpr[6] = (ctx.gpr[6] + ctx.gpr[5]); + ctx.gpr[5] = (ctx.gpr[5] << 2u); + ctx.gpr[17] = (ctx.gpr[6] + ctx.gpr[5]); + ctx.gpr[17] = (ctx.gpr[17] + ctx.gpr[4]); + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + ctx.gpr[5] = (0u | 16u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D60C; + } + goto SB_L_08A7D4AC; + } + +SB_L_08A7D4AC: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(7800))); + ctx.gpr[5] = (ctx.gpr[4] + ctx.gpr[4]); + ctx.gpr[6] = (ctx.gpr[4] << 8u); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[5]); + ctx.gpr[4] = (ctx.gpr[4] << 5u); + ctx.gpr[5] = (2238u << 16u); + ctx.gpr[4] = (ctx.gpr[6] + ctx.gpr[4]); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(-6992)); + ctx.gpr[4] = (ctx.gpr[4] + ctx.gpr[5]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(4))); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D60C; + } + goto SB_L_08A7D4DC; + } + +SB_L_08A7D4DC: + ctx.gpr[31] = (0x08A7D4E4u); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(116))); + if (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 28u, 0x089602C8u>(ctx, &aot_mem) && ctx.pc == 0x08A7D4E4u) goto SB_L_08A7D4E4; + TIER2_SB_RETURN(); + +SB_L_08A7D4E4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[2] + static_cast(852))); + ctx.gpr[5] = (0u | 6u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D50C; + } + goto SB_L_08A7D4F4; + } + +SB_L_08A7D4F4: + ctx.gpr[31] = (0x08A7D4FCu); + // nop + if (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 28u, 0x089602C8u>(ctx, &aot_mem) && ctx.pc == 0x08A7D4FCu) goto SB_L_08A7D4FC; + TIER2_SB_RETURN(); + +SB_L_08A7D4FC: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[2] + static_cast(1280)))))); + ctx.gpr[4] = (ctx.gpr[4] & 16u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D60C; + } + goto SB_L_08A7D50C; + } + +SB_L_08A7D50C: + ctx.gpr[4] = (0u | 3u); + { const bool branch_taken = ctx.gpr[17] == ctx.gpr[4]; + // nop + if (branch_taken) { + goto SB_L_08A7D590; + } + goto SB_L_08A7D518; + } + +SB_L_08A7D518: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (0u | 246u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D590; + } + goto SB_L_08A7D528; + } + +SB_L_08A7D528: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (0u | 237u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D590; + } + goto SB_L_08A7D538; + } + +SB_L_08A7D538: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (0u + static_cast(-966)); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + ctx.gpr[4] = (2236u << 16u); + if (branch_taken) { + goto SB_L_08A7D590; + } + goto SB_L_08A7D548; + } + +SB_L_08A7D548: + ctx.gpr[4] = (ctx.gpr[4] + static_cast(32304)); + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(1956))); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D590; + } + goto SB_L_08A7D558; + } + +SB_L_08A7D558: + { const bool branch_taken = ctx.gpr[17] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D580; + } + goto SB_L_08A7D560; + } + +SB_L_08A7D560: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(352))); + ctx.gpr[5] = (16384u << 16u); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(208))); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + ctx.gpr[4] = (0u < ctx.gpr[4] ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D590; + } + goto SB_L_08A7D580; + } + +SB_L_08A7D580: + { const bool branch_taken = ctx.gpr[17] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D5F0; + } + goto SB_L_08A7D588; + } + +SB_L_08A7D588: + { const bool branch_taken = 0u == 0u; + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(852))); + if (branch_taken) { + goto SB_L_08A7D5A4; + } + goto SB_L_08A7D590; + } + +SB_L_08A7D590: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[2] = (0u | 2u); + ctx.gpr[4] = (ctx.gpr[4] | 32u); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store32(ctx.gpr[16] + static_cast(76), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D5A4; + } + +SB_L_08A7D5A4: + ctx.gpr[5] = (0u | 1u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D5F0; + } + goto SB_L_08A7D5B0; + } + +SB_L_08A7D5B0: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (0u | 214u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D5F0; + } + goto SB_L_08A7D5C0; + } + +SB_L_08A7D5C0: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (0u | 250u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D5F0; + } + goto SB_L_08A7D5D0; + } + +SB_L_08A7D5D0: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (0u | 219u); + { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D5F0; + } + goto SB_L_08A7D5E0; + } + +SB_L_08A7D5E0: + ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + ctx.gpr[5] = (0u | 278u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D60C; + } + goto SB_L_08A7D5F0; + } + +SB_L_08A7D5F0: + aot_mem.aot_store32(ctx.gpr[28] + static_cast(10080), ctx.gpr[16]); + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[5] = (0u + static_cast(-33)); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(76), ctx.gpr[4]); + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 2u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D60C; + } + +SB_L_08A7D60C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(80))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D66C; + } + goto SB_L_08A7D618; + } + +SB_L_08A7D618: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[5] = (8u << 16u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D66C; + } + goto SB_L_08A7D62C; + } + +SB_L_08A7D62C: + ctx.gpr[31] = (0x08A7D634u); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0179_entry, 179u, 50u, 0x08AD0530u>(ctx, &aot_mem) && ctx.pc == 0x08A7D634u) goto SB_L_08A7D634; + TIER2_SB_RETURN(); + +SB_L_08A7D634: + { const bool branch_taken = ctx.gpr[2] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D664; + } + goto SB_L_08A7D63C; + } + +SB_L_08A7D63C: + ctx.gpr[31] = (0x08A7D644u); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0195_entry, 195u, 375u, 0x08B11994u>(ctx, &aot_mem) && ctx.pc == 0x08A7D644u) goto SB_L_08A7D644; + TIER2_SB_RETURN(); + +SB_L_08A7D644: + { const bool branch_taken = ctx.gpr[2] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D664; + } + goto SB_L_08A7D64C; + } + +SB_L_08A7D64C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[4] = (ctx.gpr[4] & 16u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D674; + } + goto SB_L_08A7D65C; + } + +SB_L_08A7D65C: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 1u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D664; + } + +SB_L_08A7D664: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 2u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D66C; + } + +SB_L_08A7D66C: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D674; + } + +SB_L_08A7D674: + ctx.gpr[4] = (ctx.gpr[16] + static_cast(48)); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + ctx.gpr[4] = (ctx.gpr[28] + static_cast(10048)); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<1u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } + ctx.gpr[4] = (ctx.gpr[29] + static_cast(16)); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + ctx.execute_vfpu_vdot_ct<28u, 0u, 0u, 3u>(); + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<28u, 1u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = std::fabs(std::sqrt(vfpu_s[i])); + ctx.write_vfpu_vector_with_destination_prefix_ct<28u, 1u>(vfpu_d); } + ctx.gpr[4] = (ctx.vfpu_scalar_bits_ct<28u>()); + ctx.fpr[12] = std::bit_cast(ctx.gpr[4]); + ctx.gpr[31] = (0x08A7D6ACu); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 165u, 0x089451D8u>(ctx, &aot_mem) && ctx.pc == 0x08A7D6ACu) goto SB_L_08A7D6AC; + TIER2_SB_RETURN(); + +SB_L_08A7D6AC: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[5] = (0u + static_cast(-129)); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(76), ctx.gpr[4]); + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D6C4; + } + +SB_L_08A7D6C4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[4] = (ctx.gpr[4] & 4096u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D78C; + } + goto SB_L_08A7D6D4; + } + +SB_L_08A7D6D4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(80))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D734; + } + goto SB_L_08A7D6E0; + } + +SB_L_08A7D6E0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[5] = (8u << 16u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D734; + } + goto SB_L_08A7D6F4; + } + +SB_L_08A7D6F4: + ctx.gpr[31] = (0x08A7D6FCu); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0179_entry, 179u, 50u, 0x08AD0530u>(ctx, &aot_mem) && ctx.pc == 0x08A7D6FCu) goto SB_L_08A7D6FC; + TIER2_SB_RETURN(); + +SB_L_08A7D6FC: + { const bool branch_taken = ctx.gpr[2] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D72C; + } + goto SB_L_08A7D704; + } + +SB_L_08A7D704: + ctx.gpr[31] = (0x08A7D70Cu); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0195_entry, 195u, 375u, 0x08B11994u>(ctx, &aot_mem) && ctx.pc == 0x08A7D70Cu) goto SB_L_08A7D70C; + TIER2_SB_RETURN(); + +SB_L_08A7D70C: + { const bool branch_taken = ctx.gpr[2] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D72C; + } + goto SB_L_08A7D714; + } + +SB_L_08A7D714: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[4] = (ctx.gpr[4] & 16u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D73C; + } + goto SB_L_08A7D724; + } + +SB_L_08A7D724: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 1u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D72C; + } + +SB_L_08A7D72C: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 2u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D734; + } + +SB_L_08A7D734: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D73C; + } + +SB_L_08A7D73C: + ctx.gpr[4] = (ctx.gpr[16] + static_cast(48)); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + ctx.gpr[4] = (ctx.gpr[28] + static_cast(10048)); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } + { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); + ctx.read_vfpu_vector_with_source_prefix_ct<1u, 3u, 1u>(vfpu_t); + for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; + ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } + ctx.gpr[4] = (ctx.gpr[29] + static_cast(32)); + { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); + const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + ctx.execute_vfpu_vdot_ct<28u, 0u, 0u, 3u>(); + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<28u, 1u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = std::fabs(std::sqrt(vfpu_s[i])); + ctx.write_vfpu_vector_with_destination_prefix_ct<28u, 1u>(vfpu_d); } + ctx.gpr[4] = (ctx.vfpu_scalar_bits_ct<28u>()); + ctx.fpr[12] = std::bit_cast(ctx.gpr[4]); + ctx.gpr[31] = (0x08A7D774u); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 165u, 0x089451D8u>(ctx, &aot_mem) && ctx.pc == 0x08A7D774u) goto SB_L_08A7D774; + TIER2_SB_RETURN(); + +SB_L_08A7D774: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[5] = (0u + static_cast(-129)); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(76), ctx.gpr[4]); + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D78C; + } + +SB_L_08A7D78C: + ctx.gpr[4] = (ctx.gpr[16] + static_cast(48)); + { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + 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[29] + static_cast(0); + aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); + aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); + aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); + aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + ctx.gpr[5] = (ctx.gpr[28] + static_cast(10048)); + ctx.gpr[31] = (0x08A7D7A4u); + ctx.gpr[4] = (ctx.gpr[29] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0163_entry, 163u, 464u, 0x08A931D0u>(ctx, &aot_mem) && ctx.pc == 0x08A7D7A4u) goto SB_L_08A7D7A4; + TIER2_SB_RETURN(); + +SB_L_08A7D7A4: + { const std::uint32_t vfpu_address = ctx.gpr[29] + static_cast(0); + float vfpu_value[4]{ + std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), + std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } + ctx.execute_vfpu_vdot_ct<28u, 0u, 0u, 3u>(); + { float vfpu_s[4]{}, vfpu_d[4]{}; + ctx.read_vfpu_vector_with_source_prefix_ct<28u, 1u, 0u>(vfpu_s); + for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = std::fabs(std::sqrt(vfpu_s[i])); + ctx.write_vfpu_vector_with_destination_prefix_ct<28u, 1u>(vfpu_d); } + ctx.gpr[4] = (ctx.vfpu_scalar_bits_ct<28u>()); + ctx.fpr[20] = std::bit_cast(ctx.gpr[4]); + ctx.gpr[4] = (17317u << 16u); + ctx.fpr[12] = std::bit_cast(ctx.gpr[4]); + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[20] <= ctx.fpr[12])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = ((ctx.fcr31 & 0x00800000u) != 0u); + // nop + if (branch_taken) { + goto SB_L_08A7D7F4; + } + goto SB_L_08A7D7D0; + } + +SB_L_08A7D7D0: + ctx.gpr[31] = (0x08A7D7D8u); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0170_entry, 170u, 396u, 0x08AAE0ECu>(ctx, &aot_mem) && ctx.pc == 0x08A7D7D8u) goto SB_L_08A7D7D8; + TIER2_SB_RETURN(); + +SB_L_08A7D7D8: + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[20] < ctx.fpr[0])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); + // nop + if (branch_taken) { + goto SB_L_08A7D7F4; + } + goto SB_L_08A7D7E8; + } + +SB_L_08A7D7E8: + ctx.gpr[31] = (0x08A7D7F0u); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0170_entry, 170u, 396u, 0x08AAE0ECu>(ctx, &aot_mem) && ctx.pc == 0x08A7D7F0u) goto SB_L_08A7D7F0; + TIER2_SB_RETURN(); + +SB_L_08A7D7F0: + ctx.fpr[20] = std::bit_cast(std::bit_cast(ctx.fpr[0])); + goto SB_L_08A7D7F4; + +SB_L_08A7D7F4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[4] = (ctx.gpr[4] & 14u); + ctx.gpr[4] = (ctx.gpr[4] ^ 8u); + ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); + ctx.gpr[4] = (ctx.gpr[4] & 255u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D84C; + } + goto SB_L_08A7D810; + } + +SB_L_08A7D810: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[5] = (512u << 16u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D84C; + } + goto SB_L_08A7D824; + } + +SB_L_08A7D824: + ctx.gpr[4] = (0u | 1u); + if (ctx.gpr[4] == 0u) { + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + goto SB_L_08A7D840; + } + goto SB_L_08A7D830; + +SB_L_08A7D830: + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + ctx.gpr[4] = (ctx.gpr[4] | 8u); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(ctx.gpr[4])); + if (branch_taken) { + goto SB_L_08A7D84C; + } + goto SB_L_08A7D840; + } + +SB_L_08A7D840: + ctx.gpr[5] = (0u + static_cast(-9)); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(ctx.gpr[4])); + goto SB_L_08A7D84C; + +SB_L_08A7D84C: + ctx.gpr[4] = (ctx.gpr[17] | 0u); + ctx.gpr[31] = (0x08A7D858u); + ctx.fpr[12] = std::bit_cast(std::bit_cast(ctx.fpr[20])); + if (rt.invoke_chained_direct<&recomp_unit_0170_entry, 170u, 384u, 0x08AAE058u>(ctx, &aot_mem) && ctx.pc == 0x08A7D858u) goto SB_L_08A7D858; + TIER2_SB_RETURN(); + +SB_L_08A7D858: + ctx.gpr[19] = (ctx.gpr[2] | 0u); + { const bool branch_taken = ctx.gpr[19] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D9CC; + } + goto SB_L_08A7D864; + } + +SB_L_08A7D864: + ctx.gpr[4] = (0u | 0u); + if (ctx.gpr[4] == 0u) { + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + goto SB_L_08A7D880; + } + goto SB_L_08A7D870; + +SB_L_08A7D870: + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + ctx.gpr[4] = (ctx.gpr[4] | 8u); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(ctx.gpr[4])); + if (branch_taken) { + goto SB_L_08A7D88C; + } + goto SB_L_08A7D880; + } + +SB_L_08A7D880: + ctx.gpr[5] = (0u + static_cast(-9)); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(ctx.gpr[4])); + goto SB_L_08A7D88C; + +SB_L_08A7D88C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(80))); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D8B0; + } + goto SB_L_08A7D898; + } + +SB_L_08A7D898: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(92))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(64)); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(0)))))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(4))); + jump_target = ctx.gpr[6]; + ctx.gpr[31] = (0x08A7D8B0u); + ctx.gpr[4] = (ctx.gpr[16] + ctx.gpr[5]); + ctx.pc = jump_target; + if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7D8B0u) goto SB_L_08A7D8B0; + TIER2_SB_RETURN(); + +SB_L_08A7D8B0: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(80))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(20))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(20))); + { const bool branch_taken = ctx.gpr[5] == ctx.gpr[6]; + // nop + if (branch_taken) { + goto SB_L_08A7D8D0; + } + goto SB_L_08A7D8C4; + } + +SB_L_08A7D8C4: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(20))); + ctx.gpr[31] = (0x08A7D8D0u); + ctx.gpr[6] = (0u | 4u); + if (rt.invoke_chained_direct<&recomp_unit_0085_entry, 85u, 455u, 0x0895B470u>(ctx, &aot_mem) && ctx.pc == 0x08A7D8D0u) goto SB_L_08A7D8D0; + TIER2_SB_RETURN(); + +SB_L_08A7D8D0: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(57))); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < 239 ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[4] = (0u | 255u); + if (branch_taken) { + goto SB_L_08A7D8F0; + } + goto SB_L_08A7D8E0; + } + +SB_L_08A7D8E0: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(57))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(16)); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(ctx.gpr[4])); + if (branch_taken) { + goto SB_L_08A7D8F4; + } + goto SB_L_08A7D8F0; + } + +SB_L_08A7D8F0: + aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(ctx.gpr[4])); + goto SB_L_08A7D8F4; + +SB_L_08A7D8F4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(80))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D98C; + } + goto SB_L_08A7D900; + } + +SB_L_08A7D900: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[5] = (8u << 16u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D98C; + } + goto SB_L_08A7D914; + } + +SB_L_08A7D914: + ctx.gpr[31] = (0x08A7D91Cu); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0179_entry, 179u, 50u, 0x08AD0530u>(ctx, &aot_mem) && ctx.pc == 0x08A7D91Cu) goto SB_L_08A7D91C; + TIER2_SB_RETURN(); + +SB_L_08A7D91C: + { const bool branch_taken = ctx.gpr[2] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D97C; + } + goto SB_L_08A7D924; + } + +SB_L_08A7D924: + ctx.gpr[31] = (0x08A7D92Cu); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0195_entry, 195u, 375u, 0x08B11994u>(ctx, &aot_mem) && ctx.pc == 0x08A7D92Cu) goto SB_L_08A7D92C; + TIER2_SB_RETURN(); + +SB_L_08A7D92C: + { const bool branch_taken = ctx.gpr[2] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D97C; + } + goto SB_L_08A7D934; + } + +SB_L_08A7D934: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(57))); + ctx.gpr[5] = (0u | 255u); + { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + // nop + if (branch_taken) { + goto SB_L_08A7D95C; + } + goto SB_L_08A7D944; + } + +SB_L_08A7D944: + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + ctx.gpr[4] = (ctx.gpr[4] & 64u); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D9A0; + } + goto SB_L_08A7D954; + } + +SB_L_08A7D954: + { const bool branch_taken = 0u == 0u; + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + if (branch_taken) { + goto SB_L_08A7D994; + } + goto SB_L_08A7D95C; + } + +SB_L_08A7D95C: + ctx.gpr[4] = (ctx.gpr[16] | 0u); + ctx.gpr[31] = (0x08A7D968u); + ctx.fpr[12] = std::bit_cast(std::bit_cast(ctx.fpr[20])); + if (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 165u, 0x089451D8u>(ctx, &aot_mem) && ctx.pc == 0x08A7D968u) goto SB_L_08A7D968; + TIER2_SB_RETURN(); + +SB_L_08A7D968: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[2] = (0u | 0u); + ctx.gpr[4] = (ctx.gpr[4] | 128u); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store32(ctx.gpr[16] + static_cast(76), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D97C; + } + +SB_L_08A7D97C: + ctx.gpr[4] = (0u | 255u); + aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(ctx.gpr[4])); + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 2u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D98C; + } + +SB_L_08A7D98C: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D994; + } + +SB_L_08A7D994: + ctx.gpr[4] = (ctx.gpr[4] & 16u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7D9C4; + } + goto SB_L_08A7D9A0; + } + +SB_L_08A7D9A0: + ctx.gpr[4] = (ctx.gpr[16] | 0u); + ctx.gpr[31] = (0x08A7D9ACu); + ctx.fpr[12] = std::bit_cast(std::bit_cast(ctx.fpr[20])); + if (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 165u, 0x089451D8u>(ctx, &aot_mem) && ctx.pc == 0x08A7D9ACu) goto SB_L_08A7D9AC; + TIER2_SB_RETURN(); + +SB_L_08A7D9AC: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[5] = (0u + static_cast(-129)); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(76), ctx.gpr[4]); + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D9C4; + } + +SB_L_08A7D9C4: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 1u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7D9CC; + } + +SB_L_08A7D9CC: + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + ctx.gpr[4] = (ctx.gpr[4] & 32u); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7DA38; + } + goto SB_L_08A7D9DC; + } + +SB_L_08A7D9DC: + ctx.gpr[4] = (0u | 0u); + if (ctx.gpr[4] == 0u) { + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + goto SB_L_08A7D9F8; + } + goto SB_L_08A7D9E8; + +SB_L_08A7D9E8: + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + ctx.gpr[4] = (ctx.gpr[4] | 8u); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(ctx.gpr[4])); + if (branch_taken) { + goto SB_L_08A7DA04; + } + goto SB_L_08A7D9F8; + } + +SB_L_08A7D9F8: + ctx.gpr[5] = (0u + static_cast(-9)); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(ctx.gpr[4])); + goto SB_L_08A7DA04; + +SB_L_08A7DA04: + ctx.gpr[31] = (0x08A7DA0Cu); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0170_entry, 170u, 396u, 0x08AAE0ECu>(ctx, &aot_mem) && ctx.pc == 0x08A7DA0Cu) goto SB_L_08A7DA0C; + TIER2_SB_RETURN(); + +SB_L_08A7DA0C: + ctx.gpr[4] = (16880u << 16u); + ctx.fpr[12] = std::bit_cast(ctx.gpr[4]); + ctx.fpr[12] = ctx.fpr[20] - ctx.fpr[12]; + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[0] <= ctx.fpr[12])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = ((ctx.fcr31 & 0x00800000u) != 0u); + // nop + if (branch_taken) { + goto SB_L_08A7DB98; + } + goto SB_L_08A7DA28; + } + +SB_L_08A7DA28: + { const bool branch_taken = ctx.gpr[18] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7DB98; + } + goto SB_L_08A7DA30; + } + +SB_L_08A7DA30: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 3u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7DA38; + } + +SB_L_08A7DA38: + ctx.gpr[4] = (16800u << 16u); + ctx.fpr[12] = std::bit_cast(ctx.gpr[4]); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + ctx.gpr[31] = (0x08A7DA4Cu); + ctx.fpr[12] = ctx.fpr[20] - ctx.fpr[12]; + if (rt.invoke_chained_direct<&recomp_unit_0170_entry, 170u, 401u, 0x08AAE140u>(ctx, &aot_mem) && ctx.pc == 0x08A7DA4Cu) goto SB_L_08A7DA4C; + TIER2_SB_RETURN(); + +SB_L_08A7DA4C: + ctx.gpr[4] = (0u | 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[19] = (ctx.gpr[2] | 0u); + if (branch_taken) { + goto SB_L_08A7DA68; + } + goto SB_L_08A7DA58; + } + +SB_L_08A7DA58: + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + ctx.gpr[4] = (ctx.gpr[4] | 8u); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(ctx.gpr[4])); + if (branch_taken) { + goto SB_L_08A7DA78; + } + goto SB_L_08A7DA68; + } + +SB_L_08A7DA68: + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + ctx.gpr[5] = (0u + static_cast(-9)); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(ctx.gpr[4])); + goto SB_L_08A7DA78; + +SB_L_08A7DA78: + { const bool branch_taken = ctx.gpr[19] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7DB64; + } + goto SB_L_08A7DA80; + } + +SB_L_08A7DA80: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(80))); + { const bool branch_taken = ctx.gpr[4] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7DAA4; + } + goto SB_L_08A7DA8C; + } + +SB_L_08A7DA8C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(92))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(64)); + ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[4] + static_cast(0)))))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(4))); + jump_target = ctx.gpr[6]; + ctx.gpr[31] = (0x08A7DAA4u); + ctx.gpr[4] = (ctx.gpr[16] + ctx.gpr[5]); + ctx.pc = jump_target; + if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7DAA4u) goto SB_L_08A7DAA4; + TIER2_SB_RETURN(); + +SB_L_08A7DAA4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(80))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(20))); + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(20))); + { const bool branch_taken = ctx.gpr[5] == ctx.gpr[6]; + // nop + if (branch_taken) { + goto SB_L_08A7DAC4; + } + goto SB_L_08A7DAB8; + } + +SB_L_08A7DAB8: + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(20))); + ctx.gpr[31] = (0x08A7DAC4u); + ctx.gpr[6] = (0u | 4u); + if (rt.invoke_chained_direct<&recomp_unit_0085_entry, 85u, 455u, 0x0895B470u>(ctx, &aot_mem) && ctx.pc == 0x08A7DAC4u) goto SB_L_08A7DAC4; + TIER2_SB_RETURN(); + +SB_L_08A7DAC4: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(57))); + ctx.gpr[4] = (static_cast(ctx.gpr[4]) < 239 ? 1u : 0u); + { const bool branch_taken = ctx.gpr[4] == 0u; + ctx.gpr[4] = (0u | 255u); + if (branch_taken) { + goto SB_L_08A7DAE4; + } + goto SB_L_08A7DAD4; + } + +SB_L_08A7DAD4: + ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(57))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(16)); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(ctx.gpr[4])); + if (branch_taken) { + goto SB_L_08A7DAE8; + } + goto SB_L_08A7DAE4; + } + +SB_L_08A7DAE4: + aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(ctx.gpr[4])); + goto SB_L_08A7DAE8; + +SB_L_08A7DAE8: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(80))); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7DB20; + } + goto SB_L_08A7DAF4; + } + +SB_L_08A7DAF4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + ctx.gpr[5] = (8u << 16u); + ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); + { const bool branch_taken = ctx.gpr[4] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7DB20; + } + goto SB_L_08A7DB08; + } + +SB_L_08A7DB08: + ctx.gpr[31] = (0x08A7DB10u); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0179_entry, 179u, 50u, 0x08AD0530u>(ctx, &aot_mem) && ctx.pc == 0x08A7DB10u) goto SB_L_08A7DB10; + TIER2_SB_RETURN(); + +SB_L_08A7DB10: + { const bool branch_taken = ctx.gpr[2] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7DB28; + } + goto SB_L_08A7DB18; + } + +SB_L_08A7DB18: + { const bool branch_taken = 0u == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7DB54; + } + goto SB_L_08A7DB20; + } + +SB_L_08A7DB20: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 0u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7DB28; + } + +SB_L_08A7DB28: + ctx.gpr[31] = (0x08A7DB30u); + ctx.gpr[4] = (ctx.gpr[16] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0195_entry, 195u, 375u, 0x08B11994u>(ctx, &aot_mem) && ctx.pc == 0x08A7DB30u) goto SB_L_08A7DB30; + TIER2_SB_RETURN(); + +SB_L_08A7DB30: + { const bool branch_taken = ctx.gpr[2] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7DB54; + } + goto SB_L_08A7DB38; + } + +SB_L_08A7DB38: + ctx.gpr[4] = (ctx.gpr[16] | 0u); + ctx.gpr[31] = (0x08A7DB44u); + ctx.fpr[12] = std::bit_cast(std::bit_cast(ctx.fpr[20])); + if (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 165u, 0x089451D8u>(ctx, &aot_mem) && ctx.pc == 0x08A7DB44u) goto SB_L_08A7DB44; + TIER2_SB_RETURN(); + +SB_L_08A7DB44: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + ctx.gpr[4] = (ctx.gpr[4] | 128u); + { const bool branch_taken = 0u == 0u; + aot_mem.aot_store32(ctx.gpr[16] + static_cast(76), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_08A7DB5C; + } + goto SB_L_08A7DB54; + } + +SB_L_08A7DB54: + ctx.gpr[4] = (0u | 255u); + aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(ctx.gpr[4])); + goto SB_L_08A7DB5C; + +SB_L_08A7DB5C: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 2u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7DB64; + } + +SB_L_08A7DB64: + ctx.gpr[31] = (0x08A7DB6Cu); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + if (rt.invoke_chained_direct<&recomp_unit_0170_entry, 170u, 396u, 0x08AAE0ECu>(ctx, &aot_mem) && ctx.pc == 0x08A7DB6Cu) goto SB_L_08A7DB6C; + TIER2_SB_RETURN(); + +SB_L_08A7DB6C: + ctx.gpr[4] = (16968u << 16u); + ctx.fpr[12] = std::bit_cast(ctx.gpr[4]); + ctx.fpr[12] = ctx.fpr[20] - ctx.fpr[12]; + ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[0] <= ctx.fpr[12])) ? 0x00800000u : 0u); + // nop + { const bool branch_taken = ((ctx.fcr31 & 0x00800000u) != 0u); + // nop + if (branch_taken) { + goto SB_L_08A7DB98; + } + goto SB_L_08A7DB88; + } + +SB_L_08A7DB88: + { const bool branch_taken = ctx.gpr[18] == 0u; + // nop + if (branch_taken) { + goto SB_L_08A7DB98; + } + goto SB_L_08A7DB90; + } + +SB_L_08A7DB90: + { const bool branch_taken = 0u == 0u; + ctx.gpr[2] = (0u | 3u); + if (branch_taken) { + goto SB_L_08A7DB9C; + } + goto SB_L_08A7DB98; + } + +SB_L_08A7DB98: + ctx.gpr[2] = (0u | 0u); + goto SB_L_08A7DB9C; + +SB_L_08A7DB9C: + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(116))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(120))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(124))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(128))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(132))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(136))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(144)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0158; + +SB_L_08A7EC68: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-80)); + ctx.gpr[5] = (0u | 12u); + ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-7080))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(8)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(20), std::bit_cast(ctx.fpr[20])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(24), std::bit_cast(ctx.fpr[22])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(28), ctx.gpr[16]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(32), ctx.gpr[17]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(36), ctx.gpr[18]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(40), ctx.gpr[19]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(44), ctx.gpr[20]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(48), ctx.gpr[21]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(52), ctx.gpr[22]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(56), ctx.gpr[23]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(60), ctx.gpr[30]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(64), ctx.gpr[31]); + { const bool branch_taken = ctx.gpr[6] == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_08A7ECBC; + } + goto SB_L_08A7ECB4; + } + +SB_L_08A7ECB4: + ctx.gpr[4] = (0u | 3u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[4]); + goto SB_L_08A7ECBC; + +SB_L_08A7ECBC: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(16))); + ctx.gpr[5] = (ctx.gpr[4] + static_cast(-1)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), ctx.gpr[5]); + { const bool branch_taken = ctx.gpr[4] == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[5]); + if (branch_taken) { + goto SB_L_08A7F048; + } + goto SB_L_08A7ECD0; + } + +SB_L_08A7ECD0: + ctx.gpr[4] = (ctx.gpr[28] + static_cast(-5492)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[4]); + ctx.gpr[4] = (49648u << 16u); + ctx.gpr[5] = (2280u << 16u); + ctx.fpr[20] = std::bit_cast(ctx.gpr[4]); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(-29568)); + ctx.gpr[30] = (2280u << 16u); + ctx.gpr[23] = (2279u << 16u); + ctx.gpr[4] = (16880u << 16u); + ctx.gpr[20] = (2280u << 16u); + ctx.fpr[22] = std::bit_cast(ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[5]); + ctx.gpr[22] = (0u | 1u); + ctx.gpr[21] = (0u | 3u); + ctx.gpr[30] = (ctx.gpr[30] + static_cast(-21568)); + ctx.gpr[23] = (ctx.gpr[23] + static_cast(27328)); + ctx.gpr[20] = (ctx.gpr[20] + static_cast(-30208)); + goto SB_L_08A7ED14; + +SB_L_08A7ED14: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + { const bool branch_taken = ctx.gpr[19] == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_08A7F030; + } + goto SB_L_08A7ED28; + } + +SB_L_08A7ED28: + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(0))); + ctx.gpr[5] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(84))); + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[28] + static_cast(-25492))); + { const bool branch_taken = ctx.gpr[5] == ctx.gpr[4]; + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(8))); + if (branch_taken) { + goto SB_L_08A7F028; + } + goto SB_L_08A7ED3C; + } + +SB_L_08A7ED3C: + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(76))); + ctx.gpr[5] = (0u + static_cast(-1025)); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(84), static_cast(ctx.gpr[4])); + ctx.gpr[4] = (ctx.gpr[6] & ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(76), ctx.gpr[4]); + ctx.gpr[31] = (0x08A7ED58u); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + goto SB_L_08A7CEC8; + +SB_L_08A7F028: + { const bool branch_taken = ctx.gpr[19] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7ED28; + } + goto SB_L_08A7F030; + } + +SB_L_08A7F030: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(16))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(8))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(-1)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), ctx.gpr[4]); + { const bool branch_taken = ctx.gpr[5] != 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_08A7ED14; + } + goto SB_L_08A7F048; + } + +SB_L_08A7F048: + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(20))); + ctx.fpr[22] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(24))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(28))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(32))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(36))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(40))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(44))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(48))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(52))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(56))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(60))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(64))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(80)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0158; + +SB_L_08A7F080: + ctx.gpr[29] = (ctx.gpr[29] + static_cast(-80)); + ctx.gpr[5] = (0u | 12u); + ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-7080))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(8)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(20), std::bit_cast(ctx.fpr[20])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(24), std::bit_cast(ctx.fpr[22])); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(28), ctx.gpr[16]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(32), ctx.gpr[17]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(36), ctx.gpr[18]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(40), ctx.gpr[19]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(44), ctx.gpr[20]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(48), ctx.gpr[21]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(52), ctx.gpr[22]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(56), ctx.gpr[23]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(60), ctx.gpr[30]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(64), ctx.gpr[31]); + { const bool branch_taken = ctx.gpr[6] == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_08A7F0D4; + } + goto SB_L_08A7F0CC; + } + +SB_L_08A7F0CC: + ctx.gpr[4] = (0u | 4u); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[4]); + goto SB_L_08A7F0D4; + +SB_L_08A7F0D4: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(16))); + ctx.gpr[5] = (ctx.gpr[4] + static_cast(-1)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), ctx.gpr[5]); + { const bool branch_taken = ctx.gpr[4] == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[5]); + if (branch_taken) { + goto SB_L_08A7F4A0; + } + goto SB_L_08A7F0E8; + } + +SB_L_08A7F0E8: + ctx.gpr[4] = (ctx.gpr[28] + static_cast(-5492)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[4]); + ctx.gpr[4] = (49648u << 16u); + ctx.gpr[5] = (2280u << 16u); + ctx.fpr[20] = std::bit_cast(ctx.gpr[4]); + ctx.gpr[5] = (ctx.gpr[5] + static_cast(-29568)); + ctx.gpr[30] = (2280u << 16u); + ctx.gpr[23] = (2279u << 16u); + ctx.gpr[4] = (16880u << 16u); + ctx.gpr[20] = (2280u << 16u); + ctx.fpr[22] = std::bit_cast(ctx.gpr[4]); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[5]); + ctx.gpr[22] = (0u | 1u); + ctx.gpr[21] = (0u | 3u); + ctx.gpr[30] = (ctx.gpr[30] + static_cast(-21568)); + ctx.gpr[23] = (ctx.gpr[23] + static_cast(27328)); + ctx.gpr[20] = (ctx.gpr[20] + static_cast(-30208)); + goto SB_L_08A7F12C; + +SB_L_08A7F12C: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); + { const bool branch_taken = ctx.gpr[19] == 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_08A7F488; + } + goto SB_L_08A7F140; + } + +SB_L_08A7F140: + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(0))); + ctx.gpr[5] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(84))); + ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[28] + static_cast(-25492))); + { const bool branch_taken = ctx.gpr[5] == ctx.gpr[4]; + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(8))); + if (branch_taken) { + goto SB_L_08A7F480; + } + goto SB_L_08A7F154; + } + +SB_L_08A7F154: + ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(76))); + ctx.gpr[5] = (0u + static_cast(-1025)); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(84), static_cast(ctx.gpr[4])); + ctx.gpr[4] = (ctx.gpr[6] & ctx.gpr[5]); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(76), ctx.gpr[4]); + ctx.gpr[31] = (0x08A7F170u); + ctx.gpr[4] = (ctx.gpr[17] | 0u); + goto SB_L_08A7CEC8; + +SB_L_08A7F480: + { const bool branch_taken = ctx.gpr[19] != 0u; + // nop + if (branch_taken) { + goto SB_L_08A7F140; + } + goto SB_L_08A7F488; + } + +SB_L_08A7F488: + ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(16))); + ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(8))); + ctx.gpr[4] = (ctx.gpr[4] + static_cast(-1)); + aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), ctx.gpr[4]); + { const bool branch_taken = ctx.gpr[5] != 0u; + aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[4]); + if (branch_taken) { + goto SB_L_08A7F12C; + } + goto SB_L_08A7F4A0; + } + +SB_L_08A7F4A0: + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(20))); + ctx.fpr[22] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(24))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(28))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(32))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(36))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(40))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(44))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(48))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(52))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(56))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(60))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(64))); + jump_target = ctx.gpr[31]; + ctx.gpr[29] = (ctx.gpr[29] + static_cast(80)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0158; + +SB_L_08A7FAA4: + ctx.gpr[2] = (2216u << 16u); + jump_target = ctx.gpr[31]; + ctx.gpr[2] = (ctx.gpr[2] + static_cast(-1372)); + local_pc = jump_target; + goto TIER2_LOCAL_DISPATCH_U0158; + + +#undef TIER2_SB_RETURN +} + +} // namespace vcs diff --git a/profiles/vcs/host/vcs_tier2_superblocks.cpp b/profiles/vcs/host/vcs_tier2_superblocks.cpp index c2cc669..4b3fba3 100644 --- a/profiles/vcs/host/vcs_tier2_superblocks.cpp +++ b/profiles/vcs/host/vcs_tier2_superblocks.cpp @@ -1,1144 +1,70 @@ -// AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Profile-guided second-layer superblock: 0154/0155 dominant entity loop. #include "vcs_tier2_superblocks.hpp" -#include "vcs_runtime_log.hpp" -#include "psprecomp/runtime.hpp" -#include "generated_units.hpp" +#include #include #include namespace vcs { - -// Generated AOT call targets are declared in namespace psprecomp. The copied -// region text intentionally stays byte-close to the original units, so make -// those names visible here instead of rewriting every external helper target. -using namespace psprecomp; - -bool tier2_superblocks_enabled() noexcept { - static const bool enabled = [] { - const char *value = std::getenv("PSPRECOMP_TIER2_SUPERBLOCKS"); - return value == nullptr || std::strcmp(value, "0") != 0; - }(); - return enabled; +namespace tier2_detail { +thread_local std::array g_counters{}; +thread_local std::uint32_t g_active_depth = 0u; } -void tier2_superblock_154_155(psprecomp::Runtime &rt, - psprecomp::AllegrexContext &ctx, - psprecomp::GuestMemory::AotFastView &aot_mem, - std::uint32_t entry_pc) { - std::uint32_t tier2_pending_transfers = 0u; -#define TIER2_SB_RETURN() do { \ - if (tier2_pending_transfers != 0u) { \ - (void)rt.tier2_complete_fused_transfers(ctx, tier2_pending_transfers); \ - tier2_pending_transfers = 0u; \ - } \ - return; \ - } while (false) - - 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_SB_RETURN(); +namespace { +std::uint32_t parse_cluster_mask() noexcept { + if (const char *global = std::getenv("PSPRECOMP_TIER2_SUPERBLOCKS")) { + if (std::strcmp(global, "0") == 0 || std::strcmp(global, "off") == 0 || + std::strcmp(global, "OFF") == 0 || std::strcmp(global, "false") == 0) + return 0u; } -SB_L_08A6E894: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1600))); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - { const bool branch_taken = ctx.gpr[4] == 0u; - aot_mem.aot_store32(ctx.gpr[29] + static_cast(1576), ctx.gpr[4]); - if (branch_taken) { - if (!rt.tier2_enter_fused_transfer<155u, 0x08A711ECu>(ctx)) { - ctx.pc = 0x08A711ECu; - TIER2_SB_RETURN(); - } - ++tier2_pending_transfers; - goto SB_L_08A711EC; - } - goto SB_L_08A6E8A4; - } -SB_L_08A6E8A4: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1576))); - ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(8428))); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(1576), ctx.gpr[4]); - ctx.gpr[5] = (0u | 3u); - ctx.gpr[4] = (48972u << 16u); - ctx.gpr[4] = (ctx.gpr[4] | 52429u); - ctx.fpr[20] = std::bit_cast(ctx.gpr[4]); - ctx.gpr[8] = (0u | 58u); - ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1588))); - ctx.gpr[9] = (0u + static_cast(-2)); - ctx.gpr[10] = (0u | 311u); - ctx.gpr[4] = (16168u << 16u); - ctx.gpr[4] = (ctx.gpr[4] | 62915u); - { const bool branch_taken = ctx.gpr[19] == ctx.gpr[6]; - ctx.fpr[12] = std::bit_cast(ctx.gpr[4]); - if (branch_taken) { - goto SB_L_08A6E8F4; - } - goto SB_L_08A6E8E8; - } -SB_L_08A6E8E8: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(8428))); - { const bool branch_taken = ctx.gpr[17] != ctx.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; - goto SB_L_08A711E0; - } - goto SB_L_08A6E8FC; - } -SB_L_08A6E8FC: - ctx.gpr[4] = (ctx.gpr[23] | 0u); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(72))); - ctx.gpr[6] = (ctx.gpr[6] & 512u); - ctx.gpr[6] = (0u < ctx.gpr[6] ? 1u : 0u); - ctx.gpr[6] = (ctx.gpr[6] & 255u); - { const bool branch_taken = ctx.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; - goto SB_L_08A71100; - } - goto SB_L_08A6E918; - } -SB_L_08A6E918: - ctx.gpr[6] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(84))); - ctx.gpr[7] = (aot_mem.aot_load16(ctx.gpr[28] + static_cast(-25492))); - { const bool branch_taken = ctx.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; - goto SB_L_08A71100; - } - goto SB_L_08A6E928; - } -SB_L_08A6E928: - { const bool branch_taken = ctx.gpr[17] == ctx.gpr[19]; - // nop - if (branch_taken) { - if (!rt.tier2_enter_fused_transfer<155u, 0x08A71100u>(ctx)) { - ctx.pc = 0x08A71100u; - TIER2_SB_RETURN(); - } - ++tier2_pending_transfers; - goto SB_L_08A71100; - } - goto SB_L_08A6E930; - } -SB_L_08A6E930: - ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(86)))))); - ctx.gpr[4] = (ctx.gpr[4] << 2u); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); - ctx.gpr[4] = (ctx.gpr[6] + ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(20))); - { const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast(0); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast(16); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast(32); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast(48); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<3u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - 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); } - ctx.gpr[4] = (ctx.gpr[29] + static_cast(32)); - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<8u, 4u>(vfpu_value); } - { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; - ctx.read_vfpu_matrix_ct<32u, 4u>(vfpu_matrix); - ctx.read_vfpu_vector_ct<4u, 4u>(vfpu_target_raw); - constexpr std::uint32_t vfpu_side = 4u; - constexpr std::uint32_t vfpu_input_length = 3u; - for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; - if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; - for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { - float sum = 0.0f; - for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; - vfpu_result[row] = sum; - } - float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], - vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; - ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); - ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); - for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; - const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; - const std::uint32_t vfpu_last_lane = vfpu_side - 1u; - ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | - ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); - ctx.write_vfpu_vector_with_destination_prefix_ct<5u, 4u>(vfpu_result); } - { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; - ctx.read_vfpu_vector_with_source_prefix_ct<100u, 1u, 0u>(vfpu_s); - ctx.read_vfpu_vector_with_source_prefix_ct<104u, 1u, 1u>(vfpu_t); - for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = vfpu_s[i] + vfpu_t[i]; - ctx.write_vfpu_vector_with_destination_prefix_ct<100u, 1u>(vfpu_d); } - { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; - ctx.read_vfpu_vector_with_source_prefix_ct<100u, 1u, 0u>(vfpu_s); - ctx.read_vfpu_vector_with_source_prefix_ct<100u, 1u, 1u>(vfpu_t); - for (std::uint32_t i = 0; i < 1u; ++i) vfpu_d[i] = vfpu_s[i] * vfpu_t[i]; - ctx.write_vfpu_vector_with_destination_prefix_ct<100u, 1u>(vfpu_d); } - { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; - ctx.read_vfpu_vector_with_source_prefix_ct<8u, 3u, 0u>(vfpu_s); - ctx.read_vfpu_vector_with_source_prefix_ct<5u, 3u, 1u>(vfpu_t); - for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; - ctx.write_vfpu_vector_with_destination_prefix_ct<5u, 3u>(vfpu_d); } - ctx.execute_vfpu_vdot_ct<4u, 5u, 5u, 3u>(); - ctx.execute_vfpu_vcmp_ct<4u, 100u, 1u, 7u>(); - ctx.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: - ctx.gpr[4] = (0u + static_cast(1)); - ctx.gpr[4] = (ctx.gpr[4] & 255u); - goto SB_L_08A6E998; -SB_L_08A6E998: - ctx.gpr[6] = (ctx.gpr[4] & 255u); - { const bool branch_taken = ctx.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; - goto SB_L_08A71100; - } - goto SB_L_08A6E9A4; - } -SB_L_08A6E9A4: - ctx.gpr[4] = (0u + static_cast(-4097)); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(236))); - ctx.gpr[4] = (ctx.gpr[6] & ctx.gpr[4]); - aot_mem.aot_store32(ctx.gpr[19] + static_cast(236), ctx.gpr[4]); - ctx.gpr[18] = (0u | 0u); - ctx.gpr[20] = (0u | 0u); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(72))); - ctx.gpr[4] = (ctx.gpr[4] & 14u); - ctx.gpr[4] = (ctx.gpr[4] ^ 2u); - ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); - ctx.gpr[4] = (ctx.gpr[4] & 255u); - { const bool branch_taken = ctx.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) { - recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); - } - goto SB_L_08A6E9E0; - } -SB_L_08A6E9E0: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(72))); - ctx.gpr[4] = (ctx.gpr[4] & 14u); - ctx.gpr[4] = (ctx.gpr[4] ^ 8u); - ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); - ctx.gpr[4] = (ctx.gpr[4] & 255u); - { const bool branch_taken = ctx.gpr[4] == 0u; - // nop - if (branch_taken) { - goto SB_L_08A6EA78; - } - goto SB_L_08A6E9FC; - } -SB_L_08A6E9FC: - ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[19] + static_cast(483)))))); - ctx.gpr[4] = (ctx.gpr[4] & 2u); - ctx.gpr[4] = (0u < ctx.gpr[4] ? 1u : 0u); - ctx.gpr[4] = (ctx.gpr[4] & 255u); - { const bool branch_taken = ctx.gpr[4] == 0u; - // nop - if (branch_taken) { - goto SB_L_08A6EA78; - } - goto SB_L_08A6EA14; - } -SB_L_08A6EA14: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(72))); - ctx.gpr[4] = (ctx.gpr[4] & 14u); - ctx.gpr[4] = (ctx.gpr[4] ^ 4u); - ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); - ctx.gpr[4] = (ctx.gpr[4] & 255u); - if (ctx.gpr[4] != 0u) { - ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[19] + static_cast(40))); - goto SB_L_08A6EA50; - } - goto SB_L_08A6EA30; -SB_L_08A6EA30: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(72))); - ctx.gpr[4] = (ctx.gpr[4] & 14u); - ctx.gpr[4] = (ctx.gpr[4] ^ 6u); - ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); - ctx.gpr[4] = (ctx.gpr[4] & 255u); - { const bool branch_taken = ctx.gpr[4] == 0u; - // nop - if (branch_taken) { - goto SB_L_08A6EA78; - } - goto SB_L_08A6EA4C; - } -SB_L_08A6EA4C: - ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[19] + static_cast(40))); - goto SB_L_08A6EA50; -SB_L_08A6EA50: - ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[13] < ctx.fpr[12])) ? 0x00800000u : 0u); - // nop - { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); - // nop - if (branch_taken) { - goto SB_L_08A6EA78; - } - goto SB_L_08A6EA60; - } -SB_L_08A6EA60: - ctx.gpr[18] = (ctx.gpr[23] | 0u); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(236))); - ctx.gpr[4] = (ctx.gpr[4] | 4096u); - aot_mem.aot_store32(ctx.gpr[19] + static_cast(236), ctx.gpr[4]); - { const bool branch_taken = 0u == 0u; - aot_mem.aot_store32(ctx.gpr[19] + static_cast(444), ctx.gpr[17]); - if (branch_taken) { - recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); - } - goto SB_L_08A6EA78; - } -SB_L_08A6EA78: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(72))); - ctx.gpr[4] = (ctx.gpr[4] & 14u); - ctx.gpr[4] = (ctx.gpr[4] ^ 8u); - ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); - ctx.gpr[4] = (ctx.gpr[4] & 255u); - { const bool branch_taken = ctx.gpr[4] == 0u; - // nop - if (branch_taken) { - goto SB_L_08A6EB10; - } - goto SB_L_08A6EA94; - } -SB_L_08A6EA94: - ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[17] + static_cast(483)))))); - ctx.gpr[4] = (ctx.gpr[4] & 2u); - ctx.gpr[4] = (0u < ctx.gpr[4] ? 1u : 0u); - ctx.gpr[4] = (ctx.gpr[4] & 255u); - { const bool branch_taken = ctx.gpr[4] == 0u; - // nop - if (branch_taken) { - goto SB_L_08A6EB10; - } - goto SB_L_08A6EAAC; - } -SB_L_08A6EAAC: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(72))); - ctx.gpr[4] = (ctx.gpr[4] & 14u); - ctx.gpr[4] = (ctx.gpr[4] ^ 4u); - ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); - ctx.gpr[4] = (ctx.gpr[4] & 255u); - if (ctx.gpr[4] != 0u) { - ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(40))); - goto SB_L_08A6EAE8; - } - goto SB_L_08A6EAC8; -SB_L_08A6EAC8: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(72))); - ctx.gpr[4] = (ctx.gpr[4] & 14u); - ctx.gpr[4] = (ctx.gpr[4] ^ 6u); - ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); - ctx.gpr[4] = (ctx.gpr[4] & 255u); - { const bool branch_taken = ctx.gpr[4] == 0u; - // nop - if (branch_taken) { - goto SB_L_08A6EB10; - } - goto SB_L_08A6EAE4; - } -SB_L_08A6EAE4: - ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(40))); - goto SB_L_08A6EAE8; -SB_L_08A6EAE8: - ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[13] < ctx.fpr[12])) ? 0x00800000u : 0u); - // nop - { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); - // nop - if (branch_taken) { - goto SB_L_08A6EB10; - } - goto SB_L_08A6EAF8; - } -SB_L_08A6EAF8: - ctx.gpr[18] = (ctx.gpr[23] | 0u); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(236))); - ctx.gpr[4] = (ctx.gpr[4] | 4096u); - aot_mem.aot_store32(ctx.gpr[19] + static_cast(236), ctx.gpr[4]); - { const bool branch_taken = 0u == 0u; - aot_mem.aot_store32(ctx.gpr[17] + static_cast(444), ctx.gpr[19]); - if (branch_taken) { - recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); - } - goto SB_L_08A6EB10; - } -SB_L_08A6EB10: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(72))); - ctx.gpr[4] = (ctx.gpr[4] & 14u); - ctx.gpr[4] = (ctx.gpr[4] ^ 8u); - ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); - ctx.gpr[4] = (ctx.gpr[4] & 255u); - { const bool branch_taken = ctx.gpr[4] == 0u; - // nop - if (branch_taken) { - goto SB_L_08A6EB78; - } - goto SB_L_08A6EB2C; - } -SB_L_08A6EB2C: - ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[19] + static_cast(474))); - ctx.gpr[4] = (0u | 4u); - { const bool branch_taken = ctx.gpr[6] != ctx.gpr[4]; - // nop - if (branch_taken) { - goto SB_L_08A6EB78; - } - goto SB_L_08A6EB3C; - } -SB_L_08A6EB3C: - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(72))); - ctx.gpr[6] = (ctx.gpr[6] & 14u); - ctx.gpr[6] = (ctx.gpr[6] ^ 8u); - ctx.gpr[6] = (ctx.gpr[6] < static_cast(1) ? 1u : 0u); - ctx.gpr[6] = (ctx.gpr[6] & 255u); - { const bool branch_taken = ctx.gpr[6] == 0u; - // nop - if (branch_taken) { - goto SB_L_08A6EB78; - } - goto SB_L_08A6EB58; - } -SB_L_08A6EB58: - ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(474))); - { const bool branch_taken = ctx.gpr[6] != ctx.gpr[4]; - // nop - if (branch_taken) { - goto SB_L_08A6EB78; - } - goto SB_L_08A6EB64; - } -SB_L_08A6EB64: - ctx.gpr[18] = (ctx.gpr[23] | 0u); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(236))); - ctx.gpr[4] = (ctx.gpr[4] | 4096u); - { const bool branch_taken = 0u == 0u; - aot_mem.aot_store32(ctx.gpr[19] + static_cast(236), ctx.gpr[4]); - if (branch_taken) { - recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); - } - goto SB_L_08A6EB78; - } -SB_L_08A6EB78: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(72))); - ctx.gpr[4] = (ctx.gpr[4] & 14u); - ctx.gpr[4] = (ctx.gpr[4] ^ 8u); - ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); - ctx.gpr[4] = (ctx.gpr[4] & 255u); - { const bool branch_taken = ctx.gpr[4] == 0u; - // nop - if (branch_taken) { - recomp_unit_0154_entry(rt, ctx, 301u, aot_mem); TIER2_SB_RETURN(); - } - goto SB_L_08A6EB94; - } -SB_L_08A6EB94: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(72))); - ctx.gpr[4] = (ctx.gpr[4] & 14u); - ctx.gpr[4] = (ctx.gpr[4] ^ 4u); - ctx.gpr[4] = (ctx.gpr[4] < static_cast(1) ? 1u : 0u); - ctx.gpr[4] = (ctx.gpr[4] & 255u); - { const bool branch_taken = ctx.gpr[4] == 0u; - // nop - if (branch_taken) { - recomp_unit_0154_entry(rt, ctx, 301u, aot_mem); TIER2_SB_RETURN(); - } - goto SB_L_08A6EBB0; - } -SB_L_08A6EBB0: - ctx.gpr[16] = (ctx.gpr[19] | 0u); - ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); - { const bool branch_taken = ctx.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: - ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(476))); - { const bool branch_taken = ctx.gpr[4] == ctx.gpr[5]; - // nop - if (branch_taken) { - goto SB_L_08A6EC1C; - } - goto SB_L_08A6EBD4; - } -SB_L_08A6EBD4: - ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[16] + static_cast(482)))))); - ctx.gpr[4] = (ctx.gpr[4] & 64u); - ctx.gpr[4] = (0u < ctx.gpr[4] ? 1u : 0u); - ctx.gpr[4] = (ctx.gpr[4] & 255u); - { const bool branch_taken = ctx.gpr[4] == ctx.gpr[23]; - // nop - if (branch_taken) { - goto SB_L_08A6EC1C; - } - goto SB_L_08A6EBEC; - } -SB_L_08A6EBEC: - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); - ctx.gpr[5] = (ctx.gpr[5] & 2048u); - { const bool branch_taken = ctx.gpr[5] != 0u; - ctx.gpr[4] = (0u | 0u); - if (branch_taken) { - goto SB_L_08A6EC0C; - } - goto SB_L_08A6EBFC; - } -SB_L_08A6EBFC: - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); - ctx.gpr[5] = (ctx.gpr[5] & 2048u); - { const bool branch_taken = ctx.gpr[5] == 0u; - ctx.gpr[4] = (ctx.gpr[4] & 255u); - if (branch_taken) { - goto SB_L_08A6EC14; - } - goto SB_L_08A6EC0C; - } -SB_L_08A6EC0C: - ctx.gpr[4] = (ctx.gpr[23] | 0u); - ctx.gpr[4] = (ctx.gpr[4] & 255u); - goto SB_L_08A6EC14; -SB_L_08A6EC14: - { const bool branch_taken = ctx.gpr[4] != 0u; - // nop - if (branch_taken) { - goto SB_L_08A6ED90; - } - goto SB_L_08A6EC1C; - } -SB_L_08A6EC1C: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(444))); - { const bool branch_taken = ctx.gpr[4] != ctx.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: - ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(473))); - ctx.gpr[4] = (static_cast(ctx.gpr[4]) < 3 ? 1u : 0u); - { const bool branch_taken = ctx.gpr[4] == 0u; - // nop - if (branch_taken) { - goto SB_L_08A6ED90; - } - goto SB_L_08A6EC40; - } -SB_L_08A6EC40: - aot_mem.aot_store32(ctx.gpr[29] + static_cast(128), 0u); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(136))); - ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[9]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(136), ctx.gpr[4]); - ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[19] + static_cast(86)))))); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); - ctx.gpr[6] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[6]) ? 1u : 0u); - { const bool branch_taken = ctx.gpr[6] == 0u; - ctx.gpr[5] = (0u | 0u); - if (branch_taken) { - goto SB_L_08A6EC74; - } - goto SB_L_08A6EC64; - } -SB_L_08A6EC64: - ctx.gpr[4] = (ctx.gpr[4] << 2u); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); - ctx.gpr[4] = (ctx.gpr[5] + ctx.gpr[4]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - goto SB_L_08A6EC74; -SB_L_08A6EC74: - ctx.gpr[8] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(20))); - ctx.gpr[8] = (ctx.gpr[8] + static_cast(32)); - ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[19] + static_cast(86)))))); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); - ctx.gpr[6] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[6]) ? 1u : 0u); - { const bool branch_taken = ctx.gpr[6] == 0u; - ctx.gpr[5] = (0u | 0u); - if (branch_taken) { - goto SB_L_08A6ECA0; - } - goto SB_L_08A6EC90; - } -SB_L_08A6EC90: - ctx.gpr[4] = (ctx.gpr[4] << 2u); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); - ctx.gpr[4] = (ctx.gpr[5] + ctx.gpr[4]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - goto SB_L_08A6ECA0; -SB_L_08A6ECA0: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(20))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(16)); - { const std::uint32_t vfpu_address = ctx.gpr[8] + static_cast(0); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } - { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; - ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); - ctx.read_vfpu_vector_with_source_prefix_ct<1u, 3u, 1u>(vfpu_t); - for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] - vfpu_t[i]; - ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } - ctx.gpr[21] = (ctx.gpr[29] + static_cast(144)); - { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); - const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } - { const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast(0); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast(16); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast(32); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast(48); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); } - { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; - ctx.read_vfpu_matrix_ct<36u, 3u>(vfpu_matrix); - ctx.read_vfpu_vector_ct<1u, 3u>(vfpu_target_raw); - constexpr std::uint32_t vfpu_side = 3u; - constexpr std::uint32_t vfpu_input_length = 3u; - for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; - if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; - for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { - float sum = 0.0f; - for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; - vfpu_result[row] = sum; - } - float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], - vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; - ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); - ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); - for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; - const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; - const std::uint32_t vfpu_last_lane = vfpu_side - 1u; - ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | - ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); - ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_result); } - { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; - ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); - ctx.read_vfpu_vector_with_source_prefix_ct<7u, 3u, 1u>(vfpu_t); - for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] + vfpu_t[i]; - ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } - ctx.gpr[4] = (ctx.gpr[29] + static_cast(48)); - { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); - const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } - { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); - const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } - ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(152))); - ctx.gpr[4] = (ctx.gpr[17] + static_cast(48)); - ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); - ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[13])) ? 0x00800000u : 0u); - // nop - { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); - // nop - if (branch_taken) { - goto SB_L_08A6ED10; - } - goto SB_L_08A6ED04; - } -SB_L_08A6ED04: - ctx.gpr[18] = (ctx.gpr[23] | 0u); - { const bool branch_taken = 0u == 0u; - aot_mem.aot_store32(ctx.gpr[16] + static_cast(444), ctx.gpr[17]); - if (branch_taken) { - goto SB_L_08A6ED6C; - } - goto SB_L_08A6ED10; - } -SB_L_08A6ED10: - ctx.gpr[30] = (ctx.gpr[29] + static_cast(64)); - ctx.gpr[4] = (ctx.gpr[17] | 0u); - ctx.gpr[31] = (0x08A6ED20u); - ctx.gpr[5] = (ctx.gpr[30] | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0022_entry, 22u, 934u, 0x0885FE8Cu>(ctx, &aot_mem) && ctx.pc == 0x08A6ED20u) goto SB_L_08A6ED20; - TIER2_SB_RETURN(); -SB_L_08A6ED20: - ctx.gpr[4] = (ctx.gpr[30] | 0u); - ctx.gpr[31] = (0x08A6ED2Cu); - ctx.gpr[5] = (ctx.gpr[2] | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 7u, 0x08860358u>(ctx, &aot_mem) && ctx.pc == 0x08A6ED2Cu) goto SB_L_08A6ED2C; - TIER2_SB_RETURN(); -SB_L_08A6ED2C: - { const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast(0); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast(16); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast(32); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast(48); - float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; - ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); } - { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; - ctx.read_vfpu_matrix_ct<36u, 3u>(vfpu_matrix); - ctx.read_vfpu_vector_ct<1u, 3u>(vfpu_target_raw); - constexpr std::uint32_t vfpu_side = 3u; - constexpr std::uint32_t vfpu_input_length = 3u; - for (std::uint32_t i = 0; i < 4u; ++i) vfpu_target[i] = i < vfpu_input_length ? vfpu_target_raw[i] : 0.0f; - if (vfpu_side - 1u >= vfpu_input_length) vfpu_target[vfpu_side - 1u] = 1.0f; - for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { - float sum = 0.0f; - for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; - vfpu_result[row] = sum; - } - float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], - vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; - ctx.apply_vfpu_source_prefix_ct<4u, 0u>(vfpu_final_row); - ctx.apply_vfpu_source_prefix_ct<4u, 1u>(vfpu_target); - for (std::uint32_t column = 0; column < 4u; ++column) vfpu_result[vfpu_side - 1u] += vfpu_final_row[column] * vfpu_target[column]; - const std::uint32_t vfpu_destination_prefix = ctx.vfpu_ctrl[2]; - const std::uint32_t vfpu_last_lane = vfpu_side - 1u; - ctx.vfpu_ctrl[2] = ((vfpu_destination_prefix & (1u << 8u)) << vfpu_last_lane) | - ((vfpu_destination_prefix & 3u) << (vfpu_last_lane * 2u)); - ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_result); } - { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; - ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); - ctx.read_vfpu_vector_with_source_prefix_ct<7u, 3u, 1u>(vfpu_t); - for (std::uint32_t i = 0; i < 3u; ++i) vfpu_d[i] = vfpu_s[i] + vfpu_t[i]; - ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } - ctx.gpr[4] = (ctx.gpr[29] + static_cast(160)); - { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); - const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } - ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(168))); - ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[26])) ? 0x00800000u : 0u); - // nop - { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); - // nop - if (branch_taken) { - goto SB_L_08A6ED6C; - } - goto SB_L_08A6ED64; - } -SB_L_08A6ED64: - ctx.gpr[18] = (ctx.gpr[23] | 0u); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(444), ctx.gpr[17]); - goto SB_L_08A6ED6C; -SB_L_08A6ED6C: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(136))); - ctx.gpr[4] = (ctx.gpr[4] & 1u); - { const bool branch_taken = ctx.gpr[4] == 0u; - // nop - if (branch_taken) { - goto SB_L_08A6ED90; - } - goto SB_L_08A6ED7C; - } -SB_L_08A6ED7C: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(128))); - { const bool branch_taken = ctx.gpr[4] == 0u; - // nop - if (branch_taken) { - goto SB_L_08A6ED90; - } - goto SB_L_08A6ED88; - } -SB_L_08A6ED88: - ctx.gpr[31] = (0x08A6ED90u); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(128))); - if (rt.invoke_chained_direct<&recomp_unit_0117_entry, 117u, 129u, 0x089D89E0u>(ctx, &aot_mem) && ctx.pc == 0x08A6ED90u) goto SB_L_08A6ED90; - TIER2_SB_RETURN(); -SB_L_08A6ED90: - { const bool branch_taken = 0u == 0u; - // nop - if (branch_taken) { - recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); - } - recomp_unit_0154_entry(rt, ctx, 301u, aot_mem); TIER2_SB_RETURN(); - } + constexpr std::uint32_t all = (1u << static_cast(Tier2ClusterId::Count)) - 1u; + const char *value = std::getenv("PSPRECOMP_TIER2_CLUSTER_MASK"); + if (value == nullptr || *value == '\0') return all; + errno = 0; + char *end = nullptr; + const unsigned long parsed = std::strtoul(value, &end, 0); + if (errno != 0 || end == value || (end != nullptr && *end != '\0')) return all; + return static_cast(parsed) & all; +} +} // namespace -SB_L_08A71100: - { const bool branch_taken = ctx.gpr[4] != 0u; - // nop - if (branch_taken) { - goto SB_L_08A711E0; - } - goto SB_L_08A71108; - } -SB_L_08A71108: - ctx.gpr[31] = (0x08A71110u); - ctx.gpr[4] = (ctx.gpr[19] | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0152_entry, 152u, 433u, 0x08A65EB4u>(ctx, &aot_mem) && ctx.pc == 0x08A71110u) goto SB_L_08A71110; - TIER2_SB_RETURN(); -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); - ctx.gpr[4] = (ctx.gpr[19] | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 100u, 0x08A68CBCu>(ctx, &aot_mem) && ctx.pc == 0x08A71120u) goto SB_L_08A71120; - TIER2_SB_RETURN(); -SB_L_08A71120: - { const bool branch_taken = ctx.gpr[2] != ctx.gpr[17]; - // nop - if (branch_taken) { - goto SB_L_08A7113C; - } - goto SB_L_08A71128; - } -SB_L_08A71128: - ctx.gpr[4] = (ctx.gpr[19] | 0u); - ctx.gpr[31] = (0x08A71134u); - ctx.gpr[5] = (0u | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 101u, 0x08A68CC4u>(ctx, &aot_mem) && ctx.pc == 0x08A71134u) goto SB_L_08A71134; - TIER2_SB_RETURN(); -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); - ctx.gpr[4] = (ctx.gpr[17] | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0152_entry, 152u, 433u, 0x08A65EB4u>(ctx, &aot_mem) && ctx.pc == 0x08A71144u) goto SB_L_08A71144; - TIER2_SB_RETURN(); -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); - ctx.gpr[4] = (ctx.gpr[17] | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 100u, 0x08A68CBCu>(ctx, &aot_mem) && ctx.pc == 0x08A71154u) goto SB_L_08A71154; - TIER2_SB_RETURN(); -SB_L_08A71154: - { const bool branch_taken = ctx.gpr[2] != ctx.gpr[19]; - // nop - if (branch_taken) { - goto SB_L_08A71180; - } - goto SB_L_08A7115C; - } -SB_L_08A7115C: - ctx.gpr[31] = (0x08A71164u); - ctx.gpr[4] = (ctx.gpr[17] | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 102u, 0x08A68CCCu>(ctx, &aot_mem) && ctx.pc == 0x08A71164u) goto SB_L_08A71164; - TIER2_SB_RETURN(); -SB_L_08A71164: - { const bool branch_taken = ctx.gpr[2] == ctx.gpr[19]; - // nop - if (branch_taken) { - goto SB_L_08A71180; - } - goto SB_L_08A7116C; - } -SB_L_08A7116C: - ctx.gpr[4] = (ctx.gpr[17] | 0u); - ctx.gpr[31] = (0x08A71178u); - ctx.gpr[5] = (0u | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 101u, 0x08A68CC4u>(ctx, &aot_mem) && ctx.pc == 0x08A71178u) goto SB_L_08A71178; - TIER2_SB_RETURN(); -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); - ctx.gpr[4] = (ctx.gpr[19] | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0152_entry, 152u, 432u, 0x08A65EA0u>(ctx, &aot_mem) && ctx.pc == 0x08A71188u) goto SB_L_08A71188; - TIER2_SB_RETURN(); -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); - ctx.gpr[4] = (ctx.gpr[19] | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 103u, 0x08A68CD4u>(ctx, &aot_mem) && ctx.pc == 0x08A71198u) goto SB_L_08A71198; - TIER2_SB_RETURN(); -SB_L_08A71198: - { const bool branch_taken = ctx.gpr[2] != ctx.gpr[17]; - // nop - if (branch_taken) { - goto SB_L_08A711B4; - } - goto SB_L_08A711A0; - } -SB_L_08A711A0: - ctx.gpr[4] = (ctx.gpr[19] | 0u); - ctx.gpr[31] = (0x08A711ACu); - ctx.gpr[5] = (0u | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 104u, 0x08A68CDCu>(ctx, &aot_mem) && ctx.pc == 0x08A711ACu) goto SB_L_08A711AC; - TIER2_SB_RETURN(); -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); - ctx.gpr[4] = (ctx.gpr[17] | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0152_entry, 152u, 432u, 0x08A65EA0u>(ctx, &aot_mem) && ctx.pc == 0x08A711BCu) goto SB_L_08A711BC; - TIER2_SB_RETURN(); -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); - ctx.gpr[4] = (ctx.gpr[17] | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 103u, 0x08A68CD4u>(ctx, &aot_mem) && ctx.pc == 0x08A711CCu) goto SB_L_08A711CC; - TIER2_SB_RETURN(); -SB_L_08A711CC: - { const bool branch_taken = ctx.gpr[2] != ctx.gpr[19]; - // nop - if (branch_taken) { - goto SB_L_08A711E0; - } - goto SB_L_08A711D4; - } -SB_L_08A711D4: - ctx.gpr[4] = (ctx.gpr[17] | 0u); - ctx.gpr[31] = (0x08A711E0u); - ctx.gpr[5] = (0u | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 104u, 0x08A68CDCu>(ctx, &aot_mem) && ctx.pc == 0x08A711E0u) goto SB_L_08A711E0; - TIER2_SB_RETURN(); -SB_L_08A711E0: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1576))); - { const bool branch_taken = ctx.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; - goto SB_L_08A6E8A4; - } - goto SB_L_08A711EC; - } -SB_L_08A711EC: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1600))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1596))); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(1600), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1604))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(-1)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(1596), ctx.gpr[4]); - { const bool branch_taken = ctx.gpr[5] != 0u; - aot_mem.aot_store32(ctx.gpr[29] + static_cast(1604), ctx.gpr[4]); - if (branch_taken) { - if (!rt.tier2_enter_fused_transfer<154u, 0x08A6E894u>(ctx)) { - ctx.pc = 0x08A6E894u; - TIER2_SB_RETURN(); - } - ++tier2_pending_transfers; - goto SB_L_08A6E894; - } - goto SB_L_08A71210; - } -SB_L_08A71210: - ctx.gpr[2] = (ctx.gpr[22] | 0u); - recomp_unit_0155_entry(rt, ctx, 269u, aot_mem); TIER2_SB_RETURN(); +std::uint32_t tier2_cluster_mask() noexcept { + static const std::uint32_t mask = parse_cluster_mask(); + return mask; +} -#undef TIER2_SB_RETURN +bool tier2_superblocks_enabled() noexcept { + return tier2_cluster_mask() != 0u; +} + +bool tier2_cluster_enabled(Tier2ClusterId id) noexcept { + // Never nest a generated Tier-2 superblock inside another Tier-2 frame. + // Cold/external paths resume the SAFE AOT corpus while the outer logical + // chain frames are still pending; re-entering another cluster there makes + // unwind ordering needlessly complex and can expose stale chain_depth. + if (tier2_detail::g_active_depth != 0u) return false; + return (tier2_cluster_mask() & (1u << static_cast(id))) != 0u; +} + +Tier2CountersSnapshot consume_tier2_counters() noexcept { + Tier2CountersSnapshot out{}; + out.cluster = tier2_detail::g_counters; + tier2_detail::g_counters = {}; + return out; +} + +const char *tier2_cluster_name(Tier2ClusterId id) noexcept { + switch (id) { + case Tier2ClusterId::Entity: return "entity"; + case Tier2ClusterId::Geometry: return "geometry"; + case Tier2ClusterId::Boundary: return "boundary"; + case Tier2ClusterId::Matrix: return "matrix"; + case Tier2ClusterId::Physics: return "physics"; + case Tier2ClusterId::World: return "world"; + case Tier2ClusterId::Edge43: return "edge43"; + default: return "unknown"; + } } } // namespace vcs diff --git a/profiles/vcs/host/vcs_tier2_superblocks.hpp b/profiles/vcs/host/vcs_tier2_superblocks.hpp index 89e74d3..8171144 100644 --- a/profiles/vcs/host/vcs_tier2_superblocks.hpp +++ b/profiles/vcs/host/vcs_tier2_superblocks.hpp @@ -1,6 +1,10 @@ #pragma once #include "psprecomp/guest_memory.hpp" + +#include +#include +#include #include namespace psprecomp { @@ -10,10 +14,104 @@ struct AllegrexContext; namespace vcs { +enum class Tier2ClusterId : std::uint32_t { + Entity = 0u, // 0152/0153 leaf accessors + 0154/0155 entity loop + Geometry = 1u, // 0084/0085 geometry/collision hot functions + Boundary = 2u, // 0085/0086 unit-boundary loop + Matrix = 3u, // 0044 matrix/VFPU hot function + Physics = 4u, // 0129 hot transform/physics function + World = 5u, // 0157/0158 dominant world/streaming hot functions + Edge43 = 6u, // 0043/0044 cross-unit boundary + Count = 7u, +}; + +constexpr std::size_t kTier2ClusterCount = static_cast(Tier2ClusterId::Count); + +struct Tier2ClusterCounters { + std::uint64_t entries{}; + std::uint64_t fused_tail_edges{}; + std::uint64_t fused_calls{}; + std::uint64_t cold_exits{}; + std::uint64_t fallbacks{}; + std::uint64_t sampled_entries{}; + std::uint64_t sampled_ns{}; +}; + +struct Tier2CountersSnapshot { + std::array cluster{}; +}; + +namespace tier2_detail { +extern thread_local std::array g_counters; +extern thread_local std::uint32_t g_active_depth; + +inline Tier2ClusterCounters &counters(Tier2ClusterId id) noexcept { + return g_counters[static_cast(id)]; +} + +// Entry timing is sampled 1/256 so coverage telemetry remains cheap enough to +// leave enabled in performance builds. The destructor sees every exit path, +// including cold fallback and scheduler invalidation. +class SampleScope { +public: + explicit SampleScope(Tier2ClusterId id) noexcept + : counter_(&counters(id)) { + ++g_active_depth; + active_ = true; + const std::uint64_t entry = ++counter_->entries; + sample_ = (entry & 0xFFu) == 0u; + if (sample_) { + ++counter_->sampled_entries; + start_ = std::chrono::steady_clock::now(); + } + } + + ~SampleScope() noexcept { + finish(); + if (active_) { + if (g_active_depth != 0u) --g_active_depth; + active_ = false; + } + } + + void finish() noexcept { + if (!sample_ || finished_) return; + const auto ns = std::chrono::duration_cast( + std::chrono::steady_clock::now() - start_).count(); + if (ns > 0) counter_->sampled_ns += static_cast(ns); + finished_ = true; + } + + Tier2ClusterCounters &stats() noexcept { return *counter_; } + +private: + Tier2ClusterCounters *counter_{}; + std::chrono::steady_clock::time_point start_{}; + bool sample_{}; + bool finished_{}; + bool active_{}; +}; +} // namespace tier2_detail + bool tier2_superblocks_enabled() noexcept; -void tier2_superblock_154_155(psprecomp::Runtime &rt, - psprecomp::AllegrexContext &ctx, - psprecomp::GuestMemory::AotFastView &aot_mem, - std::uint32_t entry_pc); +bool tier2_cluster_enabled(Tier2ClusterId id) noexcept; +std::uint32_t tier2_cluster_mask() noexcept; +Tier2CountersSnapshot consume_tier2_counters() noexcept; +const char *tier2_cluster_name(Tier2ClusterId id) noexcept; + +void tier2_superblock_entity(psprecomp::Runtime &, psprecomp::AllegrexContext &, + psprecomp::GuestMemory::AotFastView &, std::uint32_t entry_pc); +void tier2_superblock_geometry(psprecomp::Runtime &, psprecomp::AllegrexContext &, + psprecomp::GuestMemory::AotFastView &, std::uint32_t entry_pc); +void tier2_superblock_boundary(psprecomp::Runtime &, psprecomp::AllegrexContext &, + psprecomp::GuestMemory::AotFastView &, std::uint32_t entry_pc); +void tier2_superblock_matrix(psprecomp::Runtime &, psprecomp::AllegrexContext &, + psprecomp::GuestMemory::AotFastView &, std::uint32_t entry_pc); +void tier2_superblock_physics(psprecomp::Runtime &, psprecomp::AllegrexContext &, + psprecomp::GuestMemory::AotFastView &, std::uint32_t entry_pc); +void tier2_superblock_world(psprecomp::Runtime &, psprecomp::AllegrexContext &, + psprecomp::GuestMemory::AotFastView &, std::uint32_t entry_pc); +void tier2_superblock_edge43(psprecomp::Runtime &, psprecomp::AllegrexContext &, + psprecomp::GuestMemory::AotFastView &, std::uint32_t entry_pc); } // namespace vcs diff --git a/profiles/vcs/scripts/build_release_ninja.bat b/profiles/vcs/scripts/build_release_ninja.bat index 88d430b..b39cbcf 100644 --- a/profiles/vcs/scripts/build_release_ninja.bat +++ b/profiles/vcs/scripts/build_release_ninja.bat @@ -92,7 +92,7 @@ if not exist "%CTEST_EXE%" set "CTEST_EXE=ctest.exe" set "NINJA_STATUS=[%%f/%%t %%p ^| %%e elapsed ^| %%r running] " set "BOOTFIX_STAMP=%BUILD%\.vcs_tier2_bootfix_20260816_v1" -set "SUPERBLOCK_STAMP=%BUILD%\.vcs_tier2_superblock_v1_20260816" +set "SUPERBLOCK_STAMP=%BUILD%\.vcs_tier2_superblock_v2_unwind_hotfix_20260816" echo ================================================================ echo VCS - NINJA PERFORMANCE INCREMENTAL BUILD @@ -104,7 +104,7 @@ echo CMake: %CMAKE_EXE% echo Ninja: %NINJA_EXE% echo Ninja workers: %JOBS% echo cl.exe /MP: OFF ^(Ninja owns compile parallelism^) -echo Generated AOT: O3, cold /Ob0, measured hot /Ob3; Tier2 hot superblock host O2 /Ob3 +echo Generated AOT: O3, cold /Ob0, measured hot /Ob3; Tier2 V2 clusters O2 /Ob3 /GL- echo Host/core LTCG: ON echo AVX2/fast paths: ON echo ================================================================ @@ -113,7 +113,7 @@ echo [0b/7] Reapplying BOOTFIX-safe Tier-2 transforms (OPT1 semantic transforms call "%PROFILE%\APPLY_TIER2_EXTREME.bat" if errorlevel 1 goto :FAIL -echo [0b2/7] Building profile-guided Tier-2 superblock cluster 0154+0155... +echo [0b2/7] Building profile-guided Tier-2 V2 multi-cluster second layer... set "PYTHON3_CMD=" py -3 -c "import sys; raise SystemExit(0 if sys.version_info.major == 3 else 1)" >nul 2>&1 if not errorlevel 1 set "PYTHON3_CMD=py -3" @@ -128,11 +128,12 @@ if errorlevel 1 goto :FAIL if exist "%BUILD%" if not exist "%SUPERBLOCK_STAMP%" ( echo. - echo [0c-super/7] Tier2 SUPERBLOCK V1 revision changed - invalidating fused pair objects once... - del /s /q "%BUILD%\*generated_unit_0154*.obj" >nul 2>&1 - del /s /q "%BUILD%\*generated_unit_0155*.obj" >nul 2>&1 + echo [0c-super/7] Tier2 SUPERBLOCK V2 UNWIND HOTFIX - invalidating measured hook/cluster objects once... + for %%U in (0043 0044 0084 0085 0086 0129 0154 0155 0157 0158) do del /s /q "%BUILD%\*generated_unit_%%U*.obj" >nul 2>&1 del /s /q "%BUILD%\*vcs_tier2_superblocks*.obj" >nul 2>&1 - del /s /q "%BUILD%\*runtime*.obj" >nul 2>&1 + del /s /q "%BUILD%\*vcs_tier2_cluster_*.obj" >nul 2>&1 + del /s /q "%BUILD%\*vcs_profile*.obj" >nul 2>&1 + del /s /q "%BUILD%\*vcs_runtime_log*.obj" >nul 2>&1 ) if exist "%BUILD%" if not exist "%BOOTFIX_STAMP%" ( @@ -169,7 +170,7 @@ echo [2/7] Building VCSNative with Ninja... "%CMAKE_EXE%" --build "%BUILD%" --parallel %JOBS% --target VCSNative if errorlevel 1 goto :FAIL >"%BOOTFIX_STAMP%" echo VCS Tier2 BOOTFIX 2026-08-16 v1 ->"%SUPERBLOCK_STAMP%" echo VCS Tier2 SUPERBLOCK V1 2026-08-16 +>"%SUPERBLOCK_STAMP%" echo VCS Tier2 SUPERBLOCK V2 UNWIND HOTFIX 2026-08-16 echo. echo [2b/7] Building tests and DX12 probes... diff --git a/profiles/vcs/tests/vcs_profile_tests.cpp b/profiles/vcs/tests/vcs_profile_tests.cpp index 068e28f..4595385 100644 --- a/profiles/vcs/tests/vcs_profile_tests.cpp +++ b/profiles/vcs/tests/vcs_profile_tests.cpp @@ -1,6 +1,7 @@ #include "framebuffer_capture.hpp" #include "ge_renderer.hpp" #include "vcs_profile.hpp" +#include "vcs_tier2_superblocks.hpp" #include "psprecomp/guest_memory.hpp" @@ -678,6 +679,63 @@ void test_ge_fixed_mip_level_selection() { "constant PSP LOD did not select mip level 1"); } + +void test_tier2_counter_snapshot_reset() { + using vcs::Tier2ClusterId; + auto &entity = vcs::tier2_detail::counters(Tier2ClusterId::Entity); + auto &world = vcs::tier2_detail::counters(Tier2ClusterId::World); + + (void)vcs::consume_tier2_counters(); + + entity.entries = 3; + entity.fused_tail_edges = 5; + entity.fused_calls = 7; + entity.cold_exits = 11; + entity.fallbacks = 13; + entity.sampled_entries = 17; + entity.sampled_ns = 19000; + world.entries = 23; + world.fused_calls = 29; + + const auto snapshot = vcs::consume_tier2_counters(); + const auto &entity_snapshot = + snapshot.cluster[static_cast(Tier2ClusterId::Entity)]; + const auto &world_snapshot = + snapshot.cluster[static_cast(Tier2ClusterId::World)]; + + require(entity_snapshot.entries == 3, "Tier2 entity entry counter snapshot mismatch"); + require(entity_snapshot.fused_tail_edges == 5, "Tier2 fused-tail snapshot mismatch"); + require(entity_snapshot.fused_calls == 7, "Tier2 fused-call snapshot mismatch"); + require(entity_snapshot.cold_exits == 11, "Tier2 cold-exit snapshot mismatch"); + require(entity_snapshot.fallbacks == 13, "Tier2 fallback snapshot mismatch"); + require(entity_snapshot.sampled_entries == 17, "Tier2 sampled-entry snapshot mismatch"); + require(entity_snapshot.sampled_ns == 19000, "Tier2 sampled-time snapshot mismatch"); + require(world_snapshot.entries == 23 && world_snapshot.fused_calls == 29, + "Tier2 multi-cluster snapshot mismatch"); + + const auto reset_snapshot = vcs::consume_tier2_counters(); + for (const auto &cluster : reset_snapshot.cluster) { + require(cluster.entries == 0 && cluster.fused_tail_edges == 0 && + cluster.fused_calls == 0 && cluster.cold_exits == 0 && + cluster.fallbacks == 0 && cluster.sampled_entries == 0 && + cluster.sampled_ns == 0, + "Tier2 counters were not reset after consume"); + } + + require(vcs::tier2_detail::g_active_depth == 0u, + "Tier2 active-depth started nonzero"); + { + vcs::tier2_detail::SampleScope scope(Tier2ClusterId::Entity); + require(vcs::tier2_detail::g_active_depth == 1u, + "Tier2 SampleScope did not arm reentry guard"); + require(!vcs::tier2_cluster_enabled(Tier2ClusterId::Geometry), + "Tier2 allowed nested cluster reentry while a superblock was active"); + } + require(vcs::tier2_detail::g_active_depth == 0u, + "Tier2 SampleScope leaked active-depth on unwind"); + (void)vcs::consume_tier2_counters(); +} + void test_framebuffer_formats() { psprecomp::GuestMemory memory; constexpr std::uint32_t address = 0x04000000u; @@ -705,6 +763,7 @@ void test_framebuffer_formats() { bool rejected = false; try { + test_tier2_counter_snapshot_reset(); auto invalid = format; invalid.stride = 0u; (void)vcs::decode_framebuffer_rgb(memory, invalid); diff --git a/profiles/vcs/tools/build_tier2_superblocks.py b/profiles/vcs/tools/build_tier2_superblocks.py index d7e9aad..05bd0f6 100644 --- a/profiles/vcs/tools/build_tier2_superblocks.py +++ b/profiles/vcs/tools/build_tier2_superblocks.py @@ -1,127 +1,551 @@ #!/usr/bin/env python3 -"""Generate the profile-guided VCS Tier-2 hot superblock V1. +"""Generate VCS Tier-2 SUPERBLOCK V2 multi-cluster second-layer AOT. -The second layer deliberately duplicates only the physically hot region, not -whole 16 KiB AOT units. Cold exits resume the original generated unit at -its existing direct-entry id without creating a new logical chain frame. -Logical cross-unit tail frames retain Runtime chain-depth and starvation -accounting through tier2_enter_fused_transfer/tier2_complete_fused_transfers. +V2 is profile-guided and intentionally keeps the original generated corpus as +its semantic fallback. It extracts only measured hot control-flow closures, +fuses selected cross-unit direct calls/tails inside those closures, and leaves +all cold/external paths in the original AOT units. + +The generated code preserves Runtime chain-depth and starvation accounting for +removed invoke_chained_direct frames through tier2_enter_fused_transfer() and +tier2_complete_fused_transfers(). """ from __future__ import annotations + import argparse +import collections +import dataclasses import pathlib import re +from typing import Dict, Iterable, List, Mapping, MutableMapping, Sequence, Set, Tuple -U154_START = 0x08A6E894 -U154_END = 0x08A6ED98 # cold exit label, excluded -U155_START = 0x08A71100 -U155_END = 0x08A71214 # cold epilogue, excluded -HOOK_PCS = { - 154: (0x08A6E894, 0x08A6E8A4), - 155: (0x08A71100, 0x08A711E0, 0x08A711EC), -} -HOOK_BEGIN = '// TIER2_SUPERBLOCK_V1_HOOK_BEGIN\n' -HOOK_END = '// TIER2_SUPERBLOCK_V1_HOOK_END\n' +HOOK_BEGIN = '// TIER2_SUPERBLOCK_V2_HOOK_BEGIN\n' +HOOK_END = '// TIER2_SUPERBLOCK_V2_HOOK_END\n' +OLD_HOOK_BEGIN = '// TIER2_SUPERBLOCK_V1_HOOK_BEGIN\n' +OLD_HOOK_END = '// TIER2_SUPERBLOCK_V1_HOOK_END\n' +HEADER_INCLUDE = '#include "vcs_tier2_superblocks.hpp"\n' + +# Generated unit labels use globally unique guest PCs, so one label namespace +# can safely span several AOT units in a cluster. +LABEL_RE = re.compile(r'^L_([0-9A-F]{8}):\n', re.M) +GOTO_RE = re.compile(r'goto SB_L_([0-9A-F]{8});') +DIRECT_ENTRY_RE = re.compile(r'case (\d+)u: goto L_([0-9A-F]{8});') +DIRECT_CALL_RE = re.compile( + r'(?P[ \t]*)if \(rt\.invoke_chained_direct<&recomp_unit_(?P\d+)_entry, ' + r'(?P\d+)u, (?P\d+)u, (?P0x[0-9A-F]+)u>' + r'\(ctx, &aot_mem\) && ctx\.pc == (?P0x[0-9A-F]+)u\) ' + r'goto SB_L_(?P[0-9A-F]{8});\n(?P=indent)return;') +TAIL_CALL_RE = re.compile( + r'(?P[ \t]*)\(void\)rt\.invoke_chained_direct<&recomp_unit_(?P\d+)_entry, ' + r'(?P\d+)u, (?P\d+)u, (?P0x[0-9A-F]+)u>' + r'\(ctx, &aot_mem\); return;') +LOCAL_DISPATCH_SEQUENCE_RE = re.compile( + r'(?P[ \t]*)local_pc = (?P[^;]+);\n' + r'(?P=indent)if \(\+\+local_transfers < 256u\) \{ entry_id = 0u; goto LOCAL_DISPATCH; \}\n' + r'(?P=indent)ctx\.pc = (?P[^;]+);\n' + r'(?P=indent)return;') -def strip_old_hooks(text: str) -> str: - text = re.sub( - re.escape(HOOK_BEGIN) + r'.*?' + re.escape(HOOK_END), - '', text, flags=re.S) +@dataclasses.dataclass(frozen=True) +class UnitSource: + unit: int + raw: str + blocks: Mapping[int, str] + ordered_pcs: Tuple[int, ...] + entries: Mapping[int, int] + + +@dataclasses.dataclass +class Cluster: + key: str + enum_name: str + function: str + # Unit -> hot seed PCs. Local control-flow closure is extracted from these. + seeds: Dict[int, List[int]] + # Optional explicit PC windows. These are useful for the entity loop where + # unrestricted local closure pulls in unrelated cold functions. + windows: Dict[int, List[Tuple[int, int]]] = dataclasses.field(default_factory=dict) + # Units where cross-unit call targets are recursively pulled into the same + # cluster. This is bounded by the source units in `seeds`/`windows`. + expand_cross_units: bool = False + hooks: Dict[int, List[int]] = dataclasses.field(default_factory=dict) + max_blocks: int = 700 + + +CLUSTERS: List[Cluster] = [ + Cluster( + key='entity', enum_name='Entity', function='tier2_superblock_entity', + seeds={}, + windows={ + 152: [(0x08A65EA0, 0x08A65EC8)], + 153: [(0x08A68CBC, 0x08A68CE4)], + 154: [(0x08A6E894, 0x08A6ED98)], + 155: [(0x08A71100, 0x08A71214)], + }, + expand_cross_units=False, + hooks={154: [0x08A6E894, 0x08A6E8A4], + 155: [0x08A71100, 0x08A711E0, 0x08A711EC]}, + ), + Cluster( + key='geometry', enum_name='Geometry', function='tier2_superblock_geometry', + seeds={84: [0x08955444, 0x089554A8], + 85: [0x08958D28, 0x0895A760]}, + expand_cross_units=True, + hooks={84: [0x08955444, 0x089554A8], + 85: [0x08958D28, 0x0895A760]}, + max_blocks=520, + ), + Cluster( + key='boundary', enum_name='Boundary', function='tier2_superblock_boundary', + seeds={85: [0x0895BF3C, 0x0895BF7C], + 86: [0x0895C000, 0x0895C01C, 0x0895C2A8]}, + expand_cross_units=True, + hooks={85: [0x0895BF3C, 0x0895BF7C], + 86: [0x0895C000, 0x0895C01C, 0x0895C2A8]}, + max_blocks=180, + ), + Cluster( + key='matrix', enum_name='Matrix', function='tier2_superblock_matrix', + seeds={44: [0x088B4738]}, + hooks={44: [0x088B4738]}, + max_blocks=180, + ), + Cluster( + key='physics', enum_name='Physics', function='tier2_superblock_physics', + seeds={129: [0x08A09B2C]}, + hooks={129: [0x08A09B2C]}, + max_blocks=100, + ), + Cluster( + key='world', enum_name='World', function='tier2_superblock_world', + seeds={157: [0x08A79DF8, 0x08A7A94C, 0x08A7A664, + 0x08A7B5A8, 0x08A7B5A0, 0x08A7B910, 0x08A7B5B0], + 158: [0x08A7EC68, 0x08A7F080]}, + expand_cross_units=True, + hooks={157: [0x08A79DF8, 0x08A7A94C, 0x08A7A664, 0x08A7B5A8], + 158: [0x08A7EC68, 0x08A7F080]}, + max_blocks=700, + ), + Cluster( + key='edge43', enum_name='Edge43', function='tier2_superblock_edge43', + seeds={43: [0x088B3FCC], 44: [0x088B4004, 0x088B40F8]}, + expand_cross_units=True, + hooks={43: [0x088B3FCC], 44: [0x088B4004, 0x088B40F8]}, + max_blocks=100, + ), +] + + +def strip_hooks(text: str) -> str: + for begin, end in ((HOOK_BEGIN, HOOK_END), (OLD_HOOK_BEGIN, OLD_HOOK_END)): + text = re.sub(re.escape(begin) + r'.*?' + re.escape(end), '', text, flags=re.S) + text = text.replace(HEADER_INCLUDE, '') return text -def region(text: str, start: int, end: int) -> str: - a = text.find(f'L_{start:08X}:') - b = text.find(f'L_{end:08X}:') - if a < 0 or b < 0 or b <= a: - raise RuntimeError(f'cannot extract region {start:08X}-{end:08X}') - return text[a:b] +def parse_unit(path: pathlib.Path, unit: int) -> UnitSource: + raw = strip_hooks(path.read_text(encoding='utf-8')) + matches = list(LABEL_RE.finditer(raw)) + blocks: Dict[int, str] = {} + order: List[int] = [] + end_markers = [m.start() for m in ( + re.search(r'\n}\n\nvoid recomp_unit_\d+\(', raw), + re.search(r'\n}\n\nvoid register_generated_unit_', raw), + ) if m is not None] + code_end = min(end_markers) if end_markers else len(raw) + for i, match in enumerate(matches): + pc = int(match.group(1), 16) + end = matches[i + 1].start() if i + 1 < len(matches) else code_end + # Labels belonging to registration metadata do not exist, but clamp the + # final executable block defensively so the generated superblock never + # copies the unit registration function or namespace close. + end = min(end, code_end) + blocks[pc] = raw[match.start():end] + order.append(pc) + entries = {int(pc, 16): int(entry) for entry, pc in DIRECT_ENTRY_RE.findall(raw)} + return UnitSource(unit=unit, raw=raw, blocks=blocks, + ordered_pcs=tuple(order), entries=entries) -def direct_entry_map(full_text: str) -> dict[int, int]: - return {int(pc, 16): int(entry_id) for entry_id, pc in re.findall( - r'case (\d+)u: goto L_([0-9A-F]{8});', full_text)} +def local_closure(source: UnitSource, seeds: Iterable[int], limit: int) -> Set[int]: + queue = collections.deque(seeds) + selected: Set[int] = set() + while queue: + if len(selected) >= limit: + raise RuntimeError(f'unit {source.unit:04d}: hot closure exceeded {limit} blocks') + pc = queue.popleft() + if pc in selected: + continue + block = source.blocks.get(pc) + if block is None: + raise RuntimeError(f'unit {source.unit:04d}: missing hot seed/target 0x{pc:08X}') + selected.add(pc) + for target in re.findall(r'goto L_([0-9A-F]{8});', block): + target_pc = int(target, 16) + if target_pc in source.blocks and target_pc not in selected: + queue.append(target_pc) + return selected -def transform_region(text: str, unit: int, partner: int, - start: int, end: int, - partner_start: int, partner_end: int, - self_entries: dict[int, int]) -> tuple[str, int, int, int]: - # Namespace labels so both source regions can live in one function. - text = re.sub(r'\bL_([0-9A-F]{8})\b', r'SB_L_\1', text) +def window_blocks(source: UnitSource, windows: Sequence[Tuple[int, int]]) -> Set[int]: + out: Set[int] = set() + for start, end in windows: + if start not in source.blocks: + raise RuntimeError(f'unit {source.unit:04d}: window start 0x{start:08X} missing') + for pc in source.ordered_pcs: + if start <= pc < end: + out.add(pc) + return out - fused = 0 - # Only tail edges between the two selected regions are fused. JALs to other - # units remain invoke_chained_direct so HLE/thread-switch semantics are exact. - tail = re.compile( - rf' \(void\)rt\.invoke_chained_direct<&recomp_unit_{partner:04d}_entry, {partner}u, ' - r'(\d+)u, (0x[0-9A-F]+)u>\(ctx, &aot_mem\); return;' - ) - def tail_repl(m: re.Match[str]) -> str: - nonlocal fused - entry_id = int(m.group(1)) - target = int(m.group(2), 16) - if not (partner_start <= target < partner_end): +def selected_for_cluster(cluster: Cluster, sources: Mapping[int, UnitSource]) -> Dict[int, Set[int]]: + units = sorted(set(cluster.seeds) | set(cluster.windows)) + selected: Dict[int, Set[int]] = {u: set() for u in units} + for unit in units: + src = sources[unit] + if unit in cluster.windows: + selected[unit].update(window_blocks(src, cluster.windows[unit])) + if unit in cluster.seeds: + selected[unit].update(local_closure(src, cluster.seeds[unit], cluster.max_blocks)) + + if not cluster.expand_cross_units: + return selected + + # Recursively pull direct-call targets only when both source and destination + # units are members of this cluster. Local closure of those targets captures + # whole guest functions/loops but remains bounded by max_blocks. + changed = True + while changed: + changed = False + total = sum(len(v) for v in selected.values()) + if total > cluster.max_blocks: + raise RuntimeError(f'{cluster.key}: closure exceeded {cluster.max_blocks} blocks') + for unit in units: + src = sources[unit] + for pc in list(selected[unit]): + block = src.blocks[pc] + for target_unit_s, target_pc_s in re.findall( + r'invoke_chained_direct<&recomp_unit_(\d+)_entry, \d+u, \d+u, ' + r'(0x[0-9A-F]+)u>', block): + target_unit = int(target_unit_s) + target_pc = int(target_pc_s, 16) + if target_unit not in selected or target_pc in selected[target_unit]: + continue + closure = local_closure(sources[target_unit], [target_pc], cluster.max_blocks) + before = len(selected[target_unit]) + selected[target_unit].update(closure) + if len(selected[target_unit]) != before: + changed = True + return selected + + +def selected_pc_owner(selected: Mapping[int, Set[int]]) -> Dict[int, int]: + owner: Dict[int, int] = {} + for unit, pcs in selected.items(): + for pc in pcs: + if pc in owner and owner[pc] != unit: + raise RuntimeError(f'duplicate guest PC 0x{pc:08X}') + owner[pc] = unit + return owner + + +def transform_block(block: str, source_unit: int, selected: Mapping[int, Set[int]], + sources: Mapping[int, UnitSource], stats: MutableMapping[str, int], + fused_continuations: MutableMapping[Tuple[int, int], int]) -> str: + pc_owner = selected_pc_owner(selected) + selected_all = set(pc_owner) + text = re.sub(r'\bL_([0-9A-F]{8})\b', r'SB_L_\1', block) + + # Fuse JAL-style direct calls when the callee target is part of this cluster. + def direct_repl(m: re.Match[str]) -> str: + target_unit = int(m.group('target_unit')) + target_pc = int(m.group('target_pc'), 16) + cont = int(m.group('cont'), 16) + indent = m.group('indent') + if target_pc not in selected_all or pc_owner[target_pc] != target_unit: return m.group(0) - fused += 1 + stats['fused_calls'] += 1 + fused_continuations[(source_unit, cont)] = sources[source_unit].entries.get(cont, -1) + original = m.group(0).replace('return;', 'TIER2_SB_RETURN();') return ( - f' if (!rt.tier2_enter_fused_transfer<{partner}u, 0x{target:08X}u>(ctx)) {{\n' - f' ctx.pc = 0x{target:08X}u;\n' - f' TIER2_SB_RETURN();\n' - f' }}\n' - f' ++tier2_pending_transfers;\n' - f' goto SB_L_{target:08X};' + f'{indent}if (tier2_return_depth < kTier2ReturnCapacity) {{\n' + f'{indent} if (!rt.tier2_enter_fused_transfer<{target_unit}u, 0x{target_pc:08X}u>(ctx)) {{\n' + f'{indent} ctx.pc = 0x{target_pc:08X}u;\n' + f'{indent} TIER2_SB_RETURN();\n' + f'{indent} }}\n' + f'{indent} tier2_return_pc[tier2_return_depth] = 0x{cont:08X}u;\n' + f'{indent} tier2_return_unit[tier2_return_depth] = {source_unit}u;\n' + f'{indent} tier2_return_pending_base[tier2_return_depth] = tier2_pending_transfers;\n' + f'{indent} ++tier2_return_depth;\n' + f'{indent} ++tier2_stats.fused_calls;\n' + f'{indent} goto SB_L_{target_pc:08X};\n' + f'{indent}}}\n' + f'{indent}++tier2_stats.fallbacks;\n' + f'{original}' ) - text = tail.sub(tail_repl, text) + text = DIRECT_CALL_RE.sub(direct_repl, text) - # Any ordinary local branch that leaves the selected hot region resumes the - # original generated unit at its existing direct-entry id. This is an - # ordinary native call, *not* invoke_chained_direct: the original local goto - # did not create a logical chain frame or scheduler work item either. - cold_exits: set[int] = set() - cold_dispatch_fallbacks: set[int] = set() - goto_re = re.compile(r'goto SB_L_([0-9A-F]{8});') + # Fuse tail-style direct calls. Their logical chain frames stay pending until + # the superblock leaves, matching nested native tail frames in V1/SAFE AOT. + def tail_repl(m: re.Match[str]) -> str: + target_unit = int(m.group('target_unit')) + target_pc = int(m.group('target_pc'), 16) + indent = m.group('indent') + if target_pc not in selected_all or pc_owner[target_pc] != target_unit: + return m.group(0) + stats['fused_tail'] += 1 + return ( + f'{indent}if (!rt.tier2_enter_fused_transfer<{target_unit}u, 0x{target_pc:08X}u>(ctx)) {{\n' + f'{indent} ctx.pc = 0x{target_pc:08X}u;\n' + f'{indent} TIER2_SB_RETURN();\n' + f'{indent}}}\n' + f'{indent}++tier2_pending_transfers;\n' + f'{indent}++tier2_stats.fused_tail_edges;\n' + f'{indent}goto SB_L_{target_pc:08X};' + ) + text = TAIL_CALL_RE.sub(tail_repl, text) + + # Standard generated indirect/local return path. The shared unit-specific + # dispatcher below recognizes a fused-call continuation and performs exactly + # one logical chain unwind before resuming the caller. + def local_dispatch_repl(m: re.Match[str]) -> str: + indent = m.group('indent') + return (f'{indent}local_pc = {m.group("local_expr")};\n' + f'{indent}goto TIER2_LOCAL_DISPATCH_U{source_unit:04d};') + text = LOCAL_DISPATCH_SEQUENCE_RE.sub(local_dispatch_repl, text) + text = text.replace('goto LOCAL_DISPATCH;', f'goto TIER2_LOCAL_DISPATCH_U{source_unit:04d};') + + # Any ordinary local branch that leaves this cluster resumes the exact + # original generated entry without creating a new logical chain frame. def goto_repl(m: re.Match[str]) -> str: target = int(m.group(1), 16) - in_self = start <= target < end - in_partner = partner_start <= target < partner_end - if in_self or in_partner: + if target in selected_all: return m.group(0) - cold_exits.add(target) - entry_id = self_entries.get(target) - if entry_id is not None: - return (f'recomp_unit_{unit:04d}_entry(rt, ctx, {entry_id}u, aot_mem); ' + entry = sources[source_unit].entries.get(target) + stats['cold_exits'] += 1 + if entry is not None: + return (f'++tier2_stats.cold_exits; tier2_scope.finish(); ' + f'psprecomp::recomp_unit_{source_unit:04d}_entry(rt, ctx, {entry}u, aot_mem); ' f'TIER2_SB_RETURN();') - cold_dispatch_fallbacks.add(target) - return f'ctx.pc = 0x{target:08X}u; TIER2_SB_RETURN();' + return (f'++tier2_stats.cold_exits; ctx.pc = 0x{target:08X}u; TIER2_SB_RETURN();') + text = GOTO_RE.sub(goto_repl, text) - text = goto_re.sub(goto_repl, text) - - # Remaining returns are exits caused by non-fused calls, unsupported paths, - # or chain fallback. Unwind the logical fused tail frames first. - text = text.replace('return;', 'TIER2_SB_RETURN();') - return text, fused, len(cold_exits), len(cold_dispatch_fallbacks) + # External calls / unsupported exits remain the SAFE AOT implementation and + # simply unwind any pending fused tail frames before returning. + text = re.sub(r'(? str: - text = strip_old_hooks(text) - if '#include "vcs_tier2_superblocks.hpp"' not in text: +def emit_cluster(cluster: Cluster, selected: Mapping[int, Set[int]], + sources: Mapping[int, UnitSource], host: pathlib.Path) -> Tuple[pathlib.Path, Dict[str, int]]: + owner = selected_pc_owner(selected) + selected_all = set(owner) + stats: Dict[str, int] = collections.Counter() + continuations: Dict[Tuple[int, int], int] = {} + chunks: List[str] = [] + + for unit in sorted(selected): + src = sources[unit] + for pc in src.ordered_pcs: + if pc not in selected[unit]: + continue + chunks.append(transform_block(src.blocks[pc], unit, selected, sources, stats, continuations)) + + # Entry hooks are intentionally narrower than the selected closure: only + # measured roots pay the extra branch into Tier-2. + entry_cases: List[str] = [] + for unit, pcs in cluster.hooks.items(): + for pc in pcs: + if pc not in selected.get(unit, set()): + raise RuntimeError(f'{cluster.key}: hook 0x{pc:08X} is outside selected closure') + entry_cases.append(f' case 0x{pc:08X}u: goto SB_L_{pc:08X};') + + # Unit-specific local dispatch tables. These handle guest JR $ra and any + # computed local jump that was previously routed through LOCAL_DISPATCH. + unit_dispatch: List[str] = [] + for unit in sorted(selected): + local_cases = '\n'.join( + f' case 0x{pc:08X}u: goto SB_L_{pc:08X};' + for pc in sorted(selected[unit])) + unit_dispatch.append(f'''TIER2_LOCAL_DISPATCH_U{unit:04d}: + 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 (!rt.tier2_complete_fused_transfers(ctx, tier2_nested_tail)) + tier2_same_context = false; + }} + --tier2_return_depth; + if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + tier2_same_context = false; + if (!tier2_same_context) TIER2_SB_RETURN(); + goto TIER2_FUSED_RETURN_DISPATCH; + }} + switch (local_pc) {{ +{local_cases} + default: + ctx.pc = local_pc; + TIER2_SB_RETURN(); + }} +''') + + global_resume_cases = '\n'.join( + f' case 0x{pc:08X}u: goto SB_L_{pc:08X};' for pc in sorted(selected_all)) + + cold_resume_by_unit: Dict[int, List[Tuple[int, int]]] = collections.defaultdict(list) + for (caller_unit, cont), entry in sorted(continuations.items()): + if cont in selected_all: + continue + if entry >= 0: + cold_resume_by_unit[caller_unit].append((cont, entry)) + cold_resume_sections: List[str] = [] + for unit, entries in sorted(cold_resume_by_unit.items()): + cases = '\n'.join( + f' case 0x{pc:08X}u: ++tier2_stats.cold_exits; tier2_scope.finish(); ' + f'psprecomp::recomp_unit_{unit:04d}_entry(rt, ctx, {entry}u, aot_mem); TIER2_SB_RETURN();' + for pc, entry in entries) + cold_resume_sections.append(f''' case {unit}u: + switch (tier2_resume_pc) {{ +{cases} + default: break; + }} + break;''') + + cpp = f'''// AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. +// Tier-2 SUPERBLOCK V2 cluster: {cluster.key} +#include "vcs_tier2_superblocks.hpp" +#include "psprecomp/runtime.hpp" +#include "generated_units.hpp" + +#include + +namespace vcs {{ +using namespace psprecomp; + +void {cluster.function}(psprecomp::Runtime &rt, + psprecomp::AllegrexContext &ctx, + psprecomp::GuestMemory::AotFastView &aot_mem, + std::uint32_t entry_pc) {{ + tier2_detail::SampleScope tier2_scope(Tier2ClusterId::{cluster.enum_name}); + auto &tier2_stats = tier2_scope.stats(); + 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; + +#define TIER2_SB_RETURN() do {{ \ + 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)rt.tier2_complete_fused_transfers(ctx, tier2_tail_count_); \ + --tier2_return_depth; \ + (void)rt.tier2_complete_fused_transfers(ctx, 1u); \ + }} \ + if (tier2_pending_transfers != 0u) {{ \ + (void)rt.tier2_complete_fused_transfers(ctx, tier2_pending_transfers); \ + tier2_pending_transfers = 0u; \ + }} \ + return; \ + }} while (false) + + goto TIER2_ENTRY_DISPATCH; + +TIER2_FUSED_RETURN_DISPATCH: + switch (tier2_resume_pc) {{ +{global_resume_cases} + default: break; + }} + switch (tier2_resume_unit) {{ +{chr(10).join(cold_resume_sections)} + default: break; + }} + ctx.pc = tier2_resume_pc; + TIER2_SB_RETURN(); + +{chr(10).join(unit_dispatch)} + +TIER2_ENTRY_DISPATCH: + switch (entry_pc) {{ +{chr(10).join(entry_cases)} + default: + ctx.pc = entry_pc; + ++tier2_stats.fallbacks; + TIER2_SB_RETURN(); + }} + +{chr(10).join(chunks)} + +#undef TIER2_SB_RETURN +}} + +}} // namespace vcs +''' + path = host / f'vcs_tier2_cluster_{cluster.key}.cpp' + old = path.read_text(encoding='utf-8') if path.exists() else None + if old != cpp: + path.write_text(cpp, encoding='utf-8', newline='\n') + stats['host_changed'] = 1 + else: + stats['host_changed'] = 0 + stats['blocks'] = sum(len(v) for v in selected.values()) + stats['lines'] = len(cpp.splitlines()) + stats['units'] = len(selected) + stats['hooks'] = sum(len(v) for v in cluster.hooks.values()) + return path, stats + + +def patch_hooks(raw: str, unit: int, hook_specs: Sequence[Tuple[Cluster, int]]) -> str: + text = strip_hooks(raw) + if HEADER_INCLUDE not in text: text = text.replace('#include "generated_units.hpp"\n', - '#include "generated_units.hpp"\n#include "vcs_tier2_superblocks.hpp"\n', 1) - for pc in HOOK_PCS[unit]: + '#include "generated_units.hpp"\n' + HEADER_INCLUDE, 1) + # Multiple clusters may hook the same unit but never the same PC in V2. + for cluster, pc in hook_specs: label = f'L_{pc:08X}:\n' if label not in text: - raise RuntimeError(f'missing hook label {pc:08X} in unit {unit:04d}') + raise RuntimeError(f'unit {unit:04d}: hook label 0x{pc:08X} missing') hook = ( label + HOOK_BEGIN + - ' if (vcs::tier2_superblocks_enabled()) {\n' - f' vcs::tier2_superblock_154_155(rt, ctx, aot_mem, 0x{pc:08X}u);\n' - ' return;\n' - ' }\n' + HOOK_END + f' if (vcs::tier2_cluster_enabled(vcs::Tier2ClusterId::{cluster.enum_name})) {{\n' + f' vcs::{cluster.function}(rt, ctx, aot_mem, 0x{pc:08X}u);\n' + f' return;\n' + f' }}\n' + HOOK_END ) text = text.replace(label, hook, 1) return text @@ -132,93 +556,57 @@ def main() -> int: ap.add_argument('profile', nargs='?', type=pathlib.Path, default=pathlib.Path(__file__).resolve().parents[1]) args = ap.parse_args() - profile = args.profile.resolve() + requested = args.profile + # Convenience: from the repository root, both `vcs` and `profiles/vcs` + # resolve to the VCS profile. The build BAT still passes an absolute path. + if requested == pathlib.Path('vcs'): + profile = pathlib.Path(__file__).resolve().parents[3] / 'profiles' / 'vcs' + else: + profile = requested.resolve() generated = profile / 'generated' host = profile / 'host' - raw154 = strip_old_hooks((generated/'generated_unit_0154.cpp').read_text(encoding='utf-8')) - raw155 = strip_old_hooks((generated/'generated_unit_0155.cpp').read_text(encoding='utf-8')) - r154 = region(raw154, U154_START, U154_END) - r155 = region(raw155, U155_START, U155_END) - e154 = direct_entry_map(raw154) - e155 = direct_entry_map(raw155) - t154, f154, c154, d154 = transform_region( - r154, 154, 155, U154_START, U154_END, U155_START, U155_END, e154) - t155, f155, c155, d155 = transform_region( - r155, 155, 154, U155_START, U155_END, U154_START, U154_END, e155) + all_units = sorted({u for c in CLUSTERS for u in (set(c.seeds) | set(c.windows) | set(c.hooks))}) + sources = {u: parse_unit(generated / f'generated_unit_{u:04d}.cpp', u) for u in all_units} - cpp = f'''// AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Profile-guided second-layer superblock: 0154/0155 dominant entity loop. -#include "vcs_tier2_superblocks.hpp" -#include "vcs_runtime_log.hpp" -#include "psprecomp/runtime.hpp" -#include "generated_units.hpp" + total = collections.Counter() + selected_by_cluster: Dict[str, Dict[int, Set[int]]] = {} + generated_paths: List[pathlib.Path] = [] + for cluster in CLUSTERS: + selected = selected_for_cluster(cluster, sources) + selected_by_cluster[cluster.key] = selected + path, stats = emit_cluster(cluster, selected, sources, host) + generated_paths.append(path) + print(f'Tier2 V2 cluster {cluster.key}: ' + ' '.join(f'{k}={v}' for k, v in sorted(stats.items()))) + total.update(stats) -#include -#include + hooks_by_unit: Dict[int, List[Tuple[Cluster, int]]] = collections.defaultdict(list) + for cluster in CLUSTERS: + for unit, pcs in cluster.hooks.items(): + for pc in pcs: + hooks_by_unit[unit].append((cluster, pc)) -namespace vcs {{ + hook_units_changed = 0 + for unit, specs in sorted(hooks_by_unit.items()): + path = generated / f'generated_unit_{unit:04d}.cpp' + patched = patch_hooks(sources[unit].raw, unit, specs) + if path.read_text(encoding='utf-8') != patched: + path.write_text(patched, encoding='utf-8', newline='\n') + hook_units_changed += 1 -// Generated AOT call targets are declared in namespace psprecomp. The copied -// region text intentionally stays byte-close to the original units, so make -// those names visible here instead of rewriting every external helper target. -using namespace psprecomp; + # Remove the V1 generated body so CMake can no longer accidentally compile + # both generations. The common runtime/toggle implementation keeps this name. + legacy = host / 'vcs_tier2_superblocks.cpp' + # common file is handwritten by V2 and must remain; generated cluster files + # carry all hot code. -bool tier2_superblocks_enabled() noexcept {{ - static const bool enabled = [] {{ - const char *value = std::getenv("PSPRECOMP_TIER2_SUPERBLOCKS"); - return value == nullptr || std::strcmp(value, "0") != 0; - }}(); - return enabled; -}} - -void tier2_superblock_154_155(psprecomp::Runtime &rt, - psprecomp::AllegrexContext &ctx, - psprecomp::GuestMemory::AotFastView &aot_mem, - std::uint32_t entry_pc) {{ - std::uint32_t tier2_pending_transfers = 0u; -#define TIER2_SB_RETURN() do {{ \\ - if (tier2_pending_transfers != 0u) {{ \\ - (void)rt.tier2_complete_fused_transfers(ctx, tier2_pending_transfers); \\ - tier2_pending_transfers = 0u; \\ - }} \\ - return; \\ - }} while (false) - - 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_SB_RETURN(); - }} - -{t154} -{t155} -#undef TIER2_SB_RETURN -}} - -}} // namespace vcs -''' - out = host/'vcs_tier2_superblocks.cpp' - changed_cpp = not out.exists() or out.read_text(encoding='utf-8') != cpp - if changed_cpp: - out.write_text(cpp, encoding='utf-8', newline='\n') - - changes = 0 - for unit, raw in ((154, raw154), (155, raw155)): - patched = patch_hooks(raw, unit) - p = generated/f'generated_unit_{unit:04d}.cpp' - if p.read_text(encoding='utf-8') != patched: - p.write_text(patched, encoding='utf-8', newline='\n') - changes += 1 - - print('Tier2 SUPERBLOCK V1:', - f'host_changed={int(changed_cpp)} hook_units_changed={changes}', - f'fused_tail_edges={f154+f155} cold_exit_labels={c154+c155}', - f'cold_dispatch_fallbacks={d154+d155} lines={len(cpp.splitlines())}') + print('Tier2 SUPERBLOCK V2 COMPLETE:', + f'clusters={len(CLUSTERS)} hook_units_changed={hook_units_changed}', + f'blocks={total["blocks"]} lines={total["lines"]}', + f'fused_calls={total["fused_calls"]} fused_tail={total["fused_tail"]}', + f'cold_exits={total["cold_exits"]}') return 0 + if __name__ == '__main__': raise SystemExit(main())