From b70c9b6bfbc4fa0d413ff817b0b4ee163b194f27 Mon Sep 17 00:00:00 2001 From: Jessica_Natalia Date: Sun, 16 Aug 2026 23:12:34 -0300 Subject: [PATCH] =?UTF-8?q?otimiza=C3=A7=C3=B5es=20round=207?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit otimizações round 7 --- profiles/vcs/CMakeLists.txt | 11 +- profiles/vcs/host/ge_gpu_backend.hpp | 7 + profiles/vcs/host/ge_gpu_backend_dx12.cpp | 375 ++- profiles/vcs/host/vcs_fast_paths.hpp | 42 + profiles/vcs/host/vcs_profile.cpp | 3 + profiles/vcs/host/vcs_runtime_log.cpp | 12 +- .../vcs/host/vcs_tier2_cluster_boundary.cpp | 962 +++--- .../vcs/host/vcs_tier2_cluster_edge43.cpp | 360 ++- .../vcs/host/vcs_tier2_cluster_entity.cpp | 672 ++-- .../vcs/host/vcs_tier2_cluster_geometry.cpp | 142 +- .../vcs/host/vcs_tier2_cluster_matrix.cpp | 102 +- .../vcs/host/vcs_tier2_cluster_physics.cpp | 62 +- profiles/vcs/host/vcs_tier2_cluster_world.cpp | 2764 +++++++++-------- profiles/vcs/scripts/build_release_ninja.bat | 17 +- profiles/vcs/tools/build_tier2_superblocks.py | 144 +- 15 files changed, 3137 insertions(+), 2538 deletions(-) diff --git a/profiles/vcs/CMakeLists.txt b/profiles/vcs/CMakeLists.txt index bfcd2b9..d6d6752 100644 --- a/profiles/vcs/CMakeLists.txt +++ b/profiles/vcs/CMakeLists.txt @@ -151,7 +151,7 @@ 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 V2 keeps each profile-guided cluster in its own translation unit. +# Tier-2 V4 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; @@ -170,11 +170,18 @@ if(MSVC) "${VCS_PROFILE_DIR}/host/vcs_tier2_superblocks.cpp" ${VCS_TIER2_CLUSTER_SOURCES} PROPERTIES COMPILE_OPTIONS "/O2;/Ob3;/bigobj;/GL-") + # Geometry is the largest V4 hot TU (~7k generated lines) and /Ob3 can + # make MSVC spend many minutes in pathological inlining/optimization. + # Keep full /O2 codegen and normal aggressive /Ob2 inlining here; this + # preserves GPR shadow/SIMD/dataflow while avoiding the compile-time cliff. + set_source_files_properties( + "${VCS_PROFILE_DIR}/host/vcs_tier2_cluster_geometry.cpp" + PROPERTIES COMPILE_OPTIONS "/O2;/Ob2;/bigobj;/GL-") elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") set_source_files_properties( "${VCS_PROFILE_DIR}/host/vcs_tier2_superblocks.cpp" ${VCS_TIER2_CLUSTER_SOURCES} - PROPERTIES COMPILE_OPTIONS "-O3;-g0") + PROPERTIES COMPILE_OPTIONS "-O2;-g0") endif() set(VCS_GPU_BACKEND_SOURCE host/ge_gpu_backend_dx12.cpp) diff --git a/profiles/vcs/host/ge_gpu_backend.hpp b/profiles/vcs/host/ge_gpu_backend.hpp index 0731aca..ab73559 100644 --- a/profiles/vcs/host/ge_gpu_backend.hpp +++ b/profiles/vcs/host/ge_gpu_backend.hpp @@ -374,6 +374,13 @@ struct GeGpuBackendReport { std::uint64_t dx12_batch_appends{}; std::uint64_t dx12_batch_merges{}; std::uint64_t dx12_gpu_draw_calls{}; + // Tier-2 V4 DX12: adjacent state-compatible draws can be submitted through + // ExecuteIndirect. The GPU still executes every PSP draw, but CPU command + // recording collapses transform/pixel constant updates + Draw* calls into + // one API command for the whole run. + std::uint64_t dx12_indirect_executes{}; + std::uint64_t dx12_indirect_draws{}; + std::uint64_t dx12_indirect_saved_api_draws{}; std::uint64_t dx12_srv_high_water{}; std::uint64_t dx12_gpu_feedback_draws{}; std::uint64_t dx12_self_feedback_snapshots{}; diff --git a/profiles/vcs/host/ge_gpu_backend_dx12.cpp b/profiles/vcs/host/ge_gpu_backend_dx12.cpp index 11d81a0..4d3c901 100644 --- a/profiles/vcs/host/ge_gpu_backend_dx12.cpp +++ b/profiles/vcs/host/ge_gpu_backend_dx12.cpp @@ -44,6 +44,10 @@ using Microsoft::WRL::ComPtr; constexpr std::uint32_t kReferenceWidth = 480u; constexpr std::uint32_t kReferenceHeight = 272u; constexpr std::size_t kGeometryUploadCapacity = 64u * 1024u * 1024u; +// V4 ExecuteIndirect arguments live in their own persistently mapped upload +// arena. Keeping them separate means a draw-heavy frame can never steal bytes +// from the established 64 MiB geometry budget. 4 MiB holds >20k commands. +constexpr std::size_t kIndirectUploadCapacity = 4u * 1024u * 1024u; // Stage 45.2: persistent per-frame texture upload arena. The 44.7 path created, // mapped and destroyed one committed upload resource for every decoded texture. // Streaming bursts therefore paid kernel/D3D12 allocation overhead on the hot GE @@ -122,6 +126,23 @@ struct Dx12PixelConstants { }; static_assert(sizeof(Dx12PixelConstants) == 5u * sizeof(std::uint32_t)); +// Tier-2 V4 / 150-FPS path. ExecuteIndirect moves the two per-draw root +// constant writes and Draw* call out of the CPU command-recording loop. Runs +// still preserve guest order; only adjacent draws with identical fixed GPU +// state participate. +struct Dx12IndirectDrawCommand { + std::uint32_t transform[40]{}; + std::uint32_t pixel[5]{}; + D3D12_DRAW_ARGUMENTS draw{}; +}; +struct Dx12IndirectDrawIndexedCommand { + std::uint32_t transform[40]{}; + std::uint32_t pixel[5]{}; + D3D12_DRAW_INDEXED_ARGUMENTS draw{}; +}; +static_assert(sizeof(Dx12IndirectDrawCommand) == 196u); +static_assert(sizeof(Dx12IndirectDrawIndexedCommand) == 200u); + struct CloudCameraCandidate { std::array view{}; std::array projection{}; @@ -162,6 +183,8 @@ struct Dx12FrameResources { ComPtr allocator; ComPtr upload_buffer; std::byte *mapped_upload{}; + ComPtr indirect_upload_buffer; + std::byte *mapped_indirect_upload{}; ComPtr texture_upload_buffer; std::byte *mapped_texture_upload{}; std::size_t texture_upload_cursor{}; @@ -274,6 +297,8 @@ struct Dx12GeState { UINT64 next_fence{1u}; ComPtr root_signature; ComPtr cloud_root_signature; + ComPtr indirect_draw_signature; + ComPtr indirect_draw_indexed_signature; ComPtr vertex_shader; ComPtr packed_0115_vertex_shader; ComPtr pixel_shader; @@ -388,6 +413,10 @@ std::uint64_t texture_key(const GeGpuDrawDescriptor &draw) noexcept { return key; } +// Forward declaration used by batch/indirect compatibility checks. The sampler +// implementation lives next to sampler creation below. +std::uint64_t sampler_key(const GeGpuDrawDescriptor &draw) noexcept; + D3D12_CPU_DESCRIPTOR_HANDLE rtv_cpu(Dx12GeState &s, UINT index) noexcept { D3D12_CPU_DESCRIPTOR_HANDLE h = s.rtv_heap->GetCPUDescriptorHandleForHeapStart(); h.ptr += static_cast(index) * s.rtv_stride; @@ -1043,7 +1072,9 @@ bool adjacent_batch_merge_compatible(const Dx12Batch &a, const Dx12Batch &b) noe (b.hardware_transform && b.transform.primitive != 3u)) return false; if (pipeline_key(a.draw) != pipeline_key(b.draw)) return false; if (a.draw.texture_enabled != b.draw.texture_enabled) return false; - if (a.draw.texture_enabled && texture_key(a.draw) != texture_key(b.draw)) return false; + if (a.draw.texture_enabled && + (texture_key(a.draw) != texture_key(b.draw) || sampler_key(a.draw) != sampler_key(b.draw))) + return false; if (a.draw.scissor_x0 != b.draw.scissor_x0 || a.draw.scissor_y0 != b.draw.scissor_y0 || a.draw.scissor_x1 != b.draw.scissor_x1 || a.draw.scissor_y1 != b.draw.scissor_y1) return false; @@ -1060,6 +1091,107 @@ bool adjacent_batch_merge_compatible(const Dx12Batch &a, const Dx12Batch &b) noe return !a.hardware_transform || hardware_transform_equal(a.transform, b.transform); } +bool dx12_execute_indirect_enabled() noexcept { + static const bool enabled = [] { + const char *text = std::getenv("PSPRECOMP_DX12_EXECUTE_INDIRECT"); + return text == nullptr || (*text != '\0' && std::strcmp(text, "0") != 0 && + std::strcmp(text, "false") != 0 && std::strcmp(text, "FALSE") != 0 && + std::strcmp(text, "off") != 0 && std::strcmp(text, "OFF") != 0); + }(); + return enabled; +} + +D3D12_PRIMITIVE_TOPOLOGY batch_topology(const Dx12Batch &batch) noexcept { + return batch.hardware_transform && batch.transform.primitive == 4u + ? D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP + : D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; +} + +std::uint64_t batch_full_pipeline_key(const Dx12Batch &batch) noexcept { + const bool cull = batch.hardware_transform && batch.transform.cull_enabled; + const bool accept_ccw = cull && batch.transform.accept_counter_clockwise; + return pipeline_key(batch.draw) | + (batch.packed_0115 ? (std::uint64_t{1} << 63u) : 0u) | + (cull ? (std::uint64_t{1} << 62u) : 0u) | + (accept_ccw ? (std::uint64_t{1} << 61u) : 0u); +} + +bool indirect_run_compatible(const Dx12Batch &a, const Dx12Batch &b) noexcept { + if (a.framebuffer_feedback || b.framebuffer_feedback) return false; + if (a.draw.clear_mode || b.draw.clear_mode) return false; + if (a.indexed != b.indexed || a.packed_0115 != b.packed_0115) return false; + if ((a.draw.framebuffer_address & 0x001FFFF0u) != + (b.draw.framebuffer_address & 0x001FFFF0u)) return false; + if (batch_topology(a) != batch_topology(b)) return false; + if (batch_full_pipeline_key(a) != batch_full_pipeline_key(b)) return false; + if (a.draw.texture_enabled != b.draw.texture_enabled) return false; + if (a.draw.texture_enabled && + (texture_key(a.draw) != texture_key(b.draw) || sampler_key(a.draw) != sampler_key(b.draw))) + return false; + if (a.draw.scissor_x0 != b.draw.scissor_x0 || a.draw.scissor_y0 != b.draw.scissor_y0 || + a.draw.scissor_x1 != b.draw.scissor_x1 || a.draw.scissor_y1 != b.draw.scissor_y1) + return false; + const Dx12BlendPlan ba = dx12_blend_plan(a.draw); + const Dx12BlendPlan bb = dx12_blend_plan(b.draw); + if (ba.uses_constant != bb.uses_constant) return false; + if (ba.uses_constant && ba.constant_rgb != bb.constant_rgb) return false; + return true; +} + +void account_executed_batch(Dx12GeState &s, const Dx12Batch &batch, + std::uint32_t srv_index, const Dx12BlendPlan &blend_plan) { + if (batch.draw.depth_test_enabled) s.report.depth_tested_game_draw_calls += batch.logical_draw_count; + if (batch.draw.depth_write_enabled) s.report.depth_writing_game_draw_calls += batch.logical_draw_count; + if (batch.draw.alpha_test_enabled) s.report.alpha_tested_game_draw_calls += batch.logical_draw_count; + switch (blend_variant(batch.draw)) { + case 1u: s.report.standard_alpha_blended_game_draw_calls += batch.logical_draw_count; break; + case 2u: s.report.fixed_replace_blended_game_draw_calls += batch.logical_draw_count; break; + case 3u: s.report.additive_blended_game_draw_calls += batch.logical_draw_count; break; + default: break; + } + if (batch.draw.blend_enabled && !batch.draw.clear_mode && !blend_plan.exact) { + s.report.unsupported_blend_game_draw_calls += batch.logical_draw_count; + static std::uint32_t diagnostic_count = 0u; + if (std::getenv("PSPRECOMP_DX12_BLEND_DIAG") != nullptr && diagnostic_count < 32u) { + std::ostringstream line; + line << "DX12 unsupported PSP blend fallback #" << (diagnostic_count + 1u) + << ": eq=" << (batch.draw.blend_equation & 7u) + << " src=" << (batch.draw.blend_source_factor & 0xFu) + << " dst=" << (batch.draw.blend_dest_factor & 0xFu) + << " fixS=0x" << std::hex << (batch.draw.blend_fix_source & 0x00FFFFFFu) + << " fixD=0x" << (batch.draw.blend_fix_dest & 0x00FFFFFFu) << std::dec; + const std::string message = line.str(); + std::cerr << "[blend] " << message << "\n"; + runtime_log_error("blend", message); + ++diagnostic_count; + } + } + if (batch.draw.fog_enabled) s.report.fogged_game_draw_calls += batch.logical_draw_count; + if (srv_index != 0u) { + const std::uint32_t submitted_vertices = batch.indexed ? batch.index_count : batch.vertex_count; + s.report.textured_game_triangles += + batch.hardware_transform && batch.transform.primitive == 4u + ? (submitted_vertices > 2u ? submitted_vertices - 2u : 0u) + : submitted_vertices / 3u; + s.report.textured_game_vertices += submitted_vertices; + switch (batch.draw.texture_function & 7u) { + case 0u: s.report.modulate_texture_game_draw_calls += batch.logical_draw_count; break; + case 1u: s.report.decal_texture_game_draw_calls += batch.logical_draw_count; break; + case 2u: s.report.blend_texture_game_draw_calls += batch.logical_draw_count; break; + case 3u: s.report.replace_texture_game_draw_calls += batch.logical_draw_count; break; + case 4u: s.report.add_texture_game_draw_calls += batch.logical_draw_count; break; + default: ++s.report.unsupported_texture_function_game_draw_calls; break; + } + if (batch.draw.texture_double_color) + s.report.double_color_texture_game_draw_calls += batch.logical_draw_count; + if (batch.draw.texture_mipmap_enabled) { + s.report.mipmapped_game_draw_calls += batch.logical_draw_count; + if (batch.draw.texture_mipmap_linear) + s.report.mip_linear_game_draw_calls += batch.logical_draw_count; + } + } +} + bool append_or_merge_batch(Dx12GeState &s, Dx12Batch batch) { static const bool merge_enabled = [] { const char *text = std::getenv("PSPRECOMP_DX12_BATCH_MERGE"); @@ -1456,6 +1588,42 @@ bool create_root_signature(Dx12GeState &s, std::string &error) noexcept { return true; } +bool create_indirect_signatures(Dx12GeState &s, std::string &error) noexcept { + std::array args{}; + args[0].Type = D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT; + args[0].Constant.RootParameterIndex = 2u; + args[0].Constant.DestOffsetIn32BitValues = 0u; + args[0].Constant.Num32BitValuesToSet = 40u; + args[1].Type = D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT; + args[1].Constant.RootParameterIndex = 3u; + args[1].Constant.DestOffsetIn32BitValues = 0u; + args[1].Constant.Num32BitValuesToSet = 5u; + + D3D12_COMMAND_SIGNATURE_DESC desc{}; + desc.NumArgumentDescs = static_cast(args.size()); + desc.pArgumentDescs = args.data(); + + args[2].Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW; + desc.ByteStride = sizeof(Dx12IndirectDrawCommand); + HRESULT hr = s.device->CreateCommandSignature(&desc, s.root_signature.Get(), + IID_PPV_ARGS(&s.indirect_draw_signature)); + if (FAILED(hr)) { + error = hr_text(hr, "CreateCommandSignature(DX12 GE draw)"); + return false; + } + + args[2].Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED; + desc.ByteStride = sizeof(Dx12IndirectDrawIndexedCommand); + hr = s.device->CreateCommandSignature(&desc, s.root_signature.Get(), + IID_PPV_ARGS(&s.indirect_draw_indexed_signature)); + if (FAILED(hr)) { + error = hr_text(hr, "CreateCommandSignature(DX12 GE draw indexed)"); + s.indirect_draw_signature.Reset(); + return false; + } + return true; +} + bool create_targets(Dx12GeState &s, std::string &error) noexcept { D3D12_DESCRIPTOR_HEAP_DESC rtv_desc{}; rtv_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; @@ -2283,7 +2451,8 @@ const CloudCameraCandidate *select_cloud_camera(const Dx12GeState &s) noexcept { bool changed = true; while (changed && ancestors.size() < kFramebufferTargetCapacity) { changed = false; - for (const Dx12Batch &batch : s.batches) { + for (std::size_t batch_cursor = 0u; batch_cursor < s.batches.size(); ++batch_cursor) { + const Dx12Batch &batch = s.batches[batch_cursor]; if (!batch.framebuffer_feedback) continue; const std::uint32_t source = batch.feedback_address & 0x001FFFF0u; const std::uint32_t destination = batch.draw.framebuffer_address & 0x001FFFF0u; @@ -3080,6 +3249,25 @@ bool create_backend(Dx12GeState &s, std::string &error) noexcept { if (FAILED(hr) || mapped == nullptr) { error = hr_text(hr, "Map(DX12 GE geometry upload)"); return false; } frame.mapped_upload = static_cast(mapped); + // Optional V4 arena. Failure here must never make the renderer fail to + // boot on an older/low-memory driver; that frame simply uses scalar + // Draw*/root-constant recording. + D3D12_RESOURCE_DESC indirect_upload = upload; + indirect_upload.Width = kIndirectUploadCapacity; + hr = s.device->CreateCommittedResource(&upload_heap, D3D12_HEAP_FLAG_NONE, &indirect_upload, + D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, + IID_PPV_ARGS(&frame.indirect_upload_buffer)); + if (SUCCEEDED(hr) && frame.indirect_upload_buffer) { + mapped = nullptr; + hr = frame.indirect_upload_buffer->Map(0u, &no_read, &mapped); + if (SUCCEEDED(hr) && mapped != nullptr) { + frame.mapped_indirect_upload = static_cast(mapped); + } else { + frame.indirect_upload_buffer.Reset(); + frame.mapped_indirect_upload = nullptr; + } + } + if (s.texture_upload_ring_enabled) { D3D12_RESOURCE_DESC texture_upload = upload; texture_upload.Width = kTextureUploadCapacity; @@ -3113,6 +3301,16 @@ bool create_backend(Dx12GeState &s, std::string &error) noexcept { if (s.fence_event == nullptr) { error = "CreateEventW failed for DX12 GE fence"; return false; } if (!compile_shaders(s, error)) return false; if (!create_root_signature(s, error)) return false; + { + std::string indirect_error; + if (!create_indirect_signatures(s, indirect_error)) { + // Scalar recording is the fully supported fallback. Command + // signatures are an optimization, never a backend requirement. + s.indirect_draw_signature.Reset(); + s.indirect_draw_indexed_signature.Reset(); + if (!indirect_error.empty()) runtime_log_error("dx12 execute indirect disabled", indirect_error); + } + } if (!create_cloud_root_signature(s, error)) return false; if (!create_targets(s, error)) return false; if (!create_present_pipeline(s, error)) return false; @@ -3144,11 +3342,15 @@ void destroy_backend(Dx12GeState &s) noexcept { for (Dx12FrameResources &frame : s.frames) { if (frame.upload_buffer && frame.mapped_upload != nullptr) frame.upload_buffer->Unmap(0u, nullptr); + if (frame.indirect_upload_buffer && frame.mapped_indirect_upload != nullptr) + frame.indirect_upload_buffer->Unmap(0u, nullptr); if (frame.texture_upload_buffer && frame.mapped_texture_upload != nullptr) frame.texture_upload_buffer->Unmap(0u, nullptr); frame.mapped_upload = nullptr; + frame.mapped_indirect_upload = nullptr; frame.mapped_texture_upload = nullptr; frame.transient_resources.clear(); + frame.indirect_upload_buffer.Reset(); frame.texture_upload_buffer.Reset(); frame.upload_buffer.Reset(); frame.texture_upload_cursor = 0u; @@ -3186,6 +3388,8 @@ void destroy_backend(Dx12GeState &s) noexcept { s.pixel_shader.Reset(); s.packed_0115_vertex_shader.Reset(); s.vertex_shader.Reset(); + s.indirect_draw_signature.Reset(); + s.indirect_draw_indexed_signature.Reset(); s.root_signature.Reset(); s.cloud_root_signature.Reset(); s.readback_buffer.Reset(); @@ -3904,6 +4108,9 @@ bool ge_gpu_backend_finish_color_frame(std::uint64_t vblank) noexcept { Dx12FramebufferTarget *display_target = find_framebuffer_target(s, s.display_framebuffer); Dx12FrameResources &frame = s.frames[s.frame_cursor]; + const bool indirect_enabled = dx12_execute_indirect_enabled() && + s.indirect_draw_signature && s.indirect_draw_indexed_signature && + frame.indirect_upload_buffer && frame.mapped_indirect_upload != nullptr; std::string error; if (!wait_for_fence(s, frame.fence_value, error)) { runtime_log_error("dx12 ge frame wait", error); @@ -3974,6 +4181,7 @@ bool ge_gpu_backend_finish_color_frame(std::uint64_t vblank) noexcept { Dx12FramebufferTarget *current_target = nullptr; std::uint32_t current_address = 0xFFFFFFFFu; std::uint32_t executed_batches = 0u; + std::size_t indirect_cursor = 0u; std::uint32_t bound_srv = std::numeric_limits::max(); std::uint32_t bound_sampler = std::numeric_limits::max(); Dx12TransformConstants active_transform{}; @@ -4006,7 +4214,8 @@ bool ge_gpu_backend_finish_color_frame(std::uint64_t vblank) noexcept { } constexpr float black[4]{0.0f, 0.0f, 0.0f, 1.0f}; - for (const Dx12Batch &batch : s.batches) { + for (std::size_t batch_cursor = 0u; batch_cursor < s.batches.size(); ++batch_cursor) { + const Dx12Batch &batch = s.batches[batch_cursor]; const std::uint32_t address = batch.draw.framebuffer_address & 0x001FFFF0u; const bool cloud_target_batch = address == cloud_target_address; if (trace_cloud_frame && (cloud_target_batch || address == s.display_framebuffer)) { @@ -4192,26 +4401,45 @@ bool ge_gpu_backend_finish_color_frame(std::uint64_t vblank) noexcept { bound_sampler = sampler_index; } + // Discover an indirect run before writing root constants. If the run + // fits the dedicated arena, ExecuteIndirect owns those constants too, + // avoiding even the first scalar SetGraphicsRoot32BitConstants pair. + std::size_t indirect_end = batch_cursor + 1u; + if (indirect_enabled && !trace_cloud_frame && !batch.framebuffer_feedback && + !batch.draw.clear_mode) { + while (indirect_end < s.batches.size() && + indirect_run_compatible(batch, s.batches[indirect_end])) { + ++indirect_end; + } + } + const std::size_t indirect_count = indirect_end - batch_cursor; + const std::size_t indirect_stride = batch.indexed + ? sizeof(Dx12IndirectDrawIndexedCommand) + : sizeof(Dx12IndirectDrawCommand); + const std::size_t indirect_command_bytes = indirect_stride * indirect_count; + const bool execute_indirect_run = indirect_count >= 3u && + indirect_cursor + indirect_command_bytes <= kIndirectUploadCapacity; + const std::uint32_t logical_width = current_target != nullptr && current_target->logical_width != 0u ? current_target->logical_width : kReferenceWidth; const std::uint32_t logical_height = current_target != nullptr && current_target->logical_height != 0u ? current_target->logical_height : kReferenceHeight; - const Dx12TransformConstants draw_transform = - make_transform_constants(batch, logical_width, logical_height); - if (!active_transform_valid || - std::memcmp(&draw_transform, &active_transform, sizeof(draw_transform)) != 0) { - s.list->SetGraphicsRoot32BitConstants( - 2u, 40u, &draw_transform, 0u); - active_transform = draw_transform; - active_transform_valid = true; - } - - const Dx12PixelConstants pixel_state = make_pixel_constants(batch.draw, srv_index != 0u); - if (!active_pixel_valid || - std::memcmp(&pixel_state, &active_pixel, sizeof(pixel_state)) != 0) { - s.list->SetGraphicsRoot32BitConstants(3u, 5u, &pixel_state, 0u); - active_pixel = pixel_state; - active_pixel_valid = true; + if (!execute_indirect_run) { + const Dx12TransformConstants draw_transform = + make_transform_constants(batch, logical_width, logical_height); + const Dx12PixelConstants pixel_state = make_pixel_constants(batch.draw, srv_index != 0u); + if (!active_transform_valid || + std::memcmp(&draw_transform, &active_transform, sizeof(draw_transform)) != 0) { + s.list->SetGraphicsRoot32BitConstants(2u, 40u, &draw_transform, 0u); + active_transform = draw_transform; + active_transform_valid = true; + } + if (!active_pixel_valid || + std::memcmp(&pixel_state, &active_pixel, sizeof(pixel_state)) != 0) { + s.list->SetGraphicsRoot32BitConstants(3u, 5u, &pixel_state, 0u); + active_pixel = pixel_state; + active_pixel_valid = true; + } } // The PSP scissor is expressed in 480x272 logical pixels and has to be @@ -4266,63 +4494,70 @@ bool ge_gpu_backend_finish_color_frame(std::uint64_t vblank) noexcept { active_blend_fix = fix; } } + // V4 high-margin path: collapse adjacent draws that differ only in + // per-draw root constants into one ExecuteIndirect call. No draw is + // reordered and framebuffer-feedback/clear boundaries never participate. + if (execute_indirect_run) { + const std::size_t stride = indirect_stride; + const std::size_t command_bytes = indirect_command_bytes; + std::byte *command_dst = frame.mapped_indirect_upload + indirect_cursor; + for (std::size_t j = batch_cursor; j < indirect_end; ++j) { + const Dx12Batch &ibatch = s.batches[j]; + const Dx12TransformConstants itransform = + make_transform_constants(ibatch, logical_width, logical_height); + const Dx12PixelConstants ipixel = + make_pixel_constants(ibatch.draw, srv_index != 0u); + if (batch.indexed) { + Dx12IndirectDrawIndexedCommand command{}; + std::memcpy(command.transform, &itransform, sizeof(itransform)); + std::memcpy(command.pixel, &ipixel, sizeof(ipixel)); + command.draw.IndexCountPerInstance = ibatch.index_count; + command.draw.InstanceCount = 1u; + command.draw.StartIndexLocation = ibatch.first_index; + command.draw.BaseVertexLocation = static_cast(ibatch.first_vertex); + command.draw.StartInstanceLocation = 0u; + std::memcpy(command_dst, &command, sizeof(command)); + } else { + Dx12IndirectDrawCommand command{}; + std::memcpy(command.transform, &itransform, sizeof(itransform)); + std::memcpy(command.pixel, &ipixel, sizeof(ipixel)); + command.draw.VertexCountPerInstance = ibatch.vertex_count; + command.draw.InstanceCount = 1u; + command.draw.StartVertexLocation = ibatch.first_vertex; + command.draw.StartInstanceLocation = 0u; + std::memcpy(command_dst, &command, sizeof(command)); + } + command_dst += stride; + } + ID3D12CommandSignature *signature = batch.indexed + ? s.indirect_draw_indexed_signature.Get() + : s.indirect_draw_signature.Get(); + s.list->ExecuteIndirect(signature, static_cast(indirect_count), + frame.indirect_upload_buffer.Get(), indirect_cursor, + nullptr, 0u); + indirect_cursor += command_bytes; + executed_batches += static_cast(indirect_count); + ++s.report.dx12_indirect_executes; + s.report.dx12_indirect_draws += indirect_count; + s.report.dx12_indirect_saved_api_draws += indirect_count - 1u; + for (std::size_t j = batch_cursor; j < indirect_end; ++j) + account_executed_batch(s, s.batches[j], srv_index, blend_plan); + batch_cursor = indirect_end - 1u; + cloud_batch_index += indirect_count - 1u; + // ExecuteIndirect leaves root constants equal to the last command; + // force the scalar cache to repopulate before the next ordinary draw. + active_transform_valid = false; + active_pixel_valid = false; + continue; + } + if (batch.indexed) s.list->DrawIndexedInstanced(batch.index_count, 1u, batch.first_index, static_cast(batch.first_vertex), 0u); else s.list->DrawInstanced(batch.vertex_count, 1u, batch.first_vertex, 0u); ++executed_batches; - - if (batch.draw.depth_test_enabled) s.report.depth_tested_game_draw_calls += batch.logical_draw_count; - if (batch.draw.depth_write_enabled) s.report.depth_writing_game_draw_calls += batch.logical_draw_count; - if (batch.draw.alpha_test_enabled) s.report.alpha_tested_game_draw_calls += batch.logical_draw_count; - switch (blend_variant(batch.draw)) { - case 1u: s.report.standard_alpha_blended_game_draw_calls += batch.logical_draw_count; break; - case 2u: s.report.fixed_replace_blended_game_draw_calls += batch.logical_draw_count; break; - case 3u: s.report.additive_blended_game_draw_calls += batch.logical_draw_count; break; - default: break; - } - if (batch.draw.blend_enabled && !batch.draw.clear_mode && !blend_plan.exact) { - s.report.unsupported_blend_game_draw_calls += batch.logical_draw_count; - static std::uint32_t diagnostic_count = 0u; - if (std::getenv("PSPRECOMP_DX12_BLEND_DIAG") != nullptr && diagnostic_count < 32u) { - std::ostringstream line; - line << "DX12 unsupported PSP blend fallback #" << (diagnostic_count + 1u) - << ": eq=" << (batch.draw.blend_equation & 7u) - << " src=" << (batch.draw.blend_source_factor & 0xFu) - << " dst=" << (batch.draw.blend_dest_factor & 0xFu) - << " fixS=0x" << std::hex << (batch.draw.blend_fix_source & 0x00FFFFFFu) - << " fixD=0x" << (batch.draw.blend_fix_dest & 0x00FFFFFFu) << std::dec; - const std::string message = line.str(); - std::cerr << "[blend] " << message << "\n"; - runtime_log_error("blend", message); - ++diagnostic_count; - } - } - if (batch.draw.fog_enabled) s.report.fogged_game_draw_calls += batch.logical_draw_count; - if (srv_index != 0u) { - const std::uint32_t submitted_vertices = batch.indexed ? batch.index_count : batch.vertex_count; - s.report.textured_game_triangles += - batch.hardware_transform && batch.transform.primitive == 4u - ? (submitted_vertices > 2u ? submitted_vertices - 2u : 0u) - : submitted_vertices / 3u; - s.report.textured_game_vertices += submitted_vertices; - switch (batch.draw.texture_function & 7u) { - case 0u: s.report.modulate_texture_game_draw_calls += batch.logical_draw_count; break; - case 1u: s.report.decal_texture_game_draw_calls += batch.logical_draw_count; break; - case 2u: s.report.blend_texture_game_draw_calls += batch.logical_draw_count; break; - case 3u: s.report.replace_texture_game_draw_calls += batch.logical_draw_count; break; - case 4u: s.report.add_texture_game_draw_calls += batch.logical_draw_count; break; - default: ++s.report.unsupported_texture_function_game_draw_calls; break; - } - if (batch.draw.texture_double_color) - s.report.double_color_texture_game_draw_calls += batch.logical_draw_count; - if (batch.draw.texture_mipmap_enabled) { - s.report.mipmapped_game_draw_calls += batch.logical_draw_count; - if (batch.draw.texture_mipmap_linear) - s.report.mip_linear_game_draw_calls += batch.logical_draw_count; - } - } + account_executed_batch(s, batch, srv_index, blend_plan); } if (trace_cloud_frame) { runtime_log_line(std::string("CLOUD_TRACE_END injected=") + diff --git a/profiles/vcs/host/vcs_fast_paths.hpp b/profiles/vcs/host/vcs_fast_paths.hpp index a078f15..8f71c23 100644 --- a/profiles/vcs/host/vcs_fast_paths.hpp +++ b/profiles/vcs/host/vcs_fast_paths.hpp @@ -109,3 +109,45 @@ finish: } } // namespace psprecomp + +#if defined(__SSE2__) || defined(_M_X64) || defined(_M_IX86_FP) +#include +#endif + +namespace psprecomp { + +// Tier-2 V4: ordered SIMD primitives. Multiplication is vectorized while the +// four products are reduced in the original left-to-right order. This avoids +// FMA/reassociation surprises while removing most scalar multiply issue cost in +// VCS's matrix-heavy geometry hot path. +inline float vcs_tier2_dot4_ordered(const float *a, const float *b) noexcept { +#if defined(__SSE2__) || defined(_M_X64) || (defined(_M_IX86_FP) && _M_IX86_FP >= 2) + const __m128 va = _mm_loadu_ps(a); + const __m128 vb = _mm_loadu_ps(b); + const __m128 vm = _mm_mul_ps(va, vb); + alignas(16) float p[4]; + _mm_store_ps(p, vm); + return ((p[0] + p[1]) + p[2]) + p[3]; +#else + return ((a[0] * b[0] + a[1] * b[1]) + a[2] * b[2]) + a[3] * b[3]; +#endif +} + +inline void vcs_tier2_mat4_mul_ordered(const float *s, const float *t, float *d) noexcept { + for (std::uint32_t a = 0; a < 4u; ++a) { + const float *tr = t + a * 4u; + d[a * 4u + 0u] = vcs_tier2_dot4_ordered(s + 0u, tr); + d[a * 4u + 1u] = vcs_tier2_dot4_ordered(s + 4u, tr); + d[a * 4u + 2u] = vcs_tier2_dot4_ordered(s + 8u, tr); + d[a * 4u + 3u] = vcs_tier2_dot4_ordered(s + 12u, tr); + } +} + +inline void vcs_tier2_mat4_vec_first3_ordered(const float *m, const float *v, + float *out) noexcept { + out[0] = vcs_tier2_dot4_ordered(m + 0u, v); + out[1] = vcs_tier2_dot4_ordered(m + 4u, v); + out[2] = vcs_tier2_dot4_ordered(m + 8u, v); +} + +} // namespace psprecomp diff --git a/profiles/vcs/host/vcs_profile.cpp b/profiles/vcs/host/vcs_profile.cpp index 320a3dd..362ea1f 100644 --- a/profiles/vcs/host/vcs_profile.cpp +++ b/profiles/vcs/host/vcs_profile.cpp @@ -7600,6 +7600,9 @@ void install_profile(psprecomp::Runtime &runtime, std::uint32_t user_arena_start << " gpu_draws=" << d(r.dx12_gpu_draw_calls, o.dx12_gpu_draw_calls) << " batch_appends=" << d(r.dx12_batch_appends, o.dx12_batch_appends) << " batch_merges=" << d(r.dx12_batch_merges, o.dx12_batch_merges) + << " indirect_exec=" << d(r.dx12_indirect_executes, o.dx12_indirect_executes) + << " indirect_draws=" << d(r.dx12_indirect_draws, o.dx12_indirect_draws) + << " indirect_saved=" << d(r.dx12_indirect_saved_api_draws, o.dx12_indirect_saved_api_draws) << " tex_req=" << d(r.texture_decode_requests, o.texture_decode_requests) << " tex_hits=" << d(r.texture_cache_hits, o.texture_cache_hits) << " tex_uploads=" << d(r.decoded_texture_uploads, o.decoded_texture_uploads) diff --git a/profiles/vcs/host/vcs_runtime_log.cpp b/profiles/vcs/host/vcs_runtime_log.cpp index 156a9cb..d77bb3d 100644 --- a/profiles/vcs/host/vcs_runtime_log.cpp +++ b/profiles/vcs/host/vcs_runtime_log.cpp @@ -3,6 +3,8 @@ #include "vcs_tier2_superblocks.hpp" #include +#include +#include #include #include #include @@ -63,7 +65,7 @@ void runtime_log_initialize(const VcsConfiguration &configuration) { return; } s.file << "VCSNative runtime log\n"; - s.file << "stage=tier2-superblock-v3-dataflow-2026-08-16\n"; + s.file << "stage=tier2-v4-150fps-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) @@ -72,8 +74,12 @@ void runtime_log_initialize(const VcsConfiguration &configuration) { s.file << "guest_hotspot=" << (configuration.diagnostics.guest_hotspot_profile ? 1 : 0) << " sample_stride=256 interval_vblanks=300\n"; s.file << "tier2_superblocks=" << (tier2_superblocks_enabled() ? 1 : 0) - << " version=3 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 dataflow=1 vfpu_block32=133 mem_runs=35 mem_words=287 append32=51 advance32=89\n\n"; + << " version=4 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 dataflow=1 vfpu_block32=133 mem_runs=35 mem_words=287" + << " append32=51 advance32=89 simd_mat4=4 simd_matvec=19" + << " gpr_shadow_clusters=4 gpr_shadow_regs=24 gpr_shadow_occurrences=3428 geometry_shadow=0" + << " dx12_execute_indirect_default=1 indirect_buffer_mb=4\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 index 0542603..9bfd4cf 100644 --- a/profiles/vcs/host/vcs_tier2_cluster_boundary.cpp +++ b/profiles/vcs/host/vcs_tier2_cluster_boundary.cpp @@ -1,8 +1,9 @@ // AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: boundary +// Tier-2 SUPERBLOCK V4 150FPS cluster: boundary #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_fast_paths.hpp" #include @@ -27,8 +28,25 @@ void tier2_superblock_boundary(psprecomp::Runtime &rt, std::uint32_t local_pc = 0u; std::uint32_t local_transfers = 0u; std::uint32_t entry_id = 0u; + std::uint32_t tier2_gpr_4 = ctx.gpr[4]; + std::uint32_t tier2_gpr_5 = ctx.gpr[5]; + std::uint32_t tier2_gpr_6 = ctx.gpr[6]; + std::uint32_t tier2_gpr_17 = ctx.gpr[17]; + std::uint32_t tier2_gpr_7 = ctx.gpr[7]; + std::uint32_t tier2_gpr_29 = ctx.gpr[29]; + bool tier2_gpr_shadow_valid = true; +#define TIER2_GPR_SYNC_OUT() do { if (tier2_gpr_shadow_valid) { ctx.gpr[4] = tier2_gpr_4; ctx.gpr[5] = tier2_gpr_5; ctx.gpr[6] = tier2_gpr_6; ctx.gpr[17] = tier2_gpr_17; ctx.gpr[7] = tier2_gpr_7; ctx.gpr[29] = tier2_gpr_29; } } while (false) +#define TIER2_GPR_SYNC_IN() do { if (tier2_gpr_shadow_valid) { tier2_gpr_4 = ctx.gpr[4]; tier2_gpr_5 = ctx.gpr[5]; tier2_gpr_6 = ctx.gpr[6]; tier2_gpr_17 = ctx.gpr[17]; tier2_gpr_7 = ctx.gpr[7]; tier2_gpr_29 = ctx.gpr[29]; } } while (false) +#define TIER2_GPR_BEFORE_COLD() do { TIER2_GPR_SYNC_OUT(); tier2_gpr_shadow_valid = false; } while (false) -#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) + auto tier2_complete_shadow = [&](std::uint32_t count) -> bool { + TIER2_GPR_SYNC_OUT(); + const bool same = rt.tier2_complete_fused_transfers(ctx, count); + if (!same) tier2_gpr_shadow_valid = false; + return same; + }; + +#define TIER2_SB_RETURN() do { TIER2_GPR_SYNC_OUT(); tier2_scope.finish(); /* Unwind every logical invoke_chained_direct frame in true LIFO order. Tail frames created inside a fused JAL unwind before that JAL; outer JAL frames are also released after context invalidation. */ while (tier2_return_depth != 0u) { std::uint32_t tier2_base_ = tier2_return_pending_base[tier2_return_depth - 1u]; if (tier2_base_ > tier2_pending_transfers) { ++tier2_stats.fallbacks; tier2_base_ = tier2_pending_transfers; } const std::uint32_t tier2_tail_count_ = tier2_pending_transfers - tier2_base_; tier2_pending_transfers = tier2_base_; if (tier2_tail_count_ != 0u) (void)tier2_complete_shadow(tier2_tail_count_); --tier2_return_depth; (void)tier2_complete_shadow(1u); } if (tier2_pending_transfers != 0u) { (void)tier2_complete_shadow(tier2_pending_transfers); tier2_pending_transfers = 0u; } return; } while (false) goto TIER2_ENTRY_DISPATCH; @@ -126,11 +144,11 @@ TIER2_LOCAL_DISPATCH_U0085: 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)) + if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; - if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; @@ -167,11 +185,11 @@ TIER2_LOCAL_DISPATCH_U0086: 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)) + if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; - if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; @@ -253,15 +271,16 @@ TIER2_ENTRY_DISPATCH: TIER2_SB_RETURN(); } +// TIER2_GPR_BODY_BEGIN 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]); + tier2_gpr_4 = (0u | 0u); + aot_mem.aot_store8(tier2_gpr_29 + static_cast(120), static_cast(tier2_gpr_4)); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(100))); + tier2_gpr_5 = (0u | 0u); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(8))); + tier2_gpr_4 = (tier2_gpr_5 < tier2_gpr_4 ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 == 0u; + aot_mem.aot_store32(tier2_gpr_29 + static_cast(104), tier2_gpr_5); if (branch_taken) { if (!rt.tier2_enter_fused_transfer<86u, 0x0895C2C0u>(ctx)) { ctx.pc = 0x0895C2C0u; @@ -276,19 +295,19 @@ SB_L_0895BF3C: SB_L_0895BF5C: ctx.gpr[23] = (10752u << 16u); - ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + ctx.gpr[20] = (aot_mem.aot_load32(tier2_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]); + tier2_gpr_4 = (tier2_gpr_17 + static_cast(29552)); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(108), tier2_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); + tier2_gpr_4 = (15u << 16u); if (branch_taken) { if (!rt.tier2_enter_fused_transfer<86u, 0x0895C01Cu>(ctx)) { ctx.pc = 0x0895C01Cu; @@ -302,41 +321,41 @@ SB_L_0895BF7C: } 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]); + tier2_gpr_5 = (ctx.gpr[30] >> 8u); + tier2_gpr_4 = (tier2_gpr_5 & tier2_gpr_4); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(108))); + tier2_gpr_6 = (4096u << 16u); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(20), tier2_gpr_4); + tier2_gpr_4 = (tier2_gpr_4 | tier2_gpr_6); { std::uint32_t tier2_old_pointer = 0u; - ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4], &tier2_old_pointer); - ctx.gpr[5] = tier2_old_pointer; } - ctx.gpr[4] = (0u | 0u); + tier2_gpr_4 = aot_mem.aot_append32(tier2_gpr_17 + static_cast(29552), tier2_gpr_4, &tier2_old_pointer); + tier2_gpr_5 = tier2_old_pointer; } + tier2_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]); + tier2_gpr_5 = (ctx.gpr[20] + tier2_gpr_4); + tier2_gpr_5 = (aot_mem.aot_load8(tier2_gpr_5 + static_cast(40))); + tier2_gpr_6 = (ctx.gpr[2] | ctx.gpr[23]); { std::uint32_t tier2_old_pointer = 0u; - ctx.gpr[6] = aot_mem.aot_append32(ctx.gpr[17] + static_cast(29552), ctx.gpr[6], &tier2_old_pointer); - ctx.gpr[7] = tier2_old_pointer; } - 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]); + tier2_gpr_6 = aot_mem.aot_append32(tier2_gpr_17 + static_cast(29552), tier2_gpr_6, &tier2_old_pointer); + tier2_gpr_7 = tier2_old_pointer; } + tier2_gpr_7 = (tier2_gpr_5 << 4u); + tier2_gpr_7 = (tier2_gpr_7 - tier2_gpr_5); + tier2_gpr_7 = (tier2_gpr_7 - tier2_gpr_5); + tier2_gpr_5 = (tier2_gpr_7 - tier2_gpr_5); + tier2_gpr_5 = (tier2_gpr_5 << 2u); + tier2_gpr_5 = (ctx.gpr[30] + tier2_gpr_5); + tier2_gpr_5 = (tier2_gpr_5 & ctx.gpr[21]); + tier2_gpr_5 = (tier2_gpr_5 | ctx.gpr[22]); + aot_mem.aot_store32(tier2_gpr_6 + static_cast(0), tier2_gpr_5); ctx.pc = 0x0895C000u; TIER2_SB_RETURN(); SB_L_0895C000: - ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(29552)); - 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; + tier2_gpr_5 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(1)); + tier2_gpr_5 = (tier2_gpr_4 < static_cast(8) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_5 != 0u; ctx.gpr[2] = (ctx.gpr[2] + static_cast(12)); if (branch_taken) { if (!rt.tier2_enter_fused_transfer<85u, 0x0895BFBCu>(ctx)) { @@ -351,44 +370,44 @@ SB_L_0895C000: } 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))); + tier2_gpr_4 = (aot_mem.aot_load16(ctx.gpr[18] + static_cast(6))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_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]); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_5 + static_cast(12))); + tier2_gpr_4 = (tier2_gpr_4 << 2u); + tier2_gpr_4 = (tier2_gpr_5 + tier2_gpr_4); + ctx.gpr[16] = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(0))); + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); + if (tier2_gpr_4 == 0u) { + aot_mem.aot_store32(tier2_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]); + ctx.gpr[19] = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(0))); + aot_mem.aot_store32(tier2_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_gpr_4 = (ctx.gpr[21] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0206_entry, 206u, 498u, 0x08B3E084u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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_gpr_4 = (ctx.gpr[21] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0206_entry, 206u, 499u, 0x08B3E08Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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))); + tier2_gpr_5 = (ctx.gpr[2] & 2u); + tier2_gpr_4 = (0u | 1u); + { const bool branch_taken = tier2_gpr_5 == 0u; + ctx.gpr[21] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(132))); if (branch_taken) { goto SB_L_0895C0A4; } @@ -396,9 +415,9 @@ SB_L_0895C064: } 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); + tier2_gpr_5 = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-17675))); + { const bool branch_taken = tier2_gpr_5 != 0u; + tier2_gpr_5 = (21760u << 16u); if (branch_taken) { goto SB_L_0895C0A8; } @@ -406,9 +425,9 @@ SB_L_0895C074: } 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); + tier2_gpr_5 = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-19663))); + { const bool branch_taken = tier2_gpr_5 != 0u; + tier2_gpr_5 = (21760u << 16u); if (branch_taken) { goto SB_L_0895C0A8; } @@ -416,9 +435,9 @@ SB_L_0895C080: } 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])); + tier2_gpr_5 = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-17674))); + { const bool branch_taken = tier2_gpr_5 == 0u; + aot_mem.aot_store8(tier2_gpr_29 + static_cast(120), static_cast(tier2_gpr_4)); if (branch_taken) { goto SB_L_0895C0A4; } @@ -426,9 +445,9 @@ SB_L_0895C08C: } SB_L_0895C098: - ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + tier2_gpr_7 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(100))); { const bool branch_taken = 0u == 0u; - ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast(8))); + tier2_gpr_7 = (aot_mem.aot_load32(tier2_gpr_7 + static_cast(8))); if (branch_taken) { goto SB_L_0895C2A8; } @@ -436,34 +455,34 @@ SB_L_0895C098: } SB_L_0895C0A4: - ctx.gpr[5] = (21760u << 16u); + tier2_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]); + tier2_gpr_6 = (ctx.gpr[16] & ctx.gpr[21]); + tier2_gpr_5 = (tier2_gpr_6 | tier2_gpr_5); + tier2_gpr_7 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(29552))); + aot_mem.aot_store32(tier2_gpr_7 + static_cast(0), tier2_gpr_5); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(29552))); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(4)); + tier2_gpr_7 = (22528u << 16u); + aot_mem.aot_store32(tier2_gpr_17 + static_cast(29552), tier2_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_advance32(ctx.gpr[17] + static_cast(29552)); + tier2_gpr_7 = (ctx.gpr[8] | tier2_gpr_7); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_7); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(29552))); + tier2_gpr_7 = (22016u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(4)); + aot_mem.aot_store32(tier2_gpr_17 + static_cast(29552), tier2_gpr_5); + tier2_gpr_7 = (tier2_gpr_6 | tier2_gpr_7); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_7); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(29552))); + tier2_gpr_7 = (22272u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(4)); + aot_mem.aot_store32(tier2_gpr_17 + static_cast(29552), tier2_gpr_5); + tier2_gpr_6 = (tier2_gpr_6 | tier2_gpr_7); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_6); + tier2_gpr_5 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); { const bool branch_taken = ctx.gpr[19] == 0u; // nop if (branch_taken) { @@ -474,52 +493,52 @@ SB_L_0895C0A8: 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]); + tier2_gpr_5 = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[19] + static_cast(10)))))); + tier2_gpr_5 = (tier2_gpr_5 & 63u); + tier2_gpr_4 = (tier2_gpr_4 << (tier2_gpr_5 & 31u)); + ctx.fpr[13] = std::bit_cast(tier2_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]); + tier2_gpr_4 = (53248u << 16u); + tier2_gpr_5 = (std::bit_cast(ctx.fpr[12])); + tier2_gpr_5 = (tier2_gpr_5 >> 8u); + tier2_gpr_4 = (tier2_gpr_5 | tier2_gpr_4); { std::uint32_t tier2_old_pointer = 0u; - ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4], &tier2_old_pointer); - ctx.gpr[5] = tier2_old_pointer; } + tier2_gpr_4 = aot_mem.aot_append32(tier2_gpr_17 + static_cast(29552), tier2_gpr_4, &tier2_old_pointer); + tier2_gpr_5 = tier2_old_pointer; } 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_advance32(ctx.gpr[17] + static_cast(29552)); - ctx.gpr[4] = (ctx.gpr[19] | 0u); + tier2_gpr_5 = (std::bit_cast(ctx.fpr[12])); + tier2_gpr_5 = (tier2_gpr_5 >> 8u); + tier2_gpr_6 = (18432u << 16u); + tier2_gpr_7 = (std::bit_cast(ctx.fpr[13])); + tier2_gpr_7 = (tier2_gpr_7 >> 8u); + tier2_gpr_6 = (tier2_gpr_7 | tier2_gpr_6); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_6); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(29552))); + tier2_gpr_6 = (18688u << 16u); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(4)); + aot_mem.aot_store32(tier2_gpr_17 + static_cast(29552), tier2_gpr_4); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0199_entry, 199u, 283u, 0x08B217D4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(64))); + tier2_gpr_7 = (tier2_gpr_4 + tier2_gpr_5); + tier2_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]); + tier2_gpr_7 = (tier2_gpr_7 + tier2_gpr_4); if (branch_taken) { goto SB_L_0895C1FC; } @@ -527,41 +546,41 @@ SB_L_0895C1B4: } SB_L_0895C1D4: - ctx.gpr[4] = (ctx.gpr[19] | 0u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0199_entry, 199u, 283u, 0x08B217D4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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]); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(64))); + tier2_gpr_7 = (tier2_gpr_4 + tier2_gpr_5); + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + tier2_gpr_7 = (tier2_gpr_7 + tier2_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))); + tier2_gpr_4 = (aot_mem.aot_load8(tier2_gpr_29 + static_cast(128))); + if (tier2_gpr_4 == 0u) { + ctx.gpr[8] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(100))); goto SB_L_0895C220; } goto SB_L_0895C208; SB_L_0895C208: - ctx.gpr[4] = (ctx.gpr[7] | 0u); + tier2_gpr_4 = (tier2_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_gpr_5 = (ctx.gpr[19] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0129_entry, 129u, 246u, 0x08A09B2Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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))); + tier2_gpr_7 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(100))); { const bool branch_taken = 0u == 0u; - ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast(8))); + tier2_gpr_7 = (aot_mem.aot_load32(tier2_gpr_7 + static_cast(8))); if (branch_taken) { goto SB_L_0895C2A8; } @@ -569,15 +588,15 @@ SB_L_0895C214: } 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]); + tier2_gpr_4 = (4608u << 16u); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[8] + static_cast(4))); + tier2_gpr_4 = (tier2_gpr_5 | tier2_gpr_4); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(29552))); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_4); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(29552))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(4)); + { const bool branch_taken = tier2_gpr_7 == 0u; + aot_mem.aot_store32(tier2_gpr_17 + static_cast(29552), tier2_gpr_4); if (branch_taken) { goto SB_L_0895C28C; } @@ -585,39 +604,39 @@ SB_L_0895C220: } 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))); + tier2_gpr_5 = (15u << 16u); + tier2_gpr_6 = (tier2_gpr_7 >> 8u); + tier2_gpr_5 = (tier2_gpr_6 & tier2_gpr_5); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_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_advance32(ctx.gpr[17] + static_cast(29552)); + aot_mem.aot_store32(tier2_gpr_6 + static_cast(20), tier2_gpr_5); + tier2_gpr_5 = (tier2_gpr_5 | ctx.gpr[9]); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(29552))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(4)); + tier2_gpr_5 = (256u << 16u); + aot_mem.aot_store32(tier2_gpr_17 + static_cast(29552), tier2_gpr_4); + tier2_gpr_6 = (tier2_gpr_7 & ctx.gpr[21]); + tier2_gpr_5 = (tier2_gpr_6 | tier2_gpr_5); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); 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_advance32(ctx.gpr[17] + static_cast(29552)); - ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[8] + static_cast(8))); + tier2_gpr_5 = (1028u << 16u); + tier2_gpr_5 = (ctx.gpr[19] | tier2_gpr_5); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_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)); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(104))); + tier2_gpr_4 = (tier2_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]); + tier2_gpr_5 = (tier2_gpr_4 < tier2_gpr_7 ? 1u : 0u); + { const bool branch_taken = tier2_gpr_5 != 0u; + aot_mem.aot_store32(tier2_gpr_29 + static_cast(104), tier2_gpr_4); if (branch_taken) { if (!rt.tier2_enter_fused_transfer<85u, 0x0895BF7Cu>(ctx)) { ctx.pc = 0x0895BF7Cu; @@ -633,25 +652,25 @@ SB_L_0895C2A8: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0044_entry, 44u, 671u, 0x088B7BC0u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]); + tier2_gpr_4 = (18432u << 16u); + tier2_gpr_5 = (std::bit_cast(ctx.fpr[20])); + tier2_gpr_5 = (tier2_gpr_5 >> 8u); + tier2_gpr_4 = (tier2_gpr_5 | tier2_gpr_4); { std::uint32_t tier2_old_pointer = 0u; - ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4], &tier2_old_pointer); - ctx.gpr[5] = tier2_old_pointer; } - 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_advance32(ctx.gpr[17] + static_cast(29552)); - ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[29] + static_cast(120))); - { const bool branch_taken = ctx.gpr[4] == 0u; + tier2_gpr_4 = aot_mem.aot_append32(tier2_gpr_17 + static_cast(29552), tier2_gpr_4, &tier2_old_pointer); + tier2_gpr_5 = tier2_old_pointer; } + tier2_gpr_5 = (18688u << 16u); + tier2_gpr_6 = (std::bit_cast(ctx.fpr[20])); + tier2_gpr_6 = (tier2_gpr_6 >> 8u); + tier2_gpr_5 = (tier2_gpr_6 | tier2_gpr_5); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_4 = (aot_mem.aot_load8(tier2_gpr_29 + static_cast(120))); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_0895C934; @@ -660,117 +679,117 @@ SB_L_0895C2C8: } SB_L_0895C318: - ctx.gpr[4] = (0u | 11u); + tier2_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_gpr_5 = (0u | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 179u, 0x088614B4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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); + tier2_gpr_4 = (8704u << 16u); { std::uint32_t tier2_old_pointer = 0u; - ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4], &tier2_old_pointer); - ctx.gpr[5] = tier2_old_pointer; } - ctx.gpr[4] = (0u | 11u); + tier2_gpr_4 = aot_mem.aot_append32(tier2_gpr_17 + static_cast(29552), tier2_gpr_4, &tier2_old_pointer); + tier2_gpr_5 = tier2_old_pointer; } + tier2_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_gpr_5 = (0u | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 203u, 0x08861668u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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)); + tier2_gpr_4 = (22016u << 16u); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(-1)); { std::uint32_t tier2_old_pointer = 0u; - ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4], &tier2_old_pointer); - ctx.gpr[5] = tier2_old_pointer; } - 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_advance32(ctx.gpr[17] + static_cast(29552)); - 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_advance32(ctx.gpr[17] + static_cast(29552)); - 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_advance32(ctx.gpr[17] + static_cast(29552)); - ctx.gpr[5] = (24320u << 16u); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(29552)); + tier2_gpr_4 = aot_mem.aot_append32(tier2_gpr_17 + static_cast(29552), tier2_gpr_4, &tier2_old_pointer); + tier2_gpr_5 = tier2_old_pointer; } + tier2_gpr_5 = (22528u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(255)); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_5 = (22272u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(-1)); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_5 = (22528u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(-1)); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_5 = (24320u << 16u); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); 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_advance32(ctx.gpr[17] + static_cast(29552)); + tier2_gpr_5 = (std::bit_cast(ctx.fpr[12])); + tier2_gpr_5 = (tier2_gpr_5 >> 8u); + tier2_gpr_6 = (25344u << 16u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); 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_advance32(ctx.gpr[17] + static_cast(29552)); + tier2_gpr_5 = (std::bit_cast(ctx.fpr[13])); + tier2_gpr_5 = (tier2_gpr_5 >> 8u); + tier2_gpr_6 = (25600u << 16u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); 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_advance32(ctx.gpr[17] + static_cast(29552)); - 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_advance32(ctx.gpr[17] + static_cast(29552)); - 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_advance32(ctx.gpr[17] + static_cast(29552)); - ctx.gpr[5] = (24576u << 16u); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(29552)); + tier2_gpr_5 = (std::bit_cast(ctx.fpr[12])); + tier2_gpr_5 = (tier2_gpr_5 >> 8u); + tier2_gpr_6 = (25856u << 16u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_5 = (37120u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(-1)); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_5 = (6144u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(1)); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_5 = (24576u << 16u); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); 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_advance32(ctx.gpr[17] + static_cast(29552)); + tier2_gpr_5 = (std::bit_cast(ctx.fpr[12])); + tier2_gpr_5 = (tier2_gpr_5 >> 8u); + tier2_gpr_6 = (26112u << 16u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); 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_advance32(ctx.gpr[17] + static_cast(29552)); + tier2_gpr_5 = (std::bit_cast(ctx.fpr[13])); + tier2_gpr_5 = (tier2_gpr_5 >> 8u); + tier2_gpr_6 = (26368u << 16u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); 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_advance32(ctx.gpr[17] + static_cast(29552)); - 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_advance32(ctx.gpr[17] + static_cast(29552)); - 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_advance32(ctx.gpr[17] + static_cast(29552)); - 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_advance32(ctx.gpr[17] + static_cast(29552)); - 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_advance32(ctx.gpr[17] + static_cast(29552)); - 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])); + tier2_gpr_5 = (std::bit_cast(ctx.fpr[12])); + tier2_gpr_5 = (tier2_gpr_5 >> 8u); + tier2_gpr_6 = (26624u << 16u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_5 = (37888u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(-1)); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_5 = (6400u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(1)); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_5 = (49152u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(2)); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_5 = (49408u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(256)); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-17676))); + { const bool branch_taken = tier2_gpr_4 == 0u; + aot_mem.aot_store8(tier2_gpr_29 + static_cast(129), static_cast(ctx.gpr[16])); if (branch_taken) { goto SB_L_0895C564; } @@ -778,15 +797,15 @@ SB_L_0895C34C: } SB_L_0895C54C: - ctx.gpr[4] = (8960u << 16u); + tier2_gpr_4 = (8960u << 16u); { std::uint32_t tier2_old_pointer = 0u; - ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4], &tier2_old_pointer); - ctx.gpr[5] = tier2_old_pointer; } + tier2_gpr_4 = aot_mem.aot_append32(tier2_gpr_17 + static_cast(29552), tier2_gpr_4, &tier2_old_pointer); + tier2_gpr_5 = tier2_old_pointer; } 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; + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-17680))); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_0895C640; @@ -795,50 +814,50 @@ SB_L_0895C564: } SB_L_0895C570: - ctx.gpr[4] = (7680u << 16u); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + tier2_gpr_4 = (7680u << 16u); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(1)); { std::uint32_t tier2_old_pointer = 0u; - ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4], &tier2_old_pointer); - ctx.gpr[5] = tier2_old_pointer; } - ctx.gpr[5] = (49664u << 16u); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(29552)); - ctx.gpr[5] = (49920u << 16u); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(29552)); - ctx.gpr[5] = (51968u << 16u); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(29552)); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-17680))); - ctx.gpr[7] = (ctx.gpr[6] >> 8u); + tier2_gpr_4 = aot_mem.aot_append32(tier2_gpr_17 + static_cast(29552), tier2_gpr_4, &tier2_old_pointer); + tier2_gpr_5 = tier2_old_pointer; } + tier2_gpr_5 = (49664u << 16u); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_5 = (49920u << 16u); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_5 = (51968u << 16u); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_6 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-17680))); + tier2_gpr_7 = (tier2_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]); + tier2_gpr_6 = (tier2_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_advance32(ctx.gpr[17] + static_cast(29552)); - 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_advance32(ctx.gpr[17] + static_cast(29552)); - 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_advance32(ctx.gpr[17] + static_cast(29552)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(29552)); + tier2_gpr_6 = (tier2_gpr_6 | ctx.gpr[8]); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_6); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_6 = (255u << 16u); + tier2_gpr_6 = (tier2_gpr_7 & tier2_gpr_6); + tier2_gpr_7 = (43008u << 16u); + tier2_gpr_7 = (tier2_gpr_7 + static_cast(64)); + tier2_gpr_6 = (tier2_gpr_6 | tier2_gpr_7); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_6); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_6 = (47104u << 16u); + tier2_gpr_6 = (tier2_gpr_6 + static_cast(1542)); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_6); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); goto SB_L_0895C640; SB_L_0895C640: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(8))); + tier2_gpr_4 = (ctx.gpr[21] < tier2_gpr_4 ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_0895C878; @@ -847,55 +866,55 @@ SB_L_0895C640: } SB_L_0895C658: - ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + ctx.gpr[19] = (aot_mem.aot_load32(tier2_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]); + tier2_gpr_4 = (16128u << 16u); + ctx.fpr[22] = std::bit_cast(tier2_gpr_4); ctx.fpr[24] = std::bit_cast(0u); - ctx.gpr[4] = (17279u << 16u); - ctx.fpr[26] = std::bit_cast(ctx.gpr[4]); + tier2_gpr_4 = (17279u << 16u); + ctx.fpr[26] = std::bit_cast(tier2_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]); + tier2_gpr_4 = (tier2_gpr_17 + static_cast(29552)); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(108), tier2_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))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(92))); + tier2_gpr_5 = (aot_mem.aot_load16(ctx.gpr[18] + static_cast(6))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(12))); + tier2_gpr_5 = (tier2_gpr_5 << 2u); + tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_5); + ctx.gpr[16] = (aot_mem.aot_load32(tier2_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_gpr_4 = (ctx.gpr[16] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0206_entry, 206u, 499u, 0x08B3E08Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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))); + tier2_gpr_4 = (ctx.gpr[2] & 2u); + if (tier2_gpr_4 == 0u) { + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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))); + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-19663))); + if (tier2_gpr_4 != 0u) { + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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; + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-17680))); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_0895C708; @@ -905,13 +924,13 @@ SB_L_0895C6D0: 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_gpr_4 = (ctx.gpr[16] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0206_entry, 206u, 524u, 0x08B3E260u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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; + tier2_gpr_4 = (ctx.gpr[2] | 0u); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_0895C6FC; @@ -920,9 +939,9 @@ SB_L_0895C6E4: } SB_L_0895C6F0: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(100))); { const bool branch_taken = 0u == 0u; - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(8))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(8))); if (branch_taken) { goto SB_L_0895C868; } @@ -930,16 +949,16 @@ SB_L_0895C6F0: } SB_L_0895C6FC: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0199_entry, 199u, 283u, 0x08B217D4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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_gpr_4 = (ctx.gpr[16] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0206_entry, 206u, 523u, 0x08B3E254u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0895C710u) goto SB_L_0895C710; TIER2_SB_RETURN(); SB_L_0895C710: @@ -947,7 +966,7 @@ SB_L_0895C710: 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.gpr[16] = (aot_mem.aot_load32(tier2_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); @@ -971,9 +990,9 @@ SB_L_0895C734: 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; + tier2_gpr_4 = (std::bit_cast(ctx.fpr[12])); + tier2_gpr_5 = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-17674))); + { const bool branch_taken = tier2_gpr_5 == 0u; // nop if (branch_taken) { goto SB_L_0895C764; @@ -982,45 +1001,45 @@ SB_L_0895C748: } SB_L_0895C760: - ctx.gpr[4] = (ctx.gpr[8] | 0u); + tier2_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]); + { const std::int64_t product = static_cast(static_cast(tier2_gpr_4)) * static_cast(static_cast(ctx.gpr[22])); ctx.lo = static_cast(product); ctx.hi = static_cast(static_cast(product) >> 32u); } + tier2_gpr_5 = (ctx.lo); + tier2_gpr_4 = (ctx.gpr[8] - tier2_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_advance32(ctx.gpr[17] + static_cast(29552)); - 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_advance32(ctx.gpr[17] + static_cast(29552)); - 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]); + { const std::int64_t product = static_cast(static_cast(tier2_gpr_4)) * static_cast(static_cast(ctx.gpr[22])); ctx.lo = static_cast(product); ctx.hi = static_cast(static_cast(product) >> 32u); } + tier2_gpr_4 = (ctx.lo); + tier2_gpr_6 = (57088u << 16u); + tier2_gpr_6 = (tier2_gpr_6 + static_cast(170)); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), tier2_gpr_6); + tier2_gpr_6 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_5 = (tier2_gpr_5 & ctx.gpr[20]); + tier2_gpr_5 = (tier2_gpr_5 | ctx.gpr[30]); + aot_mem.aot_store32(tier2_gpr_6 + static_cast(0), tier2_gpr_5); + tier2_gpr_5 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_4 = (tier2_gpr_4 & ctx.gpr[20]); + tier2_gpr_4 = (tier2_gpr_4 | ctx.gpr[23]); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_4); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(29552))); + tier2_gpr_5 = (tier2_gpr_4 + static_cast(4)); + aot_mem.aot_store32(tier2_gpr_17 + static_cast(29552), tier2_gpr_5); + tier2_gpr_4 = (aot_mem.aot_load16(ctx.gpr[18] + static_cast(4))); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(100))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(2)); + tier2_gpr_7 = (aot_mem.aot_load32(tier2_gpr_6 + static_cast(64))); + tier2_gpr_7 = (tier2_gpr_6 + tier2_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[18] = (tier2_gpr_7 + ctx.gpr[18]); + tier2_gpr_7 = (4608u << 16u); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_6 + static_cast(4))); + tier2_gpr_6 = (tier2_gpr_6 | tier2_gpr_7); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_6); + ctx.gpr[16] = (aot_mem.aot_load32(tier2_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]); + aot_mem.aot_store32(tier2_gpr_17 + static_cast(29552), ctx.gpr[16]); if (branch_taken) { goto SB_L_0895C848; } @@ -1028,40 +1047,40 @@ SB_L_0895C764: } 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_advance32(ctx.gpr[17] + static_cast(29552)); + tier2_gpr_5 = (15u << 16u); + tier2_gpr_6 = (ctx.gpr[18] >> 8u); + tier2_gpr_5 = (tier2_gpr_6 & tier2_gpr_5); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(108))); + tier2_gpr_7 = (4096u << 16u); + aot_mem.aot_store32(tier2_gpr_6 + static_cast(20), tier2_gpr_5); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_7); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), tier2_gpr_5); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(29552))); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(4)); + tier2_gpr_6 = (256u << 16u); + aot_mem.aot_store32(tier2_gpr_17 + static_cast(29552), tier2_gpr_5); + tier2_gpr_7 = (ctx.gpr[18] & ctx.gpr[20]); + tier2_gpr_6 = (tier2_gpr_7 | tier2_gpr_6); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_6); + ctx.gpr[16] = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); 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_advance32(ctx.gpr[17] + static_cast(29552)); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + tier2_gpr_5 = (1028u << 16u); + tier2_gpr_4 = (tier2_gpr_4 | tier2_gpr_5); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), tier2_gpr_4); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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; + tier2_gpr_4 = (ctx.gpr[21] < tier2_gpr_4 ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 != 0u; ctx.gpr[19] = (ctx.gpr[19] + static_cast(48)); if (branch_taken) { goto SB_L_0895C694; @@ -1070,47 +1089,47 @@ SB_L_0895C868: } SB_L_0895C878: - ctx.gpr[4] = (0u | 0u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0199_entry, 199u, 283u, 0x08B217D4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 200u, 0x088615BCu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x0895C88Cu) goto SB_L_0895C88C; TIER2_SB_RETURN(); SB_L_0895C88C: - ctx.gpr[4] = (6144u << 16u); + tier2_gpr_4 = (6144u << 16u); { std::uint32_t tier2_old_pointer = 0u; - ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4], &tier2_old_pointer); - ctx.gpr[5] = tier2_old_pointer; } - ctx.gpr[5] = (6400u << 16u); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(29552)); - ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[29] + static_cast(129))); + tier2_gpr_4 = aot_mem.aot_append32(tier2_gpr_17 + static_cast(29552), tier2_gpr_4, &tier2_old_pointer); + tier2_gpr_5 = tier2_old_pointer; } + tier2_gpr_5 = (6400u << 16u); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_5 = (aot_mem.aot_load8(tier2_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_gpr_4 = (0u | 11u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 203u, 0x08861668u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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)); + tier2_gpr_4 = (8704u << 16u); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(1)); { std::uint32_t tier2_old_pointer = 0u; - ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4], &tier2_old_pointer); - ctx.gpr[5] = tier2_old_pointer; } - ctx.gpr[5] = (49152u << 16u); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(29552)); - 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_advance32(ctx.gpr[17] + static_cast(29552)); - ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-17676))); - { const bool branch_taken = ctx.gpr[4] == 0u; + tier2_gpr_4 = aot_mem.aot_append32(tier2_gpr_17 + static_cast(29552), tier2_gpr_4, &tier2_old_pointer); + tier2_gpr_5 = tier2_old_pointer; } + tier2_gpr_5 = (49152u << 16u); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_5 = (49408u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(256)); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = aot_mem.aot_advance32(tier2_gpr_17 + static_cast(29552)); + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-17676))); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_0895C934; @@ -1119,23 +1138,23 @@ SB_L_0895C8C4: } SB_L_0895C918: - ctx.gpr[4] = (8960u << 16u); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); + tier2_gpr_4 = (8960u << 16u); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(1)); { std::uint32_t tier2_old_pointer = 0u; - ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4], &tier2_old_pointer); - ctx.gpr[5] = tier2_old_pointer; } + tier2_gpr_4 = aot_mem.aot_append32(tier2_gpr_17 + static_cast(29552), tier2_gpr_4, &tier2_old_pointer); + tier2_gpr_5 = tier2_old_pointer; } goto SB_L_0895C934; SB_L_0895C934: - ctx.gpr[2] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(96))); + ctx.gpr[2] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(96))); { std::uint32_t tier2_words[14]{}; - if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(136), tier2_words)) { + if (aot_mem.aot_try_load32_block(tier2_gpr_29 + static_cast(136), tier2_words)) { ctx.fpr[20] = std::bit_cast(tier2_words[0]); ctx.fpr[22] = std::bit_cast(tier2_words[1]); ctx.fpr[24] = std::bit_cast(tier2_words[2]); ctx.fpr[26] = std::bit_cast(tier2_words[3]); ctx.gpr[16] = tier2_words[4]; - ctx.gpr[17] = tier2_words[5]; + tier2_gpr_17 = tier2_words[5]; ctx.gpr[18] = tier2_words[6]; ctx.gpr[19] = tier2_words[7]; ctx.gpr[20] = tier2_words[8]; @@ -1145,28 +1164,31 @@ SB_L_0895C934: ctx.gpr[30] = tier2_words[12]; ctx.gpr[31] = tier2_words[13]; } else { - 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))); + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_29 + static_cast(136))); + ctx.fpr[22] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_29 + static_cast(140))); + ctx.fpr[24] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_29 + static_cast(144))); + ctx.fpr[26] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_29 + static_cast(148))); + ctx.gpr[16] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(152))); + tier2_gpr_17 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(156))); + ctx.gpr[18] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(160))); + ctx.gpr[19] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(164))); + ctx.gpr[20] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(168))); + ctx.gpr[21] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(172))); + ctx.gpr[22] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(176))); + ctx.gpr[23] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(180))); + ctx.gpr[30] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(184))); + ctx.gpr[31] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(188))); } } jump_target = ctx.gpr[31]; - ctx.gpr[29] = (ctx.gpr[29] + static_cast(192)); + tier2_gpr_29 = (tier2_gpr_29 + static_cast(192)); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0086; - +// TIER2_GPR_BODY_END #undef TIER2_SB_RETURN +#undef TIER2_GPR_BEFORE_COLD +#undef TIER2_GPR_SYNC_IN +#undef TIER2_GPR_SYNC_OUT } } // namespace vcs diff --git a/profiles/vcs/host/vcs_tier2_cluster_edge43.cpp b/profiles/vcs/host/vcs_tier2_cluster_edge43.cpp index 055c129..3137f46 100644 --- a/profiles/vcs/host/vcs_tier2_cluster_edge43.cpp +++ b/profiles/vcs/host/vcs_tier2_cluster_edge43.cpp @@ -1,8 +1,9 @@ // AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: edge43 +// Tier-2 SUPERBLOCK V4 150FPS cluster: edge43 #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_fast_paths.hpp" #include @@ -27,8 +28,25 @@ void tier2_superblock_edge43(psprecomp::Runtime &rt, std::uint32_t local_pc = 0u; std::uint32_t local_transfers = 0u; std::uint32_t entry_id = 0u; + std::uint32_t tier2_gpr_4 = ctx.gpr[4]; + std::uint32_t tier2_gpr_6 = ctx.gpr[6]; + std::uint32_t tier2_gpr_5 = ctx.gpr[5]; + std::uint32_t tier2_gpr_29 = ctx.gpr[29]; + std::uint32_t tier2_gpr_17 = ctx.gpr[17]; + std::uint32_t tier2_gpr_19 = ctx.gpr[19]; + bool tier2_gpr_shadow_valid = true; +#define TIER2_GPR_SYNC_OUT() do { if (tier2_gpr_shadow_valid) { ctx.gpr[4] = tier2_gpr_4; ctx.gpr[6] = tier2_gpr_6; ctx.gpr[5] = tier2_gpr_5; ctx.gpr[29] = tier2_gpr_29; ctx.gpr[17] = tier2_gpr_17; ctx.gpr[19] = tier2_gpr_19; } } while (false) +#define TIER2_GPR_SYNC_IN() do { if (tier2_gpr_shadow_valid) { tier2_gpr_4 = ctx.gpr[4]; tier2_gpr_6 = ctx.gpr[6]; tier2_gpr_5 = ctx.gpr[5]; tier2_gpr_29 = ctx.gpr[29]; tier2_gpr_17 = ctx.gpr[17]; tier2_gpr_19 = ctx.gpr[19]; } } while (false) +#define TIER2_GPR_BEFORE_COLD() do { TIER2_GPR_SYNC_OUT(); tier2_gpr_shadow_valid = false; } while (false) -#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) + auto tier2_complete_shadow = [&](std::uint32_t count) -> bool { + TIER2_GPR_SYNC_OUT(); + const bool same = rt.tier2_complete_fused_transfers(ctx, count); + if (!same) tier2_gpr_shadow_valid = false; + return same; + }; + +#define TIER2_SB_RETURN() do { TIER2_GPR_SYNC_OUT(); tier2_scope.finish(); /* Unwind every logical invoke_chained_direct frame in true LIFO order. Tail frames created inside a fused JAL unwind before that JAL; outer JAL frames are also released after context invalidation. */ while (tier2_return_depth != 0u) { std::uint32_t tier2_base_ = tier2_return_pending_base[tier2_return_depth - 1u]; if (tier2_base_ > tier2_pending_transfers) { ++tier2_stats.fallbacks; tier2_base_ = tier2_pending_transfers; } const std::uint32_t tier2_tail_count_ = tier2_pending_transfers - tier2_base_; tier2_pending_transfers = tier2_base_; if (tier2_tail_count_ != 0u) (void)tier2_complete_shadow(tier2_tail_count_); --tier2_return_depth; (void)tier2_complete_shadow(1u); } if (tier2_pending_transfers != 0u) { (void)tier2_complete_shadow(tier2_pending_transfers); tier2_pending_transfers = 0u; } return; } while (false) goto TIER2_ENTRY_DISPATCH; @@ -99,11 +117,11 @@ TIER2_LOCAL_DISPATCH_U0043: 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)) + if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; - if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; @@ -148,11 +166,11 @@ TIER2_LOCAL_DISPATCH_U0044: 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)) + if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; - if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; @@ -197,8 +215,9 @@ TIER2_ENTRY_DISPATCH: TIER2_SB_RETURN(); } +// TIER2_GPR_BODY_BEGIN SB_L_088B1780: - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -206,7 +225,7 @@ SB_L_088B1780: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(16); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(16); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -214,7 +233,7 @@ SB_L_088B1780: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[5] + static_cast(0); + { const std::uint32_t vfpu_address = tier2_gpr_5 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -222,7 +241,7 @@ SB_L_088B1780: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[5] + static_cast(16); + { const std::uint32_t vfpu_address = tier2_gpr_5 + static_cast(16); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -297,46 +316,46 @@ SB_L_088B17B4: 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); + tier2_gpr_4 = (ctx.vfpu_scalar_bits_ct<131u>()); + ctx.gpr[2] = (tier2_gpr_4 & 16u); jump_target = ctx.gpr[31]; ctx.gpr[2] = (ctx.gpr[2] < static_cast(1) ? 1u : 0u); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0043; SB_L_088B18EC: - ctx.gpr[29] = (ctx.gpr[29] + static_cast(-128)); - { const std::uint32_t tier2_words[9]{ctx.gpr[16], ctx.gpr[17], ctx.gpr[18], ctx.gpr[19], ctx.gpr[20], ctx.gpr[21], ctx.gpr[22], ctx.gpr[23], ctx.gpr[31]}; - aot_mem.aot_store32_block(ctx.gpr[29] + static_cast(84), tier2_words); } + tier2_gpr_29 = (tier2_gpr_29 + static_cast(-128)); + { const std::uint32_t tier2_words[9]{ctx.gpr[16], tier2_gpr_17, ctx.gpr[18], tier2_gpr_19, ctx.gpr[20], ctx.gpr[21], ctx.gpr[22], ctx.gpr[23], ctx.gpr[31]}; + aot_mem.aot_store32_block(tier2_gpr_29 + static_cast(84), tier2_words); } 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); + tier2_gpr_17 = (ctx.gpr[7] | 0u); + ctx.gpr[18] = (tier2_gpr_6 | 0u); + ctx.gpr[21] = (tier2_gpr_4 | 0u); + ctx.gpr[22] = (tier2_gpr_29 + static_cast(16)); + ctx.gpr[23] = (tier2_gpr_29 + static_cast(32)); + tier2_gpr_4 = (ctx.gpr[18] | 0u); + tier2_gpr_6 = (tier2_gpr_29 | 0u); ctx.gpr[7] = (ctx.gpr[22] | 0u); ctx.gpr[31] = (0x088B1940u); ctx.gpr[8] = (ctx.gpr[23] | 0u); - if (rt.invoke_chained_direct<&recomp_unit_0163_entry, 163u, 44u, 0x08A9061Cu>(ctx, &aot_mem) && ctx.pc == 0x088B1940u) goto SB_L_088B1940; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0163_entry, 163u, 44u, 0x08A9061Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x088B1940u) goto SB_L_088B1940; TIER2_SB_RETURN(); SB_L_088B1940: - ctx.gpr[20] = (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[20] = (tier2_gpr_29 + static_cast(48)); + tier2_gpr_19 = (tier2_gpr_29 + static_cast(64)); + ctx.gpr[10] = (tier2_gpr_29 + static_cast(80)); + tier2_gpr_4 = (ctx.gpr[21] | 0u); + tier2_gpr_5 = (tier2_gpr_29 | 0u); + tier2_gpr_6 = (ctx.gpr[22] | 0u); ctx.gpr[7] = (ctx.gpr[23] | 0u); ctx.gpr[8] = (ctx.gpr[20] | 0u); ctx.gpr[31] = (0x088B1968u); - ctx.gpr[9] = (ctx.gpr[19] | 0u); + ctx.gpr[9] = (tier2_gpr_19 | 0u); goto SB_L_088B1B74; SB_L_088B1B74: - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -344,7 +363,7 @@ SB_L_088B1B74: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(16); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(16); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -352,7 +371,7 @@ SB_L_088B1B74: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[5] + static_cast(0); + { const std::uint32_t vfpu_address = tier2_gpr_5 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -360,7 +379,7 @@ SB_L_088B1B74: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[6] + static_cast(0); + { const std::uint32_t vfpu_address = tier2_gpr_6 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -520,9 +539,9 @@ SB_L_088B1C40: goto TIER2_LOCAL_DISPATCH_U0043; SB_L_088B3FCC: - ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(68))); + ctx.gpr[18] = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(68))); ctx.gpr[18] = (ctx.gpr[18] + ctx.gpr[30]); - ctx.gpr[5] = (ctx.gpr[29] + static_cast(16)); + tier2_gpr_5 = (tier2_gpr_29 + static_cast(16)); { const std::uint32_t vfpu_address = ctx.gpr[18] + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ @@ -552,23 +571,23 @@ SB_L_088B3FCC: } 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); + const std::uint32_t vfpu_address = tier2_gpr_5 + static_cast(0); const std::uint32_t tier2_vfpu_words[4]{std::bit_cast(vfpu_value[0]), std::bit_cast(vfpu_value[1]), std::bit_cast(vfpu_value[2]), std::bit_cast(vfpu_value[3])}; aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); } { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<1u, 4u>(vfpu_value); - const std::uint32_t vfpu_address = ctx.gpr[5] + static_cast(16); + const std::uint32_t vfpu_address = tier2_gpr_5 + static_cast(16); const std::uint32_t tier2_vfpu_words[4]{std::bit_cast(vfpu_value[0]), std::bit_cast(vfpu_value[1]), std::bit_cast(vfpu_value[2]), std::bit_cast(vfpu_value[3])}; aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); } ctx.gpr[31] = (0x088B3FFCu); - ctx.gpr[4] = (ctx.gpr[20] | 0u); + tier2_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); + tier2_gpr_17 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[18] + static_cast(6)))))); + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[18] + static_cast(14)))))); + tier2_gpr_4 = (static_cast(tier2_gpr_4) < static_cast(tier2_gpr_17) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 != 0u; + ctx.gpr[16] = (tier2_gpr_17 << 3u); if (branch_taken) { goto SB_L_088B40F4; } @@ -585,26 +604,26 @@ SB_L_088B4018: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(76))); + tier2_gpr_4 = (tier2_gpr_4 + ctx.gpr[16]); + tier2_gpr_4 = (aot_mem.aot_load8(tier2_gpr_4 + static_cast(6))); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + tier2_gpr_5 = (tier2_gpr_4 ^ 7u); + tier2_gpr_5 = (tier2_gpr_5 < static_cast(1) ? 1u : 0u); + tier2_gpr_6 = (tier2_gpr_4 ^ 8u); + tier2_gpr_6 = (tier2_gpr_6 < static_cast(1) ? 1u : 0u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + tier2_gpr_6 = (tier2_gpr_4 ^ 16u); + tier2_gpr_6 = (tier2_gpr_6 < static_cast(1) ? 1u : 0u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + tier2_gpr_6 = (tier2_gpr_4 ^ 31u); + tier2_gpr_6 = (tier2_gpr_6 < static_cast(1) ? 1u : 0u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + tier2_gpr_4 = (tier2_gpr_4 ^ 12u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_5 | tier2_gpr_4); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_088B40E0; @@ -622,23 +641,23 @@ SB_L_088B4074: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(76))); + tier2_gpr_4 = (tier2_gpr_4 + ctx.gpr[16]); + tier2_gpr_4 = (aot_mem.aot_load8(tier2_gpr_4 + static_cast(6))); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + tier2_gpr_5 = (tier2_gpr_4 ^ 8u); + tier2_gpr_5 = (tier2_gpr_5 < static_cast(1) ? 1u : 0u); + tier2_gpr_6 = (tier2_gpr_4 ^ 16u); + tier2_gpr_6 = (tier2_gpr_6 < static_cast(1) ? 1u : 0u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + tier2_gpr_6 = (tier2_gpr_4 ^ 31u); + tier2_gpr_6 = (tier2_gpr_6 < static_cast(1) ? 1u : 0u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + tier2_gpr_4 = (tier2_gpr_4 ^ 12u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_5 | tier2_gpr_4); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_088B40E0; @@ -647,13 +666,13 @@ SB_L_088B407C: } 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); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(72))); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(76))); + tier2_gpr_6 = (tier2_gpr_6 + ctx.gpr[16]); + tier2_gpr_4 = (ctx.gpr[20] | 0u); ctx.gpr[7] = (ctx.gpr[23] | 0u); ctx.gpr[31] = (0x088B40E0u); - ctx.gpr[8] = (ctx.gpr[29] | 0u); + ctx.gpr[8] = (tier2_gpr_29 | 0u); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<43u, 0x088B18ECu>(ctx)) { ctx.pc = 0x088B18ECu; @@ -667,14 +686,14 @@ SB_L_088B40C4: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 210u, 0x088B18ECu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x088B40E0u) goto SB_L_088B40E0; TIER2_SB_RETURN(); SB_L_088B40E0: - 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; + tier2_gpr_17 = (tier2_gpr_17 + static_cast(1)); + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[18] + static_cast(14)))))); + tier2_gpr_4 = (static_cast(tier2_gpr_4) < static_cast(tier2_gpr_17) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 == 0u; ctx.gpr[16] = (ctx.gpr[16] + static_cast(8)); if (branch_taken) { goto SB_L_088B4018; @@ -683,16 +702,16 @@ SB_L_088B40E0: } SB_L_088B40F4: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(48))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(1)); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_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]); + tier2_gpr_5 = (static_cast(tier2_gpr_4) < static_cast(tier2_gpr_5) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_5 != 0u; + aot_mem.aot_store32(tier2_gpr_29 + static_cast(48), tier2_gpr_4); if (branch_taken) { if (!rt.tier2_enter_fused_transfer<43u, 0x088B3FCCu>(ctx)) { ctx.pc = 0x088B3FCCu; @@ -716,10 +735,10 @@ SB_L_088B4110: 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); + tier2_gpr_4 = (aot_mem.aot_load16(tier2_gpr_19 + static_cast(50))); + tier2_gpr_4 = (static_cast(ctx.gpr[16]) < static_cast(tier2_gpr_4) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 == 0u; + tier2_gpr_17 = (0u | 0u); if (branch_taken) { goto SB_L_088B4208; } @@ -736,26 +755,26 @@ SB_L_088B412C: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(76))); + tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_17); + tier2_gpr_4 = (aot_mem.aot_load8(tier2_gpr_4 + static_cast(6))); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + tier2_gpr_5 = (tier2_gpr_4 ^ 7u); + tier2_gpr_5 = (tier2_gpr_5 < static_cast(1) ? 1u : 0u); + tier2_gpr_6 = (tier2_gpr_4 ^ 8u); + tier2_gpr_6 = (tier2_gpr_6 < static_cast(1) ? 1u : 0u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + tier2_gpr_6 = (tier2_gpr_4 ^ 16u); + tier2_gpr_6 = (tier2_gpr_6 < static_cast(1) ? 1u : 0u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + tier2_gpr_6 = (tier2_gpr_4 ^ 31u); + tier2_gpr_6 = (tier2_gpr_6 < static_cast(1) ? 1u : 0u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + tier2_gpr_4 = (tier2_gpr_4 ^ 12u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_5 | tier2_gpr_4); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_088B41F4; @@ -773,23 +792,23 @@ SB_L_088B4188: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(76))); + tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_17); + tier2_gpr_4 = (aot_mem.aot_load8(tier2_gpr_4 + static_cast(6))); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + tier2_gpr_5 = (tier2_gpr_4 ^ 8u); + tier2_gpr_5 = (tier2_gpr_5 < static_cast(1) ? 1u : 0u); + tier2_gpr_6 = (tier2_gpr_4 ^ 16u); + tier2_gpr_6 = (tier2_gpr_6 < static_cast(1) ? 1u : 0u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + tier2_gpr_6 = (tier2_gpr_4 ^ 31u); + tier2_gpr_6 = (tier2_gpr_6 < static_cast(1) ? 1u : 0u); + tier2_gpr_5 = (tier2_gpr_5 | tier2_gpr_6); + tier2_gpr_4 = (tier2_gpr_4 ^ 12u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_5 | tier2_gpr_4); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_088B41F4; @@ -798,13 +817,13 @@ SB_L_088B4190: } 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); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(72))); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(76))); + tier2_gpr_6 = (tier2_gpr_6 + tier2_gpr_17); + tier2_gpr_4 = (ctx.gpr[20] | 0u); ctx.gpr[7] = (ctx.gpr[23] | 0u); ctx.gpr[31] = (0x088B41F4u); - ctx.gpr[8] = (ctx.gpr[29] | 0u); + ctx.gpr[8] = (tier2_gpr_29 | 0u); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<43u, 0x088B18ECu>(ctx)) { ctx.pc = 0x088B18ECu; @@ -818,15 +837,15 @@ SB_L_088B41D8: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0043_entry, 43u, 210u, 0x088B18ECu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x088B41F4u) goto SB_L_088B41F4; TIER2_SB_RETURN(); SB_L_088B41F4: ctx.gpr[16] = (ctx.gpr[16] + static_cast(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)); + tier2_gpr_4 = (aot_mem.aot_load16(tier2_gpr_19 + static_cast(50))); + tier2_gpr_4 = (static_cast(ctx.gpr[16]) < static_cast(tier2_gpr_4) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 != 0u; + tier2_gpr_17 = (tier2_gpr_17 + static_cast(8)); if (branch_taken) { goto SB_L_088B412C; } @@ -834,12 +853,12 @@ SB_L_088B41F4: } SB_L_088B4208: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(56))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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.fpr[12] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_29 + static_cast(0))); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(tier2_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); @@ -851,8 +870,8 @@ SB_L_088B420C: } 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])); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_29 + static_cast(0))); + aot_mem.aot_store32(tier2_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) { @@ -867,12 +886,12 @@ SB_L_088B4234: SB_L_088B4238: { std::uint32_t tier2_words[11]{}; - if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(60), tier2_words)) { + if (aot_mem.aot_try_load32_block(tier2_gpr_29 + static_cast(60), tier2_words)) { ctx.fpr[20] = std::bit_cast(tier2_words[0]); ctx.gpr[16] = tier2_words[1]; - ctx.gpr[17] = tier2_words[2]; + tier2_gpr_17 = tier2_words[2]; ctx.gpr[18] = tier2_words[3]; - ctx.gpr[19] = tier2_words[4]; + tier2_gpr_19 = tier2_words[4]; ctx.gpr[20] = tier2_words[5]; ctx.gpr[21] = tier2_words[6]; ctx.gpr[22] = tier2_words[7]; @@ -880,25 +899,28 @@ SB_L_088B4238: ctx.gpr[30] = tier2_words[9]; ctx.gpr[31] = tier2_words[10]; } else { - 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))); + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_29 + static_cast(60))); + ctx.gpr[16] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(64))); + tier2_gpr_17 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(68))); + ctx.gpr[18] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(72))); + tier2_gpr_19 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(76))); + ctx.gpr[20] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(80))); + ctx.gpr[21] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(84))); + ctx.gpr[22] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(88))); + ctx.gpr[23] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(92))); + ctx.gpr[30] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(96))); + ctx.gpr[31] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(100))); } } jump_target = ctx.gpr[31]; - ctx.gpr[29] = (ctx.gpr[29] + static_cast(112)); + tier2_gpr_29 = (tier2_gpr_29 + static_cast(112)); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0044; - +// TIER2_GPR_BODY_END #undef TIER2_SB_RETURN +#undef TIER2_GPR_BEFORE_COLD +#undef TIER2_GPR_SYNC_IN +#undef TIER2_GPR_SYNC_OUT } } // namespace vcs diff --git a/profiles/vcs/host/vcs_tier2_cluster_entity.cpp b/profiles/vcs/host/vcs_tier2_cluster_entity.cpp index 475ecc1..f72055c 100644 --- a/profiles/vcs/host/vcs_tier2_cluster_entity.cpp +++ b/profiles/vcs/host/vcs_tier2_cluster_entity.cpp @@ -1,8 +1,9 @@ // AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: entity +// Tier-2 SUPERBLOCK V4 150FPS cluster: entity #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_fast_paths.hpp" #include @@ -27,8 +28,25 @@ void tier2_superblock_entity(psprecomp::Runtime &rt, std::uint32_t local_pc = 0u; std::uint32_t local_transfers = 0u; std::uint32_t entry_id = 0u; + std::uint32_t tier2_gpr_4 = ctx.gpr[4]; + std::uint32_t tier2_gpr_6 = ctx.gpr[6]; + std::uint32_t tier2_gpr_19 = ctx.gpr[19]; + std::uint32_t tier2_gpr_17 = ctx.gpr[17]; + std::uint32_t tier2_gpr_5 = ctx.gpr[5]; + std::uint32_t tier2_gpr_29 = ctx.gpr[29]; + bool tier2_gpr_shadow_valid = true; +#define TIER2_GPR_SYNC_OUT() do { if (tier2_gpr_shadow_valid) { ctx.gpr[4] = tier2_gpr_4; ctx.gpr[6] = tier2_gpr_6; ctx.gpr[19] = tier2_gpr_19; ctx.gpr[17] = tier2_gpr_17; ctx.gpr[5] = tier2_gpr_5; ctx.gpr[29] = tier2_gpr_29; } } while (false) +#define TIER2_GPR_SYNC_IN() do { if (tier2_gpr_shadow_valid) { tier2_gpr_4 = ctx.gpr[4]; tier2_gpr_6 = ctx.gpr[6]; tier2_gpr_19 = ctx.gpr[19]; tier2_gpr_17 = ctx.gpr[17]; tier2_gpr_5 = ctx.gpr[5]; tier2_gpr_29 = ctx.gpr[29]; } } while (false) +#define TIER2_GPR_BEFORE_COLD() do { TIER2_GPR_SYNC_OUT(); tier2_gpr_shadow_valid = false; } while (false) -#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) + auto tier2_complete_shadow = [&](std::uint32_t count) -> bool { + TIER2_GPR_SYNC_OUT(); + const bool same = rt.tier2_complete_fused_transfers(ctx, count); + if (!same) tier2_gpr_shadow_valid = false; + return same; + }; + +#define TIER2_SB_RETURN() do { TIER2_GPR_SYNC_OUT(); tier2_scope.finish(); /* Unwind every logical invoke_chained_direct frame in true LIFO order. Tail frames created inside a fused JAL unwind before that JAL; outer JAL frames are also released after context invalidation. */ while (tier2_return_depth != 0u) { std::uint32_t tier2_base_ = tier2_return_pending_base[tier2_return_depth - 1u]; if (tier2_base_ > tier2_pending_transfers) { ++tier2_stats.fallbacks; tier2_base_ = tier2_pending_transfers; } const std::uint32_t tier2_tail_count_ = tier2_pending_transfers - tier2_base_; tier2_pending_transfers = tier2_base_; if (tier2_tail_count_ != 0u) (void)tier2_complete_shadow(tier2_tail_count_); --tier2_return_depth; (void)tier2_complete_shadow(1u); } if (tier2_pending_transfers != 0u) { (void)tier2_complete_shadow(tier2_pending_transfers); tier2_pending_transfers = 0u; } return; } while (false) goto TIER2_ENTRY_DISPATCH; @@ -158,11 +176,11 @@ TIER2_LOCAL_DISPATCH_U0152: 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)) + if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; - if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; @@ -196,11 +214,11 @@ TIER2_LOCAL_DISPATCH_U0153: 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)) + if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; - if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; @@ -237,11 +255,11 @@ TIER2_LOCAL_DISPATCH_U0154: 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)) + if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; - if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; @@ -331,11 +349,11 @@ TIER2_LOCAL_DISPATCH_U0155: 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)) + if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; - if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; @@ -389,19 +407,20 @@ TIER2_ENTRY_DISPATCH: TIER2_SB_RETURN(); } +// TIER2_GPR_BODY_BEGIN 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); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + ctx.gpr[2] = (tier2_gpr_4 ^ 6u); jump_target = ctx.gpr[31]; ctx.gpr[2] = (ctx.gpr[2] < static_cast(1) ? 1u : 0u); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0152; SB_L_08A65EB4: - 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); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + ctx.gpr[2] = (tier2_gpr_4 ^ 8u); jump_target = ctx.gpr[31]; ctx.gpr[2] = (ctx.gpr[2] < static_cast(1) ? 1u : 0u); local_pc = jump_target; @@ -409,39 +428,39 @@ SB_L_08A65EB4: SB_L_08A68CBC: jump_target = ctx.gpr[31]; - ctx.gpr[2] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(444))); + ctx.gpr[2] = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(444))); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0153; SB_L_08A68CC4: jump_target = ctx.gpr[31]; - aot_mem.aot_store32(ctx.gpr[4] + static_cast(444), ctx.gpr[5]); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(444), tier2_gpr_5); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0153; SB_L_08A68CCC: jump_target = ctx.gpr[31]; - ctx.gpr[2] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(448))); + ctx.gpr[2] = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(448))); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0153; SB_L_08A68CD4: jump_target = ctx.gpr[31]; - ctx.gpr[2] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(2116))); + ctx.gpr[2] = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(2116))); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0153; SB_L_08A68CDC: jump_target = ctx.gpr[31]; - aot_mem.aot_store32(ctx.gpr[4] + static_cast(2116), ctx.gpr[5]); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(2116), tier2_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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(1600))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(0))); + { const bool branch_taken = tier2_gpr_4 == 0u; + aot_mem.aot_store32(tier2_gpr_29 + static_cast(1576), tier2_gpr_4); if (branch_taken) { if (!rt.tier2_enter_fused_transfer<155u, 0x08A711ECu>(ctx)) { ctx.pc = 0x08A711ECu; @@ -455,23 +474,23 @@ SB_L_08A6E894: } 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(1576))); + tier2_gpr_17 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(0))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(8))); + tier2_gpr_6 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(8428))); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(1576), tier2_gpr_4); + tier2_gpr_5 = (0u | 3u); + tier2_gpr_4 = (48972u << 16u); + tier2_gpr_4 = (tier2_gpr_4 | 52429u); + ctx.fpr[20] = std::bit_cast(tier2_gpr_4); ctx.gpr[8] = (0u | 58u); - ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(1588))); + ctx.gpr[21] = (aot_mem.aot_load32(tier2_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]); + tier2_gpr_4 = (16168u << 16u); + tier2_gpr_4 = (tier2_gpr_4 | 62915u); + { const bool branch_taken = tier2_gpr_19 == tier2_gpr_6; + ctx.fpr[12] = std::bit_cast(tier2_gpr_4); if (branch_taken) { goto SB_L_08A6E8F4; } @@ -479,8 +498,8 @@ SB_L_08A6E8A4: } 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]; + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(8428))); + { const bool branch_taken = tier2_gpr_17 != tier2_gpr_4; ctx.gpr[23] = (0u | 1u); if (branch_taken) { goto SB_L_08A6E8FC; @@ -504,12 +523,12 @@ SB_L_08A6E8F4: } 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; + tier2_gpr_4 = (ctx.gpr[23] | 0u); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(72))); + tier2_gpr_6 = (tier2_gpr_6 & 512u); + tier2_gpr_6 = (0u < tier2_gpr_6 ? 1u : 0u); + tier2_gpr_6 = (tier2_gpr_6 & 255u); + { const bool branch_taken = tier2_gpr_6 == 0u; // nop if (branch_taken) { if (!rt.tier2_enter_fused_transfer<155u, 0x08A71100u>(ctx)) { @@ -524,9 +543,9 @@ SB_L_08A6E8FC: } SB_L_08A6E918: - ctx.gpr[6] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(84))); + tier2_gpr_6 = (aot_mem.aot_load16(tier2_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]; + { const bool branch_taken = tier2_gpr_6 == ctx.gpr[7]; // nop if (branch_taken) { if (!rt.tier2_enter_fused_transfer<155u, 0x08A71100u>(ctx)) { @@ -541,7 +560,7 @@ SB_L_08A6E918: } SB_L_08A6E928: - { const bool branch_taken = ctx.gpr[17] == ctx.gpr[19]; + { const bool branch_taken = tier2_gpr_17 == tier2_gpr_19; // nop if (branch_taken) { if (!rt.tier2_enter_fused_transfer<155u, 0x08A71100u>(ctx)) { @@ -556,13 +575,13 @@ SB_L_08A6E928: } 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); + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_17 + static_cast(86)))))); + tier2_gpr_4 = (tier2_gpr_4 << 2u); + tier2_gpr_6 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); + tier2_gpr_4 = (tier2_gpr_6 + tier2_gpr_4); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(0))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(20))); + { const std::uint32_t vfpu_address = tier2_gpr_17 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -570,7 +589,7 @@ SB_L_08A6E930: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast(16); + { const std::uint32_t vfpu_address = tier2_gpr_17 + static_cast(16); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -578,7 +597,7 @@ SB_L_08A6E930: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast(32); + { const std::uint32_t vfpu_address = tier2_gpr_17 + static_cast(32); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -586,7 +605,7 @@ SB_L_08A6E930: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast(48); + { const std::uint32_t vfpu_address = tier2_gpr_17 + static_cast(48); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -594,7 +613,7 @@ SB_L_08A6E930: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<3u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -606,8 +625,8 @@ SB_L_08A6E930: 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); + tier2_gpr_4 = (tier2_gpr_29 + static_cast(32)); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -622,10 +641,14 @@ SB_L_08A6E930: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -654,7 +677,7 @@ SB_L_08A6E930: 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); + tier2_gpr_4 = (0u | 0u); { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 0u) & 1u) != 0u; // vflush: architectural no-op that retains VFPU prefixes if (branch_taken) { @@ -664,13 +687,13 @@ SB_L_08A6E930: } SB_L_08A6E990: - ctx.gpr[4] = (0u + static_cast(1)); - ctx.gpr[4] = (ctx.gpr[4] & 255u); + tier2_gpr_4 = (0u + static_cast(1)); + tier2_gpr_4 = (tier2_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; + tier2_gpr_6 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_6 == 0u; // nop if (branch_taken) { if (!rt.tier2_enter_fused_transfer<155u, 0x08A71100u>(ctx)) { @@ -685,18 +708,18 @@ SB_L_08A6E998: } 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]); + tier2_gpr_4 = (0u + static_cast(-4097)); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(236))); + tier2_gpr_4 = (tier2_gpr_6 & tier2_gpr_4); + aot_mem.aot_store32(tier2_gpr_19 + static_cast(236), tier2_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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 2u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6E9E0; @@ -708,18 +731,18 @@ 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(); + ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); } goto SB_L_08A6E9E0; } SB_L_08A6E9E0: - 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 8u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6EA78; @@ -728,11 +751,11 @@ SB_L_08A6E9E0: } 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; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load8(tier2_gpr_19 + static_cast(483)))))); + tier2_gpr_4 = (tier2_gpr_4 & 2u); + tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6EA78; @@ -741,24 +764,24 @@ SB_L_08A6E9FC: } 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))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 4u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + if (tier2_gpr_4 != 0u) { + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(tier2_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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 6u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6EA78; @@ -767,7 +790,7 @@ SB_L_08A6EA30: } SB_L_08A6EA4C: - ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[19] + static_cast(40))); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_19 + static_cast(40))); goto SB_L_08A6EA50; SB_L_08A6EA50: @@ -783,24 +806,24 @@ SB_L_08A6EA50: 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(236))); + tier2_gpr_4 = (tier2_gpr_4 | 4096u); + aot_mem.aot_store32(tier2_gpr_19 + static_cast(236), tier2_gpr_4); { const bool branch_taken = 0u == 0u; - aot_mem.aot_store32(ctx.gpr[19] + static_cast(444), ctx.gpr[17]); + aot_mem.aot_store32(tier2_gpr_19 + static_cast(444), tier2_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(); + ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); } goto SB_L_08A6EA78; } SB_L_08A6EA78: - 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 8u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6EB10; @@ -809,11 +832,11 @@ SB_L_08A6EA78: } 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; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load8(tier2_gpr_17 + static_cast(483)))))); + tier2_gpr_4 = (tier2_gpr_4 & 2u); + tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6EB10; @@ -822,24 +845,24 @@ SB_L_08A6EA94: } 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))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 4u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + if (tier2_gpr_4 != 0u) { + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(tier2_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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 6u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6EB10; @@ -848,7 +871,7 @@ SB_L_08A6EAC8: } SB_L_08A6EAE4: - ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(40))); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_17 + static_cast(40))); goto SB_L_08A6EAE8; SB_L_08A6EAE8: @@ -864,24 +887,24 @@ SB_L_08A6EAE8: 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(236))); + tier2_gpr_4 = (tier2_gpr_4 | 4096u); + aot_mem.aot_store32(tier2_gpr_19 + static_cast(236), tier2_gpr_4); { const bool branch_taken = 0u == 0u; - aot_mem.aot_store32(ctx.gpr[17] + static_cast(444), ctx.gpr[19]); + aot_mem.aot_store32(tier2_gpr_17 + static_cast(444), tier2_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(); + ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); } goto SB_L_08A6EB10; } SB_L_08A6EB10: - 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 8u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6EB78; @@ -890,9 +913,9 @@ SB_L_08A6EB10: } 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]; + tier2_gpr_6 = (aot_mem.aot_load8(tier2_gpr_19 + static_cast(474))); + tier2_gpr_4 = (0u | 4u); + { const bool branch_taken = tier2_gpr_6 != tier2_gpr_4; // nop if (branch_taken) { goto SB_L_08A6EB78; @@ -901,12 +924,12 @@ SB_L_08A6EB2C: } 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; + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(72))); + tier2_gpr_6 = (tier2_gpr_6 & 14u); + tier2_gpr_6 = (tier2_gpr_6 ^ 8u); + tier2_gpr_6 = (tier2_gpr_6 < static_cast(1) ? 1u : 0u); + tier2_gpr_6 = (tier2_gpr_6 & 255u); + { const bool branch_taken = tier2_gpr_6 == 0u; // nop if (branch_taken) { goto SB_L_08A6EB78; @@ -915,8 +938,8 @@ SB_L_08A6EB3C: } 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]; + tier2_gpr_6 = (aot_mem.aot_load8(tier2_gpr_17 + static_cast(474))); + { const bool branch_taken = tier2_gpr_6 != tier2_gpr_4; // nop if (branch_taken) { goto SB_L_08A6EB78; @@ -926,48 +949,48 @@ SB_L_08A6EB58: 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); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(236))); + tier2_gpr_4 = (tier2_gpr_4 | 4096u); { const bool branch_taken = 0u == 0u; - aot_mem.aot_store32(ctx.gpr[19] + static_cast(236), ctx.gpr[4]); + aot_mem.aot_store32(tier2_gpr_19 + static_cast(236), tier2_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(); + ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); } goto SB_L_08A6EB78; } SB_L_08A6EB78: - 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_19 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 8u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { - ++tier2_stats.cold_exits; tier2_scope.finish(); psprecomp::recomp_unit_0154_entry(rt, ctx, 301u, aot_mem); TIER2_SB_RETURN(); + ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 301u, aot_mem); TIER2_SB_RETURN(); } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_17 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 4u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { - ++tier2_stats.cold_exits; tier2_scope.finish(); psprecomp::recomp_unit_0154_entry(rt, ctx, 301u, aot_mem); TIER2_SB_RETURN(); + ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 301u, aot_mem); TIER2_SB_RETURN(); } 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]; + ctx.gpr[16] = (tier2_gpr_19 | 0u); + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[16] + static_cast(86)))))); + { const bool branch_taken = tier2_gpr_4 != ctx.gpr[10]; // nop if (branch_taken) { goto SB_L_08A6EBC8; @@ -985,8 +1008,8 @@ SB_L_08A6EBC0: } 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]; + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(476))); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A6EC1C; @@ -995,11 +1018,11 @@ SB_L_08A6EBC8: } 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]; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[16] + static_cast(482)))))); + tier2_gpr_4 = (tier2_gpr_4 & 64u); + tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == ctx.gpr[23]; // nop if (branch_taken) { goto SB_L_08A6EC1C; @@ -1008,10 +1031,10 @@ SB_L_08A6EBD4: } 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); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(72))); + tier2_gpr_5 = (tier2_gpr_5 & 2048u); + { const bool branch_taken = tier2_gpr_5 != 0u; + tier2_gpr_4 = (0u | 0u); if (branch_taken) { goto SB_L_08A6EC0C; } @@ -1019,10 +1042,10 @@ SB_L_08A6EBEC: } 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); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + tier2_gpr_5 = (tier2_gpr_5 & 2048u); + { const bool branch_taken = tier2_gpr_5 == 0u; + tier2_gpr_4 = (tier2_gpr_4 & 255u); if (branch_taken) { goto SB_L_08A6EC14; } @@ -1030,12 +1053,12 @@ SB_L_08A6EBFC: } SB_L_08A6EC0C: - ctx.gpr[4] = (ctx.gpr[23] | 0u); - ctx.gpr[4] = (ctx.gpr[4] & 255u); + tier2_gpr_4 = (ctx.gpr[23] | 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); goto SB_L_08A6EC14; SB_L_08A6EC14: - { const bool branch_taken = ctx.gpr[4] != 0u; + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A6ED90; @@ -1044,8 +1067,8 @@ SB_L_08A6EC14: } 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]; + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(444))); + { const bool branch_taken = tier2_gpr_4 != tier2_gpr_17; // nop if (branch_taken) { goto SB_L_08A6EC30; @@ -1063,9 +1086,9 @@ SB_L_08A6EC28: } 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; + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(473))); + tier2_gpr_4 = (static_cast(tier2_gpr_4) < 3 ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6ED90; @@ -1074,15 +1097,15 @@ SB_L_08A6EC30: } 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); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(128), 0u); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(136))); + tier2_gpr_4 = (tier2_gpr_4 & ctx.gpr[9]); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(136), tier2_gpr_4); + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_19 + static_cast(86)))))); + tier2_gpr_6 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); + tier2_gpr_6 = (static_cast(tier2_gpr_4) < static_cast(tier2_gpr_6) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_6 == 0u; + tier2_gpr_5 = (0u | 0u); if (branch_taken) { goto SB_L_08A6EC74; } @@ -1090,20 +1113,20 @@ SB_L_08A6EC40: } 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))); + tier2_gpr_4 = (tier2_gpr_4 << 2u); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); + tier2_gpr_4 = (tier2_gpr_5 + tier2_gpr_4); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_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] = (aot_mem.aot_load32(tier2_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); + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_19 + static_cast(86)))))); + tier2_gpr_6 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); + tier2_gpr_6 = (static_cast(tier2_gpr_4) < static_cast(tier2_gpr_6) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_6 == 0u; + tier2_gpr_5 = (0u | 0u); if (branch_taken) { goto SB_L_08A6ECA0; } @@ -1111,15 +1134,15 @@ SB_L_08A6EC74: } 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))); + tier2_gpr_4 = (tier2_gpr_4 << 2u); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); + tier2_gpr_4 = (tier2_gpr_5 + tier2_gpr_4); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_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)); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_5 + static_cast(20))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(16)); { const std::uint32_t vfpu_address = ctx.gpr[8] + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ @@ -1128,7 +1151,7 @@ SB_L_08A6ECA0: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -1141,7 +1164,7 @@ SB_L_08A6ECA0: 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)); + ctx.gpr[21] = (tier2_gpr_29 + static_cast(144)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); const std::uint32_t tier2_vfpu_words[4]{std::bit_cast(vfpu_value[0]), std::bit_cast(vfpu_value[1]), std::bit_cast(vfpu_value[2]), std::bit_cast(vfpu_value[3])}; @@ -1154,7 +1177,7 @@ SB_L_08A6ECA0: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast(0); + { const std::uint32_t vfpu_address = tier2_gpr_19 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -1162,7 +1185,7 @@ SB_L_08A6ECA0: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast(16); + { const std::uint32_t vfpu_address = tier2_gpr_19 + static_cast(16); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -1170,7 +1193,7 @@ SB_L_08A6ECA0: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast(32); + { const std::uint32_t vfpu_address = tier2_gpr_19 + static_cast(32); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -1178,7 +1201,7 @@ SB_L_08A6ECA0: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } - { const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast(48); + { const std::uint32_t vfpu_address = tier2_gpr_19 + static_cast(48); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -1193,10 +1216,14 @@ SB_L_08A6ECA0: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -1213,12 +1240,12 @@ SB_L_08A6ECA0: 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)); + tier2_gpr_4 = (tier2_gpr_29 + static_cast(48)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); - const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); const std::uint32_t tier2_vfpu_words[4]{std::bit_cast(vfpu_value[0]), std::bit_cast(vfpu_value[1]), std::bit_cast(vfpu_value[2]), std::bit_cast(vfpu_value[3])}; aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); } - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -1230,9 +1257,9 @@ SB_L_08A6ECA0: const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); const std::uint32_t tier2_vfpu_words[4]{std::bit_cast(vfpu_value[0]), std::bit_cast(vfpu_value[1]), std::bit_cast(vfpu_value[2]), std::bit_cast(vfpu_value[3])}; aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); } - 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.fpr[12] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_29 + static_cast(152))); + tier2_gpr_4 = (tier2_gpr_17 + static_cast(48)); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_4 + static_cast(8))); ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[13])) ? 0x00800000u : 0u); // nop { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); @@ -1246,7 +1273,7 @@ SB_L_08A6ECA0: 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]); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(444), tier2_gpr_17); if (branch_taken) { goto SB_L_08A6ED6C; } @@ -1254,18 +1281,18 @@ SB_L_08A6ED04: } SB_L_08A6ED10: - ctx.gpr[30] = (ctx.gpr[29] + static_cast(64)); - ctx.gpr[4] = (ctx.gpr[17] | 0u); + ctx.gpr[30] = (tier2_gpr_29 + static_cast(64)); + tier2_gpr_4 = (tier2_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_gpr_5 = (ctx.gpr[30] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0022_entry, 22u, 934u, 0x0885FE8Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A6ED20u) goto SB_L_08A6ED20; TIER2_SB_RETURN(); SB_L_08A6ED20: - ctx.gpr[4] = (ctx.gpr[30] | 0u); + tier2_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_gpr_5 = (ctx.gpr[2] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 7u, 0x08860358u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A6ED2Cu) goto SB_L_08A6ED2C; TIER2_SB_RETURN(); SB_L_08A6ED2C: @@ -1316,10 +1343,14 @@ SB_L_08A6ED2C: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -1336,12 +1367,12 @@ SB_L_08A6ED2C: 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)); + tier2_gpr_4 = (tier2_gpr_29 + static_cast(160)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); - const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); const std::uint32_t tier2_vfpu_words[4]{std::bit_cast(vfpu_value[0]), std::bit_cast(vfpu_value[1]), std::bit_cast(vfpu_value[2]), std::bit_cast(vfpu_value[3])}; aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); } - ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(168))); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_29 + static_cast(168))); ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[26])) ? 0x00800000u : 0u); // nop { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); @@ -1354,13 +1385,13 @@ SB_L_08A6ED2C: SB_L_08A6ED64: ctx.gpr[18] = (ctx.gpr[23] | 0u); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(444), ctx.gpr[17]); + aot_mem.aot_store32(ctx.gpr[16] + static_cast(444), tier2_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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(136))); + tier2_gpr_4 = (tier2_gpr_4 & 1u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6ED90; @@ -1369,8 +1400,8 @@ SB_L_08A6ED6C: } SB_L_08A6ED7C: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(128))); - { const bool branch_taken = ctx.gpr[4] == 0u; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(128))); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A6ED90; @@ -1380,21 +1411,21 @@ SB_L_08A6ED7C: 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_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(128))); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0117_entry, 117u, 129u, 0x089D89E0u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A6ED90u) goto SB_L_08A6ED90; TIER2_SB_RETURN(); SB_L_08A6ED90: { const bool branch_taken = 0u == 0u; // nop if (branch_taken) { - ++tier2_stats.cold_exits; tier2_scope.finish(); psprecomp::recomp_unit_0154_entry(rt, ctx, 388u, aot_mem); TIER2_SB_RETURN(); + ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 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(); + ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0154_entry(rt, ctx, 301u, aot_mem); TIER2_SB_RETURN(); } SB_L_08A71100: - { const bool branch_taken = ctx.gpr[4] != 0u; + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A711E0; @@ -1404,7 +1435,7 @@ SB_L_08A71100: SB_L_08A71108: ctx.gpr[31] = (0x08A71110u); - ctx.gpr[4] = (ctx.gpr[19] | 0u); + tier2_gpr_4 = (tier2_gpr_19 | 0u); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<152u, 0x08A65EB4u>(ctx)) { ctx.pc = 0x08A65EB4u; @@ -1418,7 +1449,7 @@ SB_L_08A71108: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0152_entry, 152u, 433u, 0x08A65EB4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A71110u) goto SB_L_08A71110; TIER2_SB_RETURN(); SB_L_08A71110: @@ -1432,7 +1463,7 @@ SB_L_08A71110: SB_L_08A71118: ctx.gpr[31] = (0x08A71120u); - ctx.gpr[4] = (ctx.gpr[19] | 0u); + tier2_gpr_4 = (tier2_gpr_19 | 0u); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CBCu>(ctx)) { ctx.pc = 0x08A68CBCu; @@ -1446,11 +1477,11 @@ SB_L_08A71118: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 100u, 0x08A68CBCu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A71120u) goto SB_L_08A71120; TIER2_SB_RETURN(); SB_L_08A71120: - { const bool branch_taken = ctx.gpr[2] != ctx.gpr[17]; + { const bool branch_taken = ctx.gpr[2] != tier2_gpr_17; // nop if (branch_taken) { goto SB_L_08A7113C; @@ -1459,9 +1490,9 @@ SB_L_08A71120: } SB_L_08A71128: - ctx.gpr[4] = (ctx.gpr[19] | 0u); + tier2_gpr_4 = (tier2_gpr_19 | 0u); ctx.gpr[31] = (0x08A71134u); - ctx.gpr[5] = (0u | 0u); + tier2_gpr_5 = (0u | 0u); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CC4u>(ctx)) { ctx.pc = 0x08A68CC4u; @@ -1475,7 +1506,7 @@ SB_L_08A71128: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 101u, 0x08A68CC4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A71134u) goto SB_L_08A71134; TIER2_SB_RETURN(); SB_L_08A71134: @@ -1489,7 +1520,7 @@ SB_L_08A71134: SB_L_08A7113C: ctx.gpr[31] = (0x08A71144u); - ctx.gpr[4] = (ctx.gpr[17] | 0u); + tier2_gpr_4 = (tier2_gpr_17 | 0u); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<152u, 0x08A65EB4u>(ctx)) { ctx.pc = 0x08A65EB4u; @@ -1503,7 +1534,7 @@ SB_L_08A7113C: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0152_entry, 152u, 433u, 0x08A65EB4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A71144u) goto SB_L_08A71144; TIER2_SB_RETURN(); SB_L_08A71144: @@ -1517,7 +1548,7 @@ SB_L_08A71144: SB_L_08A7114C: ctx.gpr[31] = (0x08A71154u); - ctx.gpr[4] = (ctx.gpr[17] | 0u); + tier2_gpr_4 = (tier2_gpr_17 | 0u); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CBCu>(ctx)) { ctx.pc = 0x08A68CBCu; @@ -1531,11 +1562,11 @@ SB_L_08A7114C: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 100u, 0x08A68CBCu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A71154u) goto SB_L_08A71154; TIER2_SB_RETURN(); SB_L_08A71154: - { const bool branch_taken = ctx.gpr[2] != ctx.gpr[19]; + { const bool branch_taken = ctx.gpr[2] != tier2_gpr_19; // nop if (branch_taken) { goto SB_L_08A71180; @@ -1545,7 +1576,7 @@ SB_L_08A71154: SB_L_08A7115C: ctx.gpr[31] = (0x08A71164u); - ctx.gpr[4] = (ctx.gpr[17] | 0u); + tier2_gpr_4 = (tier2_gpr_17 | 0u); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CCCu>(ctx)) { ctx.pc = 0x08A68CCCu; @@ -1559,11 +1590,11 @@ SB_L_08A7115C: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 102u, 0x08A68CCCu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A71164u) goto SB_L_08A71164; TIER2_SB_RETURN(); SB_L_08A71164: - { const bool branch_taken = ctx.gpr[2] == ctx.gpr[19]; + { const bool branch_taken = ctx.gpr[2] == tier2_gpr_19; // nop if (branch_taken) { goto SB_L_08A71180; @@ -1572,9 +1603,9 @@ SB_L_08A71164: } SB_L_08A7116C: - ctx.gpr[4] = (ctx.gpr[17] | 0u); + tier2_gpr_4 = (tier2_gpr_17 | 0u); ctx.gpr[31] = (0x08A71178u); - ctx.gpr[5] = (0u | 0u); + tier2_gpr_5 = (0u | 0u); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CC4u>(ctx)) { ctx.pc = 0x08A68CC4u; @@ -1588,7 +1619,7 @@ SB_L_08A7116C: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 101u, 0x08A68CC4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A71178u) goto SB_L_08A71178; TIER2_SB_RETURN(); SB_L_08A71178: @@ -1602,7 +1633,7 @@ SB_L_08A71178: SB_L_08A71180: ctx.gpr[31] = (0x08A71188u); - ctx.gpr[4] = (ctx.gpr[19] | 0u); + tier2_gpr_4 = (tier2_gpr_19 | 0u); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<152u, 0x08A65EA0u>(ctx)) { ctx.pc = 0x08A65EA0u; @@ -1616,7 +1647,7 @@ SB_L_08A71180: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0152_entry, 152u, 432u, 0x08A65EA0u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A71188u) goto SB_L_08A71188; TIER2_SB_RETURN(); SB_L_08A71188: @@ -1630,7 +1661,7 @@ SB_L_08A71188: SB_L_08A71190: ctx.gpr[31] = (0x08A71198u); - ctx.gpr[4] = (ctx.gpr[19] | 0u); + tier2_gpr_4 = (tier2_gpr_19 | 0u); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CD4u>(ctx)) { ctx.pc = 0x08A68CD4u; @@ -1644,11 +1675,11 @@ SB_L_08A71190: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 103u, 0x08A68CD4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A71198u) goto SB_L_08A71198; TIER2_SB_RETURN(); SB_L_08A71198: - { const bool branch_taken = ctx.gpr[2] != ctx.gpr[17]; + { const bool branch_taken = ctx.gpr[2] != tier2_gpr_17; // nop if (branch_taken) { goto SB_L_08A711B4; @@ -1657,9 +1688,9 @@ SB_L_08A71198: } SB_L_08A711A0: - ctx.gpr[4] = (ctx.gpr[19] | 0u); + tier2_gpr_4 = (tier2_gpr_19 | 0u); ctx.gpr[31] = (0x08A711ACu); - ctx.gpr[5] = (0u | 0u); + tier2_gpr_5 = (0u | 0u); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CDCu>(ctx)) { ctx.pc = 0x08A68CDCu; @@ -1673,7 +1704,7 @@ SB_L_08A711A0: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 104u, 0x08A68CDCu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A711ACu) goto SB_L_08A711AC; TIER2_SB_RETURN(); SB_L_08A711AC: @@ -1687,7 +1718,7 @@ SB_L_08A711AC: SB_L_08A711B4: ctx.gpr[31] = (0x08A711BCu); - ctx.gpr[4] = (ctx.gpr[17] | 0u); + tier2_gpr_4 = (tier2_gpr_17 | 0u); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<152u, 0x08A65EA0u>(ctx)) { ctx.pc = 0x08A65EA0u; @@ -1701,7 +1732,7 @@ SB_L_08A711B4: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0152_entry, 152u, 432u, 0x08A65EA0u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A711BCu) goto SB_L_08A711BC; TIER2_SB_RETURN(); SB_L_08A711BC: @@ -1715,7 +1746,7 @@ SB_L_08A711BC: SB_L_08A711C4: ctx.gpr[31] = (0x08A711CCu); - ctx.gpr[4] = (ctx.gpr[17] | 0u); + tier2_gpr_4 = (tier2_gpr_17 | 0u); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CD4u>(ctx)) { ctx.pc = 0x08A68CD4u; @@ -1729,11 +1760,11 @@ SB_L_08A711C4: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 103u, 0x08A68CD4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A711CCu) goto SB_L_08A711CC; TIER2_SB_RETURN(); SB_L_08A711CC: - { const bool branch_taken = ctx.gpr[2] != ctx.gpr[19]; + { const bool branch_taken = ctx.gpr[2] != tier2_gpr_19; // nop if (branch_taken) { goto SB_L_08A711E0; @@ -1742,9 +1773,9 @@ SB_L_08A711CC: } SB_L_08A711D4: - ctx.gpr[4] = (ctx.gpr[17] | 0u); + tier2_gpr_4 = (tier2_gpr_17 | 0u); ctx.gpr[31] = (0x08A711E0u); - ctx.gpr[5] = (0u | 0u); + tier2_gpr_5 = (0u | 0u); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<153u, 0x08A68CDCu>(ctx)) { ctx.pc = 0x08A68CDCu; @@ -1758,12 +1789,12 @@ SB_L_08A711D4: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0153_entry, 153u, 104u, 0x08A68CDCu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(1576))); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { if (!rt.tier2_enter_fused_transfer<154u, 0x08A6E8A4u>(ctx)) { @@ -1778,15 +1809,15 @@ SB_L_08A711E0: } 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(1600))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(4)); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(1596))); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(1600), tier2_gpr_4); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(1604))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(-1)); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(1596), tier2_gpr_4); + { const bool branch_taken = tier2_gpr_5 != 0u; + aot_mem.aot_store32(tier2_gpr_29 + static_cast(1604), tier2_gpr_4); if (branch_taken) { if (!rt.tier2_enter_fused_transfer<154u, 0x08A6E894u>(ctx)) { ctx.pc = 0x08A6E894u; @@ -1801,10 +1832,13 @@ SB_L_08A711EC: 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(); - + ++tier2_stats.cold_exits; tier2_scope.finish(); TIER2_GPR_BEFORE_COLD(); psprecomp::recomp_unit_0155_entry(rt, ctx, 269u, aot_mem); TIER2_SB_RETURN(); +// TIER2_GPR_BODY_END #undef TIER2_SB_RETURN +#undef TIER2_GPR_BEFORE_COLD +#undef TIER2_GPR_SYNC_IN +#undef TIER2_GPR_SYNC_OUT } } // namespace vcs diff --git a/profiles/vcs/host/vcs_tier2_cluster_geometry.cpp b/profiles/vcs/host/vcs_tier2_cluster_geometry.cpp index 09cd516..46f3323 100644 --- a/profiles/vcs/host/vcs_tier2_cluster_geometry.cpp +++ b/profiles/vcs/host/vcs_tier2_cluster_geometry.cpp @@ -1,8 +1,9 @@ // AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: geometry +// Tier-2 SUPERBLOCK V4 150FPS cluster: geometry #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_fast_paths.hpp" #include @@ -27,8 +28,19 @@ void tier2_superblock_geometry(psprecomp::Runtime &rt, std::uint32_t local_pc = 0u; std::uint32_t local_transfers = 0u; std::uint32_t entry_id = 0u; + bool tier2_gpr_shadow_valid = true; +#define TIER2_GPR_SYNC_OUT() do {} while (false) +#define TIER2_GPR_SYNC_IN() do {} while (false) +#define TIER2_GPR_BEFORE_COLD() do { tier2_gpr_shadow_valid = false; } while (false) -#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) + auto tier2_complete_shadow = [&](std::uint32_t count) -> bool { + TIER2_GPR_SYNC_OUT(); + const bool same = rt.tier2_complete_fused_transfers(ctx, count); + if (!same) tier2_gpr_shadow_valid = false; + return same; + }; + +#define TIER2_SB_RETURN() do { TIER2_GPR_SYNC_OUT(); tier2_scope.finish(); /* Unwind every logical invoke_chained_direct frame in true LIFO order. Tail frames created inside a fused JAL unwind before that JAL; outer JAL frames are also released after context invalidation. */ while (tier2_return_depth != 0u) { std::uint32_t tier2_base_ = tier2_return_pending_base[tier2_return_depth - 1u]; if (tier2_base_ > tier2_pending_transfers) { ++tier2_stats.fallbacks; tier2_base_ = tier2_pending_transfers; } const std::uint32_t tier2_tail_count_ = tier2_pending_transfers - tier2_base_; tier2_pending_transfers = tier2_base_; if (tier2_tail_count_ != 0u) (void)tier2_complete_shadow(tier2_tail_count_); --tier2_return_depth; (void)tier2_complete_shadow(1u); } if (tier2_pending_transfers != 0u) { (void)tier2_complete_shadow(tier2_pending_transfers); tier2_pending_transfers = 0u; } return; } while (false) goto TIER2_ENTRY_DISPATCH; @@ -443,11 +455,11 @@ TIER2_LOCAL_DISPATCH_U0084: 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)) + if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; - if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; @@ -539,11 +551,11 @@ TIER2_LOCAL_DISPATCH_U0085: 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)) + if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; - if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; @@ -886,6 +898,7 @@ TIER2_ENTRY_DISPATCH: TIER2_SB_RETURN(); } +// TIER2_GPR_BODY_BEGIN 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))); @@ -905,10 +918,14 @@ SB_L_08955444: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -1043,10 +1060,14 @@ SB_L_0895554C: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -1638,25 +1659,13 @@ SB_L_08957500: { 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; - } - } + psprecomp::vcs_tier2_mat4_mul_ordered(vfpu_s, vfpu_t, vfpu_d); 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; - } - } + psprecomp::vcs_tier2_mat4_mul_ordered(vfpu_s, vfpu_t, vfpu_d); ctx.write_vfpu_matrix_ct<16u, 4u>(vfpu_d); ctx.eat_vfpu_prefixes(); } ctx.execute_vfpu_vcmp_ct<52u, 31u, 3u, 6u>(); @@ -2377,10 +2386,14 @@ SB_L_08959118: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -3434,10 +3447,14 @@ SB_L_089598B0: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -3550,10 +3567,14 @@ SB_L_08959930: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -4071,10 +4092,14 @@ SB_L_08959BF0: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -4265,10 +4290,14 @@ SB_L_08959CD8: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -4793,10 +4822,14 @@ SB_L_0895A03C: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -6900,9 +6933,12 @@ SB_L_0895B33C: ctx.gpr[29] = (ctx.gpr[29] + static_cast(144)); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0085; - +// TIER2_GPR_BODY_END #undef TIER2_SB_RETURN +#undef TIER2_GPR_BEFORE_COLD +#undef TIER2_GPR_SYNC_IN +#undef TIER2_GPR_SYNC_OUT } } // namespace vcs diff --git a/profiles/vcs/host/vcs_tier2_cluster_matrix.cpp b/profiles/vcs/host/vcs_tier2_cluster_matrix.cpp index 24ec5ea..746ad0d 100644 --- a/profiles/vcs/host/vcs_tier2_cluster_matrix.cpp +++ b/profiles/vcs/host/vcs_tier2_cluster_matrix.cpp @@ -1,8 +1,9 @@ // AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: matrix +// Tier-2 SUPERBLOCK V4 150FPS cluster: matrix #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_fast_paths.hpp" #include @@ -27,8 +28,19 @@ void tier2_superblock_matrix(psprecomp::Runtime &rt, std::uint32_t local_pc = 0u; std::uint32_t local_transfers = 0u; std::uint32_t entry_id = 0u; + bool tier2_gpr_shadow_valid = true; +#define TIER2_GPR_SYNC_OUT() do {} while (false) +#define TIER2_GPR_SYNC_IN() do {} while (false) +#define TIER2_GPR_BEFORE_COLD() do { tier2_gpr_shadow_valid = false; } while (false) -#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) + auto tier2_complete_shadow = [&](std::uint32_t count) -> bool { + TIER2_GPR_SYNC_OUT(); + const bool same = rt.tier2_complete_fused_transfers(ctx, count); + if (!same) tier2_gpr_shadow_valid = false; + return same; + }; + +#define TIER2_SB_RETURN() do { TIER2_GPR_SYNC_OUT(); tier2_scope.finish(); /* Unwind every logical invoke_chained_direct frame in true LIFO order. Tail frames created inside a fused JAL unwind before that JAL; outer JAL frames are also released after context invalidation. */ while (tier2_return_depth != 0u) { std::uint32_t tier2_base_ = tier2_return_pending_base[tier2_return_depth - 1u]; if (tier2_base_ > tier2_pending_transfers) { ++tier2_stats.fallbacks; tier2_base_ = tier2_pending_transfers; } const std::uint32_t tier2_tail_count_ = tier2_pending_transfers - tier2_base_; tier2_pending_transfers = tier2_base_; if (tier2_tail_count_ != 0u) (void)tier2_complete_shadow(tier2_tail_count_); --tier2_return_depth; (void)tier2_complete_shadow(1u); } if (tier2_pending_transfers != 0u) { (void)tier2_complete_shadow(tier2_pending_transfers); tier2_pending_transfers = 0u; } return; } while (false) goto TIER2_ENTRY_DISPATCH; @@ -137,11 +149,11 @@ TIER2_LOCAL_DISPATCH_U0044: 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)) + if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; - if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; @@ -235,6 +247,7 @@ TIER2_ENTRY_DISPATCH: TIER2_SB_RETURN(); } +// TIER2_GPR_BODY_BEGIN SB_L_088B4738: ctx.gpr[29] = (ctx.gpr[29] + static_cast(-352)); { const std::uint32_t tier2_words[11]{std::bit_cast(ctx.fpr[20]), ctx.gpr[16], ctx.gpr[17], ctx.gpr[18], ctx.gpr[19], ctx.gpr[20], ctx.gpr[21], ctx.gpr[22], ctx.gpr[23], ctx.gpr[30], ctx.gpr[31]}; @@ -314,10 +327,14 @@ SB_L_088B4738: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -340,13 +357,7 @@ SB_L_088B4738: { 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; - } - } + psprecomp::vcs_tier2_mat4_mul_ordered(vfpu_s, vfpu_t, vfpu_d); ctx.write_vfpu_matrix(vfpu_d, 44u, 4u); ctx.eat_vfpu_prefixes(); } { const std::uint32_t vfpu_address = ctx.gpr[5] + static_cast(0); @@ -393,10 +404,14 @@ SB_L_088B4738: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -457,10 +472,14 @@ SB_L_088B47F0: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -487,13 +506,7 @@ SB_L_088B47F0: { 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; - } - } + psprecomp::vcs_tier2_mat4_mul_ordered(vfpu_s, vfpu_t, vfpu_d); ctx.write_vfpu_matrix(vfpu_d, 48u, 4u); ctx.eat_vfpu_prefixes(); } goto SB_L_088B4810; @@ -1054,10 +1067,14 @@ SB_L_088B4C7C: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -1392,10 +1409,14 @@ SB_L_088B4EE4: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -1468,9 +1489,12 @@ SB_L_088B4F74: ctx.gpr[29] = (ctx.gpr[29] + static_cast(352)); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0044; - +// TIER2_GPR_BODY_END #undef TIER2_SB_RETURN +#undef TIER2_GPR_BEFORE_COLD +#undef TIER2_GPR_SYNC_IN +#undef TIER2_GPR_SYNC_OUT } } // namespace vcs diff --git a/profiles/vcs/host/vcs_tier2_cluster_physics.cpp b/profiles/vcs/host/vcs_tier2_cluster_physics.cpp index 550e871..51ea32a 100644 --- a/profiles/vcs/host/vcs_tier2_cluster_physics.cpp +++ b/profiles/vcs/host/vcs_tier2_cluster_physics.cpp @@ -1,8 +1,9 @@ // AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: physics +// Tier-2 SUPERBLOCK V4 150FPS cluster: physics #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_fast_paths.hpp" #include @@ -27,8 +28,19 @@ void tier2_superblock_physics(psprecomp::Runtime &rt, std::uint32_t local_pc = 0u; std::uint32_t local_transfers = 0u; std::uint32_t entry_id = 0u; + bool tier2_gpr_shadow_valid = true; +#define TIER2_GPR_SYNC_OUT() do {} while (false) +#define TIER2_GPR_SYNC_IN() do {} while (false) +#define TIER2_GPR_BEFORE_COLD() do { tier2_gpr_shadow_valid = false; } while (false) -#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) + auto tier2_complete_shadow = [&](std::uint32_t count) -> bool { + TIER2_GPR_SYNC_OUT(); + const bool same = rt.tier2_complete_fused_transfers(ctx, count); + if (!same) tier2_gpr_shadow_valid = false; + return same; + }; + +#define TIER2_SB_RETURN() do { TIER2_GPR_SYNC_OUT(); tier2_scope.finish(); /* Unwind every logical invoke_chained_direct frame in true LIFO order. Tail frames created inside a fused JAL unwind before that JAL; outer JAL frames are also released after context invalidation. */ while (tier2_return_depth != 0u) { std::uint32_t tier2_base_ = tier2_return_pending_base[tier2_return_depth - 1u]; if (tier2_base_ > tier2_pending_transfers) { ++tier2_stats.fallbacks; tier2_base_ = tier2_pending_transfers; } const std::uint32_t tier2_tail_count_ = tier2_pending_transfers - tier2_base_; tier2_pending_transfers = tier2_base_; if (tier2_tail_count_ != 0u) (void)tier2_complete_shadow(tier2_tail_count_); --tier2_return_depth; (void)tier2_complete_shadow(1u); } if (tier2_pending_transfers != 0u) { (void)tier2_complete_shadow(tier2_pending_transfers); tier2_pending_transfers = 0u; } return; } while (false) goto TIER2_ENTRY_DISPATCH; @@ -79,11 +91,11 @@ TIER2_LOCAL_DISPATCH_U0129: 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)) + if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; - if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; @@ -119,6 +131,7 @@ TIER2_ENTRY_DISPATCH: TIER2_SB_RETURN(); } +// TIER2_GPR_BODY_BEGIN SB_L_08A094D8: { const bool branch_taken = ctx.gpr[5] == 0u; ctx.gpr[6] = (ctx.gpr[6] & 1u); @@ -220,10 +233,14 @@ SB_L_08A09B2C: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -262,10 +279,14 @@ SB_L_08A09B2C: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -331,10 +352,14 @@ SB_L_08A09C1C: 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; + if constexpr (vfpu_side == 4u) { + psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result); + } else { + for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) { + float sum = 0.0f; + for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column]; + vfpu_result[row] = sum; + } } float vfpu_final_row[4]{vfpu_matrix[(vfpu_side - 1u) * 4u + 0u], vfpu_matrix[(vfpu_side - 1u) * 4u + 1u], vfpu_matrix[(vfpu_side - 1u) * 4u + 2u], vfpu_matrix[(vfpu_side - 1u) * 4u + 3u]}; @@ -414,9 +439,12 @@ SB_L_08A09CBC: ctx.gpr[31] = (0x08A09CC4u); ctx.gpr[6] = (ctx.gpr[19] ^ ctx.gpr[5]); goto SB_L_08A094D8; - +// TIER2_GPR_BODY_END #undef TIER2_SB_RETURN +#undef TIER2_GPR_BEFORE_COLD +#undef TIER2_GPR_SYNC_IN +#undef TIER2_GPR_SYNC_OUT } } // namespace vcs diff --git a/profiles/vcs/host/vcs_tier2_cluster_world.cpp b/profiles/vcs/host/vcs_tier2_cluster_world.cpp index 51b62da..cff6248 100644 --- a/profiles/vcs/host/vcs_tier2_cluster_world.cpp +++ b/profiles/vcs/host/vcs_tier2_cluster_world.cpp @@ -1,8 +1,9 @@ // AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: world +// Tier-2 SUPERBLOCK V4 150FPS cluster: world #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_fast_paths.hpp" #include @@ -27,8 +28,25 @@ void tier2_superblock_world(psprecomp::Runtime &rt, std::uint32_t local_pc = 0u; std::uint32_t local_transfers = 0u; std::uint32_t entry_id = 0u; + std::uint32_t tier2_gpr_4 = ctx.gpr[4]; + std::uint32_t tier2_gpr_5 = ctx.gpr[5]; + std::uint32_t tier2_gpr_16 = ctx.gpr[16]; + std::uint32_t tier2_gpr_29 = ctx.gpr[29]; + std::uint32_t tier2_gpr_6 = ctx.gpr[6]; + std::uint32_t tier2_gpr_31 = ctx.gpr[31]; + bool tier2_gpr_shadow_valid = true; +#define TIER2_GPR_SYNC_OUT() do { if (tier2_gpr_shadow_valid) { ctx.gpr[4] = tier2_gpr_4; ctx.gpr[5] = tier2_gpr_5; ctx.gpr[16] = tier2_gpr_16; ctx.gpr[29] = tier2_gpr_29; ctx.gpr[6] = tier2_gpr_6; ctx.gpr[31] = tier2_gpr_31; } } while (false) +#define TIER2_GPR_SYNC_IN() do { if (tier2_gpr_shadow_valid) { tier2_gpr_4 = ctx.gpr[4]; tier2_gpr_5 = ctx.gpr[5]; tier2_gpr_16 = ctx.gpr[16]; tier2_gpr_29 = ctx.gpr[29]; tier2_gpr_6 = ctx.gpr[6]; tier2_gpr_31 = ctx.gpr[31]; } } while (false) +#define TIER2_GPR_BEFORE_COLD() do { TIER2_GPR_SYNC_OUT(); tier2_gpr_shadow_valid = false; } while (false) -#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) + auto tier2_complete_shadow = [&](std::uint32_t count) -> bool { + TIER2_GPR_SYNC_OUT(); + const bool same = rt.tier2_complete_fused_transfers(ctx, count); + if (!same) tier2_gpr_shadow_valid = false; + return same; + }; + +#define TIER2_SB_RETURN() do { TIER2_GPR_SYNC_OUT(); tier2_scope.finish(); /* Unwind every logical invoke_chained_direct frame in true LIFO order. Tail frames created inside a fused JAL unwind before that JAL; outer JAL frames are also released after context invalidation. */ while (tier2_return_depth != 0u) { std::uint32_t tier2_base_ = tier2_return_pending_base[tier2_return_depth - 1u]; if (tier2_base_ > tier2_pending_transfers) { ++tier2_stats.fallbacks; tier2_base_ = tier2_pending_transfers; } const std::uint32_t tier2_tail_count_ = tier2_pending_transfers - tier2_base_; tier2_pending_transfers = tier2_base_; if (tier2_tail_count_ != 0u) (void)tier2_complete_shadow(tier2_tail_count_); --tier2_return_depth; (void)tier2_complete_shadow(1u); } if (tier2_pending_transfers != 0u) { (void)tier2_complete_shadow(tier2_pending_transfers); tier2_pending_transfers = 0u; } return; } while (false) goto TIER2_ENTRY_DISPATCH; @@ -466,11 +484,11 @@ TIER2_LOCAL_DISPATCH_U0157: 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)) + if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; - if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; @@ -662,11 +680,11 @@ TIER2_LOCAL_DISPATCH_U0158: 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)) + if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; } --tier2_return_depth; - if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; @@ -934,15 +952,16 @@ TIER2_ENTRY_DISPATCH: TIER2_SB_RETURN(); } +// TIER2_GPR_BODY_BEGIN 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); + tier2_gpr_29 = (tier2_gpr_29 + static_cast(-16)); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(472))); + tier2_gpr_6 = (32768u << 16u); + tier2_gpr_5 = (tier2_gpr_5 & tier2_gpr_6); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(0), tier2_gpr_16); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(4), tier2_gpr_31); + { const bool branch_taken = tier2_gpr_5 != 0u; + tier2_gpr_16 = (tier2_gpr_4 | 0u); if (branch_taken) { goto SB_L_08A79B08; } @@ -950,9 +969,9 @@ SB_L_08A79AB4: } 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_gpr_31 = (0x08A79ADCu); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0067_entry, 67u, 195u, 0x08910B38u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A79ADCu) goto SB_L_08A79ADC; TIER2_SB_RETURN(); SB_L_08A79ADC: @@ -965,8 +984,8 @@ SB_L_08A79ADC: } SB_L_08A79AE4: - ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(1152))); - { const bool branch_taken = ctx.gpr[16] == 0u; + tier2_gpr_16 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(1152))); + { const bool branch_taken = tier2_gpr_16 == 0u; // nop if (branch_taken) { goto SB_L_08A79B00; @@ -975,9 +994,9 @@ SB_L_08A79AE4: } 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; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load8(tier2_gpr_16 + static_cast(619)))))); + tier2_gpr_4 = (tier2_gpr_4 & 32u); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A79B10; @@ -1008,26 +1027,26 @@ SB_L_08A79B10: 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)); + tier2_gpr_16 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(0))); + tier2_gpr_31 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(4))); + jump_target = tier2_gpr_31; + tier2_gpr_29 = (tier2_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]); + tier2_gpr_29 = (tier2_gpr_29 + static_cast(-32)); + aot_mem.aot_store32(tier2_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)); - { const std::uint32_t tier2_words[3]{ctx.gpr[18], ctx.gpr[19], ctx.gpr[31]}; - aot_mem.aot_store32_block(ctx.gpr[29] + static_cast(8), tier2_words); } - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10064))); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(0), tier2_gpr_16); + tier2_gpr_16 = (ctx.gpr[17] + static_cast(16)); + { const std::uint32_t tier2_words[3]{ctx.gpr[18], ctx.gpr[19], tier2_gpr_31}; + aot_mem.aot_store32_block(tier2_gpr_29 + static_cast(8), tier2_words); } + tier2_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; + tier2_gpr_4 = (static_cast(ctx.gpr[19]) < static_cast(tier2_gpr_4) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 == 0u; ctx.gpr[18] = (2279u << 16u); if (branch_taken) { goto SB_L_08A79E64; @@ -1040,23 +1059,23 @@ SB_L_08A79E30: 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]); + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(92))); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(120)); + tier2_gpr_6 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_5 + static_cast(0)))))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_5 + static_cast(4))); + jump_target = tier2_gpr_5; + tier2_gpr_31 = (0x08A79E50u); + tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_6); ctx.pc = jump_target; - if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A79E50u) goto SB_L_08A79E50; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A79E50u) goto SB_L_08A79E50; TIER2_SB_RETURN(); SB_L_08A79E50: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10064))); + tier2_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; + tier2_gpr_4 = (static_cast(ctx.gpr[19]) < static_cast(tier2_gpr_4) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 != 0u; ctx.gpr[18] = (ctx.gpr[18] + static_cast(4)); if (branch_taken) { goto SB_L_08A79E34; @@ -1065,10 +1084,10 @@ SB_L_08A79E50: } SB_L_08A79E64: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10072))); + tier2_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; + tier2_gpr_4 = (static_cast(ctx.gpr[19]) < static_cast(tier2_gpr_4) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 == 0u; ctx.gpr[18] = (2280u << 16u); if (branch_taken) { goto SB_L_08A79EAC; @@ -1081,23 +1100,23 @@ SB_L_08A79E78: 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]); + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(92))); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(120)); + tier2_gpr_6 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_5 + static_cast(0)))))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_5 + static_cast(4))); + jump_target = tier2_gpr_5; + tier2_gpr_31 = (0x08A79E98u); + tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_6); ctx.pc = jump_target; - if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A79E98u) goto SB_L_08A79E98; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A79E98u) goto SB_L_08A79E98; TIER2_SB_RETURN(); SB_L_08A79E98: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10072))); + tier2_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; + tier2_gpr_4 = (static_cast(ctx.gpr[19]) < static_cast(tier2_gpr_4) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 != 0u; ctx.gpr[18] = (ctx.gpr[18] + static_cast(4)); if (branch_taken) { goto SB_L_08A79E7C; @@ -1106,10 +1125,10 @@ SB_L_08A79E98: } SB_L_08A79EAC: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10068))); + tier2_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; + tier2_gpr_4 = (static_cast(ctx.gpr[19]) < static_cast(tier2_gpr_4) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 == 0u; ctx.gpr[18] = (2280u << 16u); if (branch_taken) { goto SB_L_08A79EF4; @@ -1122,23 +1141,23 @@ SB_L_08A79EC0: 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]); + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(92))); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(120)); + tier2_gpr_6 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_5 + static_cast(0)))))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_5 + static_cast(4))); + jump_target = tier2_gpr_5; + tier2_gpr_31 = (0x08A79EE0u); + tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_6); ctx.pc = jump_target; - if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A79EE0u) goto SB_L_08A79EE0; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A79EE0u) goto SB_L_08A79EE0; TIER2_SB_RETURN(); SB_L_08A79EE0: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10068))); + tier2_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; + tier2_gpr_4 = (static_cast(ctx.gpr[19]) < static_cast(tier2_gpr_4) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 != 0u; ctx.gpr[18] = (ctx.gpr[18] + static_cast(4)); if (branch_taken) { goto SB_L_08A79EC4; @@ -1148,7 +1167,7 @@ SB_L_08A79EE0: 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]; + { const bool branch_taken = ctx.gpr[17] == tier2_gpr_16; // nop if (branch_taken) { goto SB_L_08A79F28; @@ -1157,41 +1176,41 @@ SB_L_08A79EF4: } SB_L_08A79F00: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); + tier2_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]); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(92))); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(120)); + tier2_gpr_6 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_5 + static_cast(0)))))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_5 + static_cast(4))); + jump_target = tier2_gpr_5; + tier2_gpr_31 = (0x08A79F1Cu); + tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_6); ctx.pc = jump_target; - if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A79F1Cu) goto SB_L_08A79F1C; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 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))); + if (ctx.gpr[17] != tier2_gpr_16) { + tier2_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); + tier2_gpr_31 = (0x08A79F30u); // nop goto SB_L_08A79F5C; SB_L_08A79F5C: - ctx.gpr[29] = (ctx.gpr[29] + static_cast(-32)); - { const std::uint32_t tier2_words[6]{std::bit_cast(ctx.fpr[20]), ctx.gpr[16], ctx.gpr[17], ctx.gpr[18], ctx.gpr[19], ctx.gpr[31]}; - aot_mem.aot_store32_block(ctx.gpr[29] + static_cast(0), tier2_words); } - ctx.gpr[31] = (0x08A79F80u); + tier2_gpr_29 = (tier2_gpr_29 + static_cast(-32)); + { const std::uint32_t tier2_words[6]{std::bit_cast(ctx.fpr[20]), tier2_gpr_16, ctx.gpr[17], ctx.gpr[18], ctx.gpr[19], tier2_gpr_31}; + aot_mem.aot_store32_block(tier2_gpr_29 + static_cast(0), tier2_words); } + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 47u, 0x08960424u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A79F80u) goto SB_L_08A79F80; TIER2_SB_RETURN(); SB_L_08A79F80: @@ -1204,16 +1223,16 @@ SB_L_08A79F80: } SB_L_08A79F88: - ctx.gpr[31] = (0x08A79F90u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 47u, 0x08960424u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]); + tier2_gpr_4 = (ctx.gpr[2] + static_cast(48)); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_4 + static_cast(8))); + tier2_gpr_4 = (49736u << 16u); + ctx.fpr[13] = std::bit_cast(tier2_gpr_4); ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] <= ctx.fpr[13])) ? 0x00800000u : 0u); // nop { const bool branch_taken = !((ctx.fcr31 & 0x00800000u) != 0u); @@ -1229,11 +1248,11 @@ SB_L_08A79FB0: goto SB_L_08A79FB4; SB_L_08A79FB4: - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-5496))); + tier2_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); + tier2_gpr_4 = (static_cast(ctx.gpr[18]) < static_cast(tier2_gpr_5) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 == 0u; + tier2_gpr_4 = (49736u << 16u); if (branch_taken) { goto SB_L_08A7A054; } @@ -1242,17 +1261,17 @@ SB_L_08A79FB4: SB_L_08A79FC8: ctx.gpr[17] = (0u | 0u); - ctx.fpr[20] = std::bit_cast(ctx.gpr[4]); - ctx.gpr[16] = (8u << 16u); + ctx.fpr[20] = std::bit_cast(tier2_gpr_4); + tier2_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; + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-5500))); + tier2_gpr_4 = (tier2_gpr_4 + ctx.gpr[17]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(0))); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(72))); + tier2_gpr_6 = (tier2_gpr_6 & tier2_gpr_16); + { const bool branch_taken = tier2_gpr_6 == 0u; // nop if (branch_taken) { goto SB_L_08A7A044; @@ -1262,7 +1281,7 @@ SB_L_08A79FD4: SB_L_08A79FF0: { const bool branch_taken = ctx.gpr[19] == 0u; - ctx.gpr[6] = (ctx.gpr[4] + static_cast(48)); + tier2_gpr_6 = (tier2_gpr_4 + static_cast(48)); if (branch_taken) { goto SB_L_08A7A01C; } @@ -1270,7 +1289,7 @@ SB_L_08A79FF0: } SB_L_08A79FF8: - ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[6] + static_cast(8))); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(tier2_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); @@ -1282,14 +1301,14 @@ SB_L_08A79FF8: } SB_L_08A7A00C: - ctx.gpr[31] = (0x08A7A014u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0142_entry, 142u, 167u, 0x08A3CC80u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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))); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-5496))); if (branch_taken) { goto SB_L_08A7A044; } @@ -1298,7 +1317,7 @@ SB_L_08A7A014: SB_L_08A7A01C: { const bool branch_taken = ctx.gpr[19] != 0u; - ctx.gpr[6] = (ctx.gpr[4] + static_cast(48)); + tier2_gpr_6 = (tier2_gpr_4 + static_cast(48)); if (branch_taken) { goto SB_L_08A7A044; } @@ -1306,7 +1325,7 @@ SB_L_08A7A01C: } SB_L_08A7A024: - ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[6] + static_cast(8))); + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(tier2_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); @@ -1318,19 +1337,19 @@ SB_L_08A7A024: } SB_L_08A7A038: - ctx.gpr[31] = (0x08A7A040u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0142_entry, 142u, 167u, 0x08A3CC80u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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))); + tier2_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; + tier2_gpr_4 = (static_cast(ctx.gpr[18]) < static_cast(tier2_gpr_5) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 != 0u; ctx.gpr[17] = (ctx.gpr[17] + static_cast(4)); if (branch_taken) { goto SB_L_08A79FD4; @@ -1339,8 +1358,8 @@ SB_L_08A7A044: } SB_L_08A7A054: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); - { const bool branch_taken = ctx.gpr[4] != 0u; + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7A06C; @@ -1349,50 +1368,50 @@ SB_L_08A7A054: } SB_L_08A7A060: - ctx.gpr[31] = (0x08A7A068u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0216_entry, 216u, 413u, 0x08B65B0Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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))); + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); goto SB_L_08A7A06C; SB_L_08A7A06C: - ctx.gpr[31] = (0x08A7A074u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 221u, 0x08954F80u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7A074u) goto SB_L_08A7A074; TIER2_SB_RETURN(); SB_L_08A7A074: { std::uint32_t tier2_words[6]{}; - if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(0), tier2_words)) { + if (aot_mem.aot_try_load32_block(tier2_gpr_29 + static_cast(0), tier2_words)) { ctx.fpr[20] = std::bit_cast(tier2_words[0]); - ctx.gpr[16] = tier2_words[1]; + tier2_gpr_16 = tier2_words[1]; ctx.gpr[17] = tier2_words[2]; ctx.gpr[18] = tier2_words[3]; ctx.gpr[19] = tier2_words[4]; - ctx.gpr[31] = tier2_words[5]; + tier2_gpr_31 = tier2_words[5]; } else { - 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))); + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_29 + static_cast(0))); + tier2_gpr_16 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(4))); + ctx.gpr[17] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(8))); + ctx.gpr[18] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(12))); + ctx.gpr[19] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(16))); + tier2_gpr_31 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(20))); } } - jump_target = ctx.gpr[31]; - ctx.gpr[29] = (ctx.gpr[29] + static_cast(32)); + jump_target = tier2_gpr_31; + tier2_gpr_29 = (tier2_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); - { const std::uint32_t tier2_words[7]{ctx.gpr[16], ctx.gpr[17], ctx.gpr[18], ctx.gpr[19], ctx.gpr[20], ctx.gpr[21], ctx.gpr[31]}; - aot_mem.aot_store32_block(ctx.gpr[29] + static_cast(0), tier2_words); } - { const bool branch_taken = ctx.gpr[5] == 0u; - ctx.gpr[16] = (ctx.gpr[4] | 0u); + tier2_gpr_29 = (tier2_gpr_29 + static_cast(-32)); + tier2_gpr_5 = (tier2_gpr_5 & 255u); + { const std::uint32_t tier2_words[7]{tier2_gpr_16, ctx.gpr[17], ctx.gpr[18], ctx.gpr[19], ctx.gpr[20], ctx.gpr[21], tier2_gpr_31}; + aot_mem.aot_store32_block(tier2_gpr_29 + static_cast(0), tier2_words); } + { const bool branch_taken = tier2_gpr_5 == 0u; + tier2_gpr_16 = (tier2_gpr_4 | 0u); if (branch_taken) { goto SB_L_08A7A714; } @@ -1400,12 +1419,12 @@ SB_L_08A7A664: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 10u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; ctx.gpr[17] = (0u | 0u); if (branch_taken) { goto SB_L_08A7A6D0; @@ -1414,9 +1433,9 @@ SB_L_08A7A690: } 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)))))); + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5844))); + { const bool branch_taken = tier2_gpr_4 != 0u; + ctx.gpr[18] = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); if (branch_taken) { goto SB_L_08A7A6C0; } @@ -1424,28 +1443,28 @@ SB_L_08A7A6AC: } SB_L_08A7A6B8: - ctx.gpr[31] = (0x08A7A6C0u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0216_entry, 216u, 339u, 0x08B6572Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]) { + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5844))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(276))); + if (ctx.gpr[18] != tier2_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); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 8u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; + tier2_gpr_4 = (ctx.gpr[17] & 255u); if (branch_taken) { goto SB_L_08A7A70C; } @@ -1453,12 +1472,12 @@ SB_L_08A7A6D0: } 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); + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load8(tier2_gpr_16 + static_cast(483)))))); + tier2_gpr_4 = (tier2_gpr_4 & 16u); + tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; + tier2_gpr_4 = (ctx.gpr[17] & 255u); if (branch_taken) { goto SB_L_08A7A70C; } @@ -1470,11 +1489,11 @@ SB_L_08A7A704: goto SB_L_08A7A708; SB_L_08A7A708: - ctx.gpr[4] = (ctx.gpr[17] & 255u); + tier2_gpr_4 = (ctx.gpr[17] & 255u); goto SB_L_08A7A70C; SB_L_08A7A70C: - { const bool branch_taken = ctx.gpr[4] != 0u; + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7A738; @@ -1483,20 +1502,20 @@ SB_L_08A7A70C: } 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))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 6u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + if (tier2_gpr_4 != 0u) { + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); if (branch_taken) { goto SB_L_08A7A75C; } @@ -1504,15 +1523,15 @@ SB_L_08A7A730: } 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]); + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10076))); + tier2_gpr_5 = (2280u << 16u); + tier2_gpr_6 = (tier2_gpr_4 << 2u); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(1)); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(-21568)); + aot_mem.aot_store32(ctx.gpr[28] + static_cast(10076), tier2_gpr_4); + tier2_gpr_4 = (tier2_gpr_6 + tier2_gpr_5); { const bool branch_taken = 0u == 0u; - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[16]); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_16); if (branch_taken) { goto SB_L_08A7A928; } @@ -1520,11 +1539,11 @@ SB_L_08A7A738: } 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; + tier2_gpr_5 = (2u << 16u); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7A784; @@ -1533,12 +1552,12 @@ SB_L_08A7A75C: } SB_L_08A7A774: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(2228))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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]; + tier2_gpr_5 = (0u | 55u); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7A7C0; @@ -1547,24 +1566,24 @@ SB_L_08A7A778: } 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(92))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(144)); + tier2_gpr_5 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_4 + static_cast(0)))))); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(4))); + jump_target = tier2_gpr_6; + tier2_gpr_31 = (0x08A7A79Cu); + tier2_gpr_4 = (tier2_gpr_16 + tier2_gpr_5); ctx.pc = jump_target; - if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7A79Cu) goto SB_L_08A7A79C; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 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] = (aot_mem.aot_load32(tier2_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; + tier2_gpr_4 = (ctx.gpr[19] ^ 14u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 != 0u; ctx.gpr[18] = (ctx.gpr[2] | 0u); if (branch_taken) { goto SB_L_08A7A7C8; @@ -1591,12 +1610,12 @@ SB_L_08A7A7C0: } 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(352))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(108))); + ctx.gpr[17] = (tier2_gpr_5 + static_cast(16)); + tier2_gpr_5 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + tier2_gpr_31 = (0x08A7A7E0u); + ctx.gpr[19] = (tier2_gpr_4 + tier2_gpr_5); if (tier2_return_depth < kTier2ReturnCapacity) { if (!rt.tier2_enter_fused_transfer<158u, 0x08A7FAA4u>(ctx)) { ctx.pc = 0x08A7FAA4u; @@ -1610,17 +1629,17 @@ SB_L_08A7A7C8: 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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0158_entry, 158u, 666u, 0x08A7FAA4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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); + tier2_gpr_6 = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(4))); + tier2_gpr_4 = (ctx.gpr[19] | 0u); + jump_target = tier2_gpr_6; + tier2_gpr_31 = (0x08A7A7F0u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7A7F0u) goto SB_L_08A7A7F0; TIER2_SB_RETURN(); SB_L_08A7A7F0: @@ -1647,24 +1666,24 @@ SB_L_08A7A800: } 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_gpr_31 = (0x08A7A810u); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(80))); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 192u, 0x08945314u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7A810u) goto SB_L_08A7A810; TIER2_SB_RETURN(); SB_L_08A7A810: - ctx.gpr[31] = (0x08A7A818u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 125u, 0x08944F2Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 4u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7A8E4; @@ -1673,10 +1692,10 @@ SB_L_08A7A818: } 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)); + ctx.gpr[20] = (tier2_gpr_16 | 0u); + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(900))); + { const bool branch_taken = tier2_gpr_4 == 0u; + tier2_gpr_5 = (tier2_gpr_4 + static_cast(2228)); if (branch_taken) { goto SB_L_08A7A86C; } @@ -1684,9 +1703,9 @@ SB_L_08A7A834: } 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]; + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_5 + static_cast(0))); + tier2_gpr_6 = (0u | 55u); + { const bool branch_taken = tier2_gpr_5 != tier2_gpr_6; // nop if (branch_taken) { goto SB_L_08A7A86C; @@ -1695,22 +1714,22 @@ SB_L_08A7A844: } 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]); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(92))); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(128)); + tier2_gpr_6 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_5 + static_cast(0)))))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_5 + static_cast(4))); + jump_target = tier2_gpr_5; + tier2_gpr_31 = (0x08A7A86Cu); + tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_6); ctx.pc = jump_target; - if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7A86Cu) goto SB_L_08A7A86C; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7A86Cu) goto SB_L_08A7A86C; TIER2_SB_RETURN(); SB_L_08A7A86C: - ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[20] + static_cast(565))); + tier2_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; + tier2_gpr_4 = (static_cast(ctx.gpr[21]) < static_cast(tier2_gpr_4) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 == 0u; ctx.gpr[17] = (0u | 55u); if (branch_taken) { goto SB_L_08A7A8E4; @@ -1719,15 +1738,15 @@ SB_L_08A7A86C: } 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_gpr_4 = (ctx.gpr[20] | 0u); + tier2_gpr_31 = (0x08A7A88Cu); + tier2_gpr_5 = (ctx.gpr[21] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0190_entry, 190u, 663u, 0x08AFEF7Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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); + tier2_gpr_4 = (ctx.gpr[20] | 0u); if (branch_taken) { goto SB_L_08A7A8D0; } @@ -1735,15 +1754,15 @@ SB_L_08A7A88C: } 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_gpr_31 = (0x08A7A89Cu); + tier2_gpr_5 = (ctx.gpr[21] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0190_entry, 190u, 663u, 0x08AFEF7Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]; + tier2_gpr_4 = (ctx.gpr[2] + static_cast(2228)); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(0))); + { const bool branch_taken = tier2_gpr_4 != ctx.gpr[17]; // nop if (branch_taken) { goto SB_L_08A7A8D0; @@ -1752,29 +1771,29 @@ SB_L_08A7A89C: } 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_gpr_4 = (ctx.gpr[20] | 0u); + tier2_gpr_31 = (0x08A7A8B8u); + tier2_gpr_5 = (ctx.gpr[21] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0190_entry, 190u, 663u, 0x08AFEF7Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]); + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[2] + static_cast(92))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(128)); + tier2_gpr_5 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_4 + static_cast(0)))))); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(4))); + jump_target = tier2_gpr_6; + tier2_gpr_31 = (0x08A7A8D0u); + tier2_gpr_4 = (ctx.gpr[2] + tier2_gpr_5); ctx.pc = jump_target; - if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7A8D0u) goto SB_L_08A7A8D0; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7A8D0u) goto SB_L_08A7A8D0; TIER2_SB_RETURN(); SB_L_08A7A8D0: - ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[20] + static_cast(565))); + tier2_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; + tier2_gpr_4 = (static_cast(ctx.gpr[21]) < static_cast(tier2_gpr_4) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7A880; @@ -1783,15 +1802,15 @@ SB_L_08A7A8D0: } 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(92))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(128)); + tier2_gpr_5 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_4 + static_cast(0)))))); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(4))); + jump_target = tier2_gpr_6; + tier2_gpr_31 = (0x08A7A8FCu); + tier2_gpr_4 = (tier2_gpr_16 + tier2_gpr_5); ctx.pc = jump_target; - if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7A8FCu) goto SB_L_08A7A8FC; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7A8FCu) goto SB_L_08A7A8FC; TIER2_SB_RETURN(); SB_L_08A7A8FC: @@ -1804,135 +1823,135 @@ SB_L_08A7A8FC: } SB_L_08A7A904: - ctx.gpr[31] = (0x08A7A90Cu); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 132u, 0x08944F98u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(92))); + tier2_gpr_5 = (ctx.gpr[18] | 0u); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(152)); + tier2_gpr_6 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_4 + static_cast(0)))))); + ctx.gpr[7] = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(4))); jump_target = ctx.gpr[7]; - ctx.gpr[31] = (0x08A7A928u); - ctx.gpr[4] = (ctx.gpr[16] + ctx.gpr[6]); + tier2_gpr_31 = (0x08A7A928u); + tier2_gpr_4 = (tier2_gpr_16 + tier2_gpr_6); ctx.pc = jump_target; - if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7A928u) goto SB_L_08A7A928; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7A928u) goto SB_L_08A7A928; TIER2_SB_RETURN(); SB_L_08A7A928: { std::uint32_t tier2_words[7]{}; - if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(0), tier2_words)) { - ctx.gpr[16] = tier2_words[0]; + if (aot_mem.aot_try_load32_block(tier2_gpr_29 + static_cast(0), tier2_words)) { + tier2_gpr_16 = tier2_words[0]; ctx.gpr[17] = tier2_words[1]; ctx.gpr[18] = tier2_words[2]; ctx.gpr[19] = tier2_words[3]; ctx.gpr[20] = tier2_words[4]; ctx.gpr[21] = tier2_words[5]; - ctx.gpr[31] = tier2_words[6]; + tier2_gpr_31 = tier2_words[6]; } else { - 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))); + tier2_gpr_16 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(0))); + ctx.gpr[17] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(4))); + ctx.gpr[18] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(8))); + ctx.gpr[19] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(12))); + ctx.gpr[20] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(16))); + ctx.gpr[21] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(20))); + tier2_gpr_31 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(24))); } } - jump_target = ctx.gpr[31]; - ctx.gpr[29] = (ctx.gpr[29] + static_cast(32)); + jump_target = tier2_gpr_31; + tier2_gpr_29 = (tier2_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_advance32(ctx.gpr[20] + static_cast(0)); - { const std::uint32_t tier2_words[4]{ctx.gpr[16], ctx.gpr[17], ctx.gpr[18], ctx.gpr[19]}; - aot_mem.aot_store32_block(ctx.gpr[29] + static_cast(40), tier2_words); } - { const std::uint32_t tier2_words[5]{ctx.gpr[21], ctx.gpr[22], ctx.gpr[23], ctx.gpr[30], ctx.gpr[31]}; - aot_mem.aot_store32_block(ctx.gpr[29] + static_cast(60), tier2_words); } - 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_gpr_29 = (tier2_gpr_29 + static_cast(-80)); + tier2_gpr_4 = (2236u << 16u); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(56), ctx.gpr[20]); + ctx.gpr[20] = (tier2_gpr_4 + static_cast(29552)); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + tier2_gpr_6 = (8448u << 16u); + tier2_gpr_6 = (tier2_gpr_6 + static_cast(1)); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_6); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(4)); + tier2_gpr_6 = (59136u << 16u); + aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), tier2_gpr_5); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_6); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + tier2_gpr_6 = (8704u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), tier2_gpr_5); + tier2_gpr_6 = (tier2_gpr_6 + static_cast(1)); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_6); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + tier2_gpr_6 = (8960u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), tier2_gpr_5); + tier2_gpr_6 = (tier2_gpr_6 + static_cast(1)); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_6); + tier2_gpr_5 = aot_mem.aot_advance32(ctx.gpr[20] + static_cast(0)); + { const std::uint32_t tier2_words[4]{tier2_gpr_16, ctx.gpr[17], ctx.gpr[18], ctx.gpr[19]}; + aot_mem.aot_store32_block(tier2_gpr_29 + static_cast(40), tier2_words); } + { const std::uint32_t tier2_words[5]{ctx.gpr[21], ctx.gpr[22], ctx.gpr[23], ctx.gpr[30], tier2_gpr_31}; + aot_mem.aot_store32_block(tier2_gpr_29 + static_cast(60), tier2_words); } + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + tier2_gpr_6 = (51200u << 16u); + tier2_gpr_6 = (tier2_gpr_6 + static_cast(2)); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_6); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + tier2_gpr_6 = (57088u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), tier2_gpr_5); + tier2_gpr_6 = (tier2_gpr_6 + static_cast(50)); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_6); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + tier2_gpr_6 = (57344u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), tier2_gpr_5); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_6); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + tier2_gpr_6 = (57600u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), tier2_gpr_5); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_6); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); + tier2_gpr_6 = (5888u << 16u); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(4)); + aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), tier2_gpr_5); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(29552))); + tier2_gpr_6 = (tier2_gpr_6 + static_cast(1)); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_6); + tier2_gpr_5 = (0u | 1u); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(29552))); + aot_mem.aot_store8(ctx.gpr[28] + static_cast(-24632), static_cast(tier2_gpr_5)); + tier2_gpr_5 = (tier2_gpr_6 + static_cast(4)); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(29552), tier2_gpr_5); + tier2_gpr_4 = (0u | 11u); + tier2_gpr_31 = (0x08A7AA6Cu); + tier2_gpr_5 = (0u | 1u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 203u, 0x08861668u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7AA6Cu) goto SB_L_08A7AA6C; TIER2_SB_RETURN(); SB_L_08A7AA6C: - ctx.gpr[31] = (0x08A7AA74u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 129u, 0x08944F6Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7AA74u) goto SB_L_08A7AA74; TIER2_SB_RETURN(); SB_L_08A7AA74: - ctx.gpr[31] = (0x08A7AA7Cu); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 127u, 0x08944F4Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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))); + tier2_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)); + tier2_gpr_4 = (static_cast(ctx.gpr[20]) < static_cast(tier2_gpr_4) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 == 0u; + tier2_gpr_4 = (ctx.gpr[28] + static_cast(10048)); if (branch_taken) { goto SB_L_08A7AD14; } @@ -1944,20 +1963,20 @@ SB_L_08A7AA90: 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]); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(36), tier2_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))); + tier2_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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); + tier2_gpr_4 = (tier2_gpr_4 & ctx.gpr[21]); + tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; ctx.gpr[17] = (0u | 0u); if (branch_taken) { goto SB_L_08A7AAF0; @@ -1966,8 +1985,8 @@ SB_L_08A7AAB0: } 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]; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(2228))); + { const bool branch_taken = tier2_gpr_4 != ctx.gpr[30]; // nop if (branch_taken) { goto SB_L_08A7AAF0; @@ -1976,9 +1995,9 @@ SB_L_08A7AAD0: } 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_gpr_31 = (0x08A7AAE4u); + tier2_gpr_4 = (ctx.gpr[18] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0134_entry, 134u, 56u, 0x08A1C658u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7AAE4u) goto SB_L_08A7AAE4; TIER2_SB_RETURN(); SB_L_08A7AAE4: @@ -1995,23 +2014,23 @@ SB_L_08A7AAEC: 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))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 6u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + if (tier2_gpr_4 != 0u) { + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); + tier2_gpr_4 = (tier2_gpr_4 & ctx.gpr[21]); + tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7ABA4; @@ -2020,11 +2039,11 @@ SB_L_08A7AB0C: } SB_L_08A7AB24: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(2228))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(2228))); goto SB_L_08A7AB28; SB_L_08A7AB28: - { const bool branch_taken = ctx.gpr[4] == ctx.gpr[30]; + { const bool branch_taken = tier2_gpr_4 == ctx.gpr[30]; // nop if (branch_taken) { goto SB_L_08A7ABA4; @@ -2042,12 +2061,12 @@ SB_L_08A7AB30: } 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; + tier2_gpr_4 = (tier2_gpr_16 | 0u); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(76))); + tier2_gpr_5 = (tier2_gpr_5 & ctx.gpr[21]); + tier2_gpr_5 = (0u < tier2_gpr_5 ? 1u : 0u); + tier2_gpr_5 = (tier2_gpr_5 & 255u); + { const bool branch_taken = tier2_gpr_5 == 0u; // nop if (branch_taken) { goto SB_L_08A7AB80; @@ -2056,11 +2075,11 @@ SB_L_08A7AB38: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(236))); + tier2_gpr_4 = (tier2_gpr_4 & 256u); + tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7AB9C; @@ -2069,13 +2088,13 @@ SB_L_08A7AB54: } SB_L_08A7AB6C: - ctx.gpr[4] = (ctx.gpr[16] | 0u); - ctx.gpr[31] = (0x08A7AB78u); - ctx.gpr[5] = (0u | 0u); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + tier2_gpr_31 = (0x08A7AB78u); + tier2_gpr_5 = (0u | 0u); goto SB_L_08A7A664; SB_L_08A7AB80: - ctx.gpr[31] = (0x08A7AB88u); + tier2_gpr_31 = (0x08A7AB88u); // nop goto SB_L_08A79AB4; @@ -2089,12 +2108,12 @@ SB_L_08A7AB9C: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 4u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7ACB0; @@ -2103,18 +2122,18 @@ SB_L_08A7ABA4: } 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))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(852))); + tier2_gpr_4 = (0u | 1u); + if (tier2_gpr_5 == tier2_gpr_4) { + tier2_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]; + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(852))); + tier2_gpr_6 = (0u | 2u); + { const bool branch_taken = tier2_gpr_5 != tier2_gpr_6; // nop if (branch_taken) { goto SB_L_08A7AC7C; @@ -2123,20 +2142,20 @@ SB_L_08A7ABD0: } SB_L_08A7ABE0: - ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[18] + static_cast(80))); + tier2_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]; + tier2_gpr_4 = (tier2_gpr_4 << 5u); + tier2_gpr_5 = (0u - tier2_gpr_4); + tier2_gpr_4 = (tier2_gpr_4 << 2u); + tier2_gpr_5 = (tier2_gpr_5 + tier2_gpr_4); + tier2_gpr_4 = (tier2_gpr_4 << 2u); + tier2_gpr_4 = (tier2_gpr_5 + tier2_gpr_4); + tier2_gpr_4 = (tier2_gpr_4 + ctx.gpr[18]); + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_4 + static_cast(112)))))); + tier2_gpr_5 = (0u | 14u); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7ACB0; @@ -2145,17 +2164,17 @@ SB_L_08A7ABE4: } 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]; + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[18] + static_cast(80))); + tier2_gpr_4 = (tier2_gpr_4 << 5u); + tier2_gpr_5 = (0u - tier2_gpr_4); + tier2_gpr_4 = (tier2_gpr_4 << 2u); + tier2_gpr_5 = (tier2_gpr_5 + tier2_gpr_4); + tier2_gpr_4 = (tier2_gpr_4 << 2u); + tier2_gpr_4 = (tier2_gpr_5 + tier2_gpr_4); + tier2_gpr_4 = (tier2_gpr_4 + ctx.gpr[18]); + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_4 + static_cast(112)))))); + tier2_gpr_5 = (0u | 16u); + { const bool branch_taken = tier2_gpr_4 != tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7AC60; @@ -2164,9 +2183,9 @@ SB_L_08A7AC10: } 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_gpr_31 = (0x08A7AC48u); + tier2_gpr_4 = (ctx.gpr[18] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0134_entry, 134u, 56u, 0x08A1C658u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7AC48u) goto SB_L_08A7AC48; TIER2_SB_RETURN(); SB_L_08A7AC48: @@ -2179,9 +2198,9 @@ SB_L_08A7AC48: } 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_gpr_31 = (0x08A7AC58u); + tier2_gpr_4 = (ctx.gpr[18] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0134_entry, 134u, 56u, 0x08A1C658u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7AC58u) goto SB_L_08A7AC58; TIER2_SB_RETURN(); SB_L_08A7AC58: @@ -2194,14 +2213,14 @@ SB_L_08A7AC58: } 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_gpr_31 = (0x08A7AC68u); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(80))); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 191u, 0x0894530Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]; + tier2_gpr_4 = (0u | 255u); + { const bool branch_taken = ctx.gpr[2] != tier2_gpr_4; // nop if (branch_taken) { goto SB_L_08A7ACB0; @@ -2219,12 +2238,12 @@ SB_L_08A7AC74: } 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; + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_5 = (tier2_gpr_5 & 14u); + tier2_gpr_5 = (tier2_gpr_5 ^ 4u); + tier2_gpr_5 = (tier2_gpr_5 < static_cast(1) ? 1u : 0u); + tier2_gpr_5 = (tier2_gpr_5 & 255u); + { const bool branch_taken = tier2_gpr_5 == 0u; // nop if (branch_taken) { goto SB_L_08A7ACB0; @@ -2233,10 +2252,10 @@ SB_L_08A7AC7C: } 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; + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(236))); + tier2_gpr_6 = (1024u << 16u); + tier2_gpr_5 = (tier2_gpr_5 & tier2_gpr_6); + { const bool branch_taken = tier2_gpr_5 == 0u; // nop if (branch_taken) { goto SB_L_08A7ACB0; @@ -2245,7 +2264,7 @@ SB_L_08A7AC98: } SB_L_08A7ACAC: - ctx.gpr[19] = (ctx.gpr[4] | 0u); + ctx.gpr[19] = (tier2_gpr_4 | 0u); goto SB_L_08A7ACB0; SB_L_08A7ACB0: @@ -2258,8 +2277,8 @@ SB_L_08A7ACB0: } 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); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(36))); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -2267,8 +2286,8 @@ SB_L_08A7ACB8: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; 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); + tier2_gpr_4 = (tier2_gpr_16 + static_cast(48)); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -2282,10 +2301,10 @@ SB_L_08A7ACB8: 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); + const std::uint32_t vfpu_address = tier2_gpr_29 + static_cast(0); const std::uint32_t tier2_vfpu_words[4]{std::bit_cast(vfpu_value[0]), std::bit_cast(vfpu_value[1]), std::bit_cast(vfpu_value[2]), std::bit_cast(vfpu_value[3])}; aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); } - { const std::uint32_t vfpu_address = ctx.gpr[29] + static_cast(0); + { const std::uint32_t vfpu_address = tier2_gpr_29 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -2298,11 +2317,11 @@ SB_L_08A7ACB8: 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_gpr_4 = (ctx.vfpu_scalar_bits_ct<28u>()); + ctx.fpr[12] = std::bit_cast(tier2_gpr_4); + tier2_gpr_31 = (0x08A7ACECu); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 165u, 0x089451D8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7ACECu) goto SB_L_08A7ACEC; TIER2_SB_RETURN(); SB_L_08A7ACEC: @@ -2315,16 +2334,16 @@ SB_L_08A7ACEC: } SB_L_08A7ACF4: - ctx.gpr[4] = (ctx.gpr[16] | 0u); - ctx.gpr[31] = (0x08A7AD00u); - ctx.gpr[5] = (0u | 0u); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + tier2_gpr_31 = (0x08A7AD00u); + tier2_gpr_5 = (0u | 0u); goto SB_L_08A7A664; SB_L_08A7AD00: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(10072))); + tier2_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; + tier2_gpr_4 = (static_cast(ctx.gpr[20]) < static_cast(tier2_gpr_4) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 != 0u; ctx.gpr[22] = (ctx.gpr[22] + static_cast(4)); if (branch_taken) { goto SB_L_08A7AAB0; @@ -2333,61 +2352,61 @@ SB_L_08A7AD00: } SB_L_08A7AD14: - ctx.gpr[31] = (0x08A7AD1Cu); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 142u, 0x08945050u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7AD1Cu) goto SB_L_08A7AD1C; TIER2_SB_RETURN(); SB_L_08A7AD1C: - ctx.gpr[31] = (0x08A7AD24u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0126_entry, 126u, 361u, 0x089FD7E4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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))); + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5856))); + if (tier2_gpr_4 != 0u) { + tier2_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); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0216_entry, 216u, 399u, 0x08B65A54u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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))); + tier2_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_gpr_31 = (0x08A7AD48u); + tier2_gpr_16 = (2236u << 16u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0000_entry, 0u, 199u, 0x08805630u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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_gpr_4 = (0u | 11u); + tier2_gpr_31 = (0x08A7AD54u); + tier2_gpr_5 = (0u | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 203u, 0x08861668u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(29552))); + tier2_gpr_5 = (5888u << 16u); + aot_mem.aot_store32(tier2_gpr_4 + static_cast(0), tier2_gpr_5); + tier2_gpr_4 = (0u | 0u); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(29552))); + aot_mem.aot_store8(ctx.gpr[28] + static_cast(-24632), static_cast(tier2_gpr_4)); + tier2_gpr_4 = (tier2_gpr_5 + static_cast(4)); + aot_mem.aot_store32(tier2_gpr_16 + static_cast(29552), tier2_gpr_4); { std::uint32_t tier2_words[10]{}; - if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(40), tier2_words)) { - ctx.gpr[16] = tier2_words[0]; + if (aot_mem.aot_try_load32_block(tier2_gpr_29 + static_cast(40), tier2_words)) { + tier2_gpr_16 = tier2_words[0]; ctx.gpr[17] = tier2_words[1]; ctx.gpr[18] = tier2_words[2]; ctx.gpr[19] = tier2_words[3]; @@ -2396,41 +2415,41 @@ SB_L_08A7AD54: ctx.gpr[22] = tier2_words[6]; ctx.gpr[23] = tier2_words[7]; ctx.gpr[30] = tier2_words[8]; - ctx.gpr[31] = tier2_words[9]; + tier2_gpr_31 = tier2_words[9]; } else { - 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))); + tier2_gpr_16 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(40))); + ctx.gpr[17] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(44))); + ctx.gpr[18] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(48))); + ctx.gpr[19] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(52))); + ctx.gpr[20] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(56))); + ctx.gpr[21] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(60))); + ctx.gpr[22] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(64))); + ctx.gpr[23] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(68))); + ctx.gpr[30] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(72))); + tier2_gpr_31 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(76))); } } - jump_target = ctx.gpr[31]; - ctx.gpr[29] = (ctx.gpr[29] + static_cast(80)); + jump_target = tier2_gpr_31; + tier2_gpr_29 = (tier2_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))); + tier2_gpr_29 = (tier2_gpr_29 + static_cast(-16)); + tier2_gpr_6 = (2236u << 16u); + ctx.gpr[7] = (aot_mem.aot_load32(tier2_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; + ctx.gpr[7] = (aot_mem.aot_load32(tier2_gpr_6 + static_cast(29552))); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(0), tier2_gpr_16); + tier2_gpr_16 = (tier2_gpr_5 & 255u); + tier2_gpr_5 = (ctx.gpr[7] + static_cast(4)); + aot_mem.aot_store32(tier2_gpr_6 + static_cast(29552), tier2_gpr_5); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(72))); + tier2_gpr_5 = (32u << 16u); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(4), tier2_gpr_31); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7AFD0; @@ -2439,13 +2458,13 @@ SB_L_08A7AF74: } SB_L_08A7AFB8: - ctx.gpr[31] = (0x08A7AFC0u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0200_entry, 200u, 432u, 0x08B26030u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7AFC0u) goto SB_L_08A7AFC0; TIER2_SB_RETURN(); SB_L_08A7AFC0: - { const bool branch_taken = ctx.gpr[16] == 0u; + { const bool branch_taken = tier2_gpr_16 == 0u; // nop if (branch_taken) { goto SB_L_08A7AFD0; @@ -2454,60 +2473,60 @@ SB_L_08A7AFC0: } SB_L_08A7AFC8: - ctx.gpr[31] = (0x08A7AFD0u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0044_entry, 44u, 663u, 0x088B7A4Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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)); + tier2_gpr_16 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(0))); + tier2_gpr_31 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(4))); + jump_target = tier2_gpr_31; + tier2_gpr_29 = (tier2_gpr_29 + static_cast(16)); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0157; SB_L_08A7B5A0: - jump_target = ctx.gpr[31]; + jump_target = tier2_gpr_31; ctx.gpr[2] = (0u | 0u); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0157; SB_L_08A7B5A8: - jump_target = ctx.gpr[31]; + jump_target = tier2_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_gpr_29 = (tier2_gpr_29 + static_cast(-32)); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(16), tier2_gpr_16); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(20), tier2_gpr_31); + tier2_gpr_31 = (0x08A7B5C4u); + tier2_gpr_16 = (tier2_gpr_4 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0044_entry, 44u, 666u, 0x088B7AE4u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7B5C4u) goto SB_L_08A7B5C4; TIER2_SB_RETURN(); SB_L_08A7B5C4: - ctx.gpr[31] = (0x08A7B5CCu); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0044_entry, 44u, 670u, 0x088B7B84u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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_advance32(ctx.gpr[4] + static_cast(29552)); - 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); + tier2_gpr_4 = (2236u << 16u); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(29552))); + tier2_gpr_6 = (51457u << 16u); + tier2_gpr_6 = (tier2_gpr_6 + static_cast(256)); + aot_mem.aot_store32(tier2_gpr_5 + static_cast(0), tier2_gpr_6); + tier2_gpr_5 = aot_mem.aot_advance32(tier2_gpr_4 + static_cast(29552)); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_6 = (32u << 16u); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_6); + { const bool branch_taken = tier2_gpr_4 == 0u; + tier2_gpr_4 = (15820u << 16u); if (branch_taken) { goto SB_L_08A7B61C; } @@ -2515,16 +2534,16 @@ SB_L_08A7B5CC: } 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_gpr_4 = (tier2_gpr_4 | 52429u); + tier2_gpr_31 = (0x08A7B610u); + ctx.fpr[12] = std::bit_cast(tier2_gpr_4); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0044_entry, 44u, 644u, 0x088B76E8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7B610u) goto SB_L_08A7B610; TIER2_SB_RETURN(); SB_L_08A7B610: - ctx.gpr[4] = (0u | 1u); + tier2_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])); + aot_mem.aot_store8(ctx.gpr[28] + static_cast(-17675), static_cast(tier2_gpr_4)); if (branch_taken) { goto SB_L_08A7B65C; } @@ -2532,8 +2551,8 @@ SB_L_08A7B610: } SB_L_08A7B61C: - ctx.gpr[4] = (ctx.gpr[16] + static_cast(48)); - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + tier2_gpr_4 = (tier2_gpr_16 + static_cast(48)); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -2542,18 +2561,18 @@ SB_L_08A7B61C: std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); - const std::uint32_t vfpu_address = ctx.gpr[29] + static_cast(0); + const std::uint32_t vfpu_address = tier2_gpr_29 + static_cast(0); const std::uint32_t tier2_vfpu_words[4]{std::bit_cast(vfpu_value[0]), std::bit_cast(vfpu_value[1]), std::bit_cast(vfpu_value[2]), std::bit_cast(vfpu_value[3])}; aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); } - 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_gpr_31 = (0x08A7B630u); + tier2_gpr_4 = (tier2_gpr_29 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0200_entry, 200u, 414u, 0x08B25E10u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]); + tier2_gpr_4 = (16256u << 16u); + ctx.fpr[13] = std::bit_cast(tier2_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); @@ -2565,9 +2584,9 @@ SB_L_08A7B630: } SB_L_08A7B64C: - ctx.gpr[31] = (0x08A7B654u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0044_entry, 44u, 661u, 0x088B78CCu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7B654u) goto SB_L_08A7B654; TIER2_SB_RETURN(); SB_L_08A7B654: @@ -2584,31 +2603,31 @@ SB_L_08A7B65C: 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)); + tier2_gpr_16 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(16))); + tier2_gpr_31 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(20))); + jump_target = tier2_gpr_31; + tier2_gpr_29 = (tier2_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); + tier2_gpr_29 = (tier2_gpr_29 + static_cast(-16)); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(0), tier2_gpr_31); + tier2_gpr_31 = (0x08A7B920u); + tier2_gpr_5 = (tier2_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); - { const std::uint32_t tier2_words[4]{ctx.gpr[17], ctx.gpr[18], ctx.gpr[19], ctx.gpr[31]}; - aot_mem.aot_store32_block(ctx.gpr[29] + static_cast(124), tier2_words); } - { const bool branch_taken = ctx.gpr[5] == 0u; + tier2_gpr_29 = (tier2_gpr_29 + static_cast(-144)); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(120), tier2_gpr_16); + tier2_gpr_16 = (tier2_gpr_4 | 0u); + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(116), std::bit_cast(ctx.fpr[20])); + tier2_gpr_5 = (static_cast(tier2_gpr_4) < static_cast(tier2_gpr_5) ? 1u : 0u); + { const std::uint32_t tier2_words[4]{ctx.gpr[17], ctx.gpr[18], ctx.gpr[19], tier2_gpr_31}; + aot_mem.aot_store32_block(tier2_gpr_29 + static_cast(124), tier2_words); } + { const bool branch_taken = tier2_gpr_5 == 0u; ctx.gpr[17] = (0u | 0u); if (branch_taken) { goto SB_L_08A7CF0C; @@ -2617,16 +2636,16 @@ SB_L_08A7CEC8: } 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))); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); + tier2_gpr_4 = (tier2_gpr_4 << 2u); + tier2_gpr_4 = (tier2_gpr_5 + tier2_gpr_4); + ctx.gpr[17] = (aot_mem.aot_load32(tier2_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]; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (0u | 7466u); + { const bool branch_taken = tier2_gpr_4 != tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7CF28; @@ -2635,18 +2654,18 @@ SB_L_08A7CF0C: } SB_L_08A7CF1C: - ctx.gpr[4] = (17302u << 16u); - ctx.fpr[12] = std::bit_cast(ctx.gpr[4]); + tier2_gpr_4 = (17302u << 16u); + ctx.fpr[12] = std::bit_cast(tier2_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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 10u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7CF64; @@ -2655,9 +2674,9 @@ SB_L_08A7CF28: } 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_gpr_31 = (0x08A7CF4Cu); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0179_entry, 179u, 51u, 0x08AD0598u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7CF4Cu) goto SB_L_08A7CF4C; TIER2_SB_RETURN(); SB_L_08A7CF4C: @@ -2688,9 +2707,9 @@ SB_L_08A7CF5C: } 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]; + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(16))); + tier2_gpr_5 = (0u | 1u); + { const bool branch_taken = tier2_gpr_4 != tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D0A8; @@ -2699,12 +2718,12 @@ SB_L_08A7CF64: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 12u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7CFAC; @@ -2713,12 +2732,12 @@ SB_L_08A7CF74: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 8u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D0A8; @@ -2727,12 +2746,12 @@ SB_L_08A7CF90: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 8u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; ctx.gpr[18] = (0u | 0u); if (branch_taken) { goto SB_L_08A7D008; @@ -2741,10 +2760,10 @@ SB_L_08A7CFAC: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_5 = (512u << 16u); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D008; @@ -2753,10 +2772,10 @@ SB_L_08A7CFC8: } 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; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); + tier2_gpr_5 = (static_cast(tier2_gpr_4) < static_cast(tier2_gpr_5) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_5 == 0u; ctx.gpr[18] = (0u | 0u); if (branch_taken) { goto SB_L_08A7D000; @@ -2765,10 +2784,10 @@ SB_L_08A7CFDC: } 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))); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); + tier2_gpr_4 = (tier2_gpr_4 << 2u); + tier2_gpr_4 = (tier2_gpr_5 + tier2_gpr_4); + ctx.gpr[18] = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(0))); goto SB_L_08A7D000; SB_L_08A7D000: @@ -2777,28 +2796,28 @@ SB_L_08A7D000: 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))); + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); + if (tier2_gpr_4 != 0u) { + tier2_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); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0216_entry, 216u, 413u, 0x08B65B0Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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))); + tier2_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_gpr_5 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_31 = (0x08A7D02Cu); + tier2_gpr_6 = (ctx.gpr[18] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 174u, 0x08954B84u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D02Cu) goto SB_L_08A7D02C; TIER2_SB_RETURN(); SB_L_08A7D02C: @@ -2812,12 +2831,12 @@ SB_L_08A7D02C: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_5 = (8u << 16u); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D080; @@ -2826,9 +2845,9 @@ SB_L_08A7D038: } 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_gpr_31 = (0x08A7D05Cu); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0179_entry, 179u, 50u, 0x08AD0530u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D05Cu) goto SB_L_08A7D05C; TIER2_SB_RETURN(); SB_L_08A7D05C: @@ -2841,8 +2860,8 @@ SB_L_08A7D05C: } SB_L_08A7D064: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); - { const bool branch_taken = ctx.gpr[4] == 0u; + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D088; @@ -2852,7 +2871,7 @@ SB_L_08A7D064: SB_L_08A7D070: { const bool branch_taken = 0u == 0u; - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(5864))); if (branch_taken) { goto SB_L_08A7D094; } @@ -2878,20 +2897,20 @@ SB_L_08A7D080: } SB_L_08A7D088: - ctx.gpr[31] = (0x08A7D090u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0216_entry, 216u, 413u, 0x08B65B0Cu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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))); + tier2_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_gpr_5 = (ctx.gpr[18] | 0u); + tier2_gpr_31 = (0x08A7D0A0u); + tier2_gpr_6 = (tier2_gpr_16 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0084_entry, 84u, 191u, 0x08954C44u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D0A0u) goto SB_L_08A7D0A0; TIER2_SB_RETURN(); SB_L_08A7D0A0: @@ -2904,9 +2923,9 @@ SB_L_08A7D0A0: } 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]; + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(16))); + tier2_gpr_5 = (0u | 3u); + { const bool branch_taken = tier2_gpr_4 != tier2_gpr_5; ctx.gpr[18] = (0u | 1u); if (branch_taken) { goto SB_L_08A7D1A4; @@ -2916,12 +2935,12 @@ SB_L_08A7D0A8: 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_gpr_4 = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(64))); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(68))); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + tier2_gpr_31 = (0x08A7D0D0u); + tier2_gpr_5 = (tier2_gpr_5 & 255u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0079_entry, 79u, 248u, 0x08941B38u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D0D0u) goto SB_L_08A7D0D0; TIER2_SB_RETURN(); SB_L_08A7D0D0: @@ -2934,8 +2953,8 @@ SB_L_08A7D0D0: } SB_L_08A7D0D8: - ctx.gpr[4] = (0u + static_cast(-1)); - { const bool branch_taken = ctx.gpr[19] == ctx.gpr[4]; + tier2_gpr_4 = (0u + static_cast(-1)); + { const bool branch_taken = ctx.gpr[19] == tier2_gpr_4; // nop if (branch_taken) { goto SB_L_08A7D12C; @@ -2944,10 +2963,10 @@ SB_L_08A7D0D8: } 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); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); + tier2_gpr_5 = (static_cast(ctx.gpr[19]) < static_cast(tier2_gpr_5) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_5 == 0u; + tier2_gpr_4 = (0u | 0u); if (branch_taken) { goto SB_L_08A7D104; } @@ -2955,22 +2974,22 @@ SB_L_08A7D0E4: } 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))); + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); + tier2_gpr_5 = (ctx.gpr[19] << 2u); + tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_5); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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]); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(36))); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(48)); + tier2_gpr_6 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_5 + static_cast(0)))))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_5 + static_cast(4))); + jump_target = tier2_gpr_5; + tier2_gpr_31 = (0x08A7D11Cu); + tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_6); ctx.pc = jump_target; - if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7D11Cu) goto SB_L_08A7D11C; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D11Cu) goto SB_L_08A7D11C; TIER2_SB_RETURN(); SB_L_08A7D11C: @@ -2992,15 +3011,15 @@ SB_L_08A7D124: } 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(92))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(72)); + tier2_gpr_5 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_4 + static_cast(0)))))); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(4))); + jump_target = tier2_gpr_6; + tier2_gpr_31 = (0x08A7D144u); + tier2_gpr_4 = (tier2_gpr_16 + tier2_gpr_5); ctx.pc = jump_target; - if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7D144u) goto SB_L_08A7D144; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D144u) goto SB_L_08A7D144; TIER2_SB_RETURN(); SB_L_08A7D144: @@ -3013,8 +3032,8 @@ SB_L_08A7D144: } SB_L_08A7D14C: - ctx.gpr[4] = (0u + static_cast(-1)); - { const bool branch_taken = ctx.gpr[19] == ctx.gpr[4]; + tier2_gpr_4 = (0u + static_cast(-1)); + { const bool branch_taken = ctx.gpr[19] == tier2_gpr_4; // nop if (branch_taken) { goto SB_L_08A7D78C; @@ -3023,10 +3042,10 @@ SB_L_08A7D14C: } 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); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); + tier2_gpr_5 = (static_cast(ctx.gpr[19]) < static_cast(tier2_gpr_5) ? 1u : 0u); + { const bool branch_taken = tier2_gpr_5 == 0u; + tier2_gpr_4 = (0u | 0u); if (branch_taken) { goto SB_L_08A7D178; } @@ -3034,22 +3053,22 @@ SB_L_08A7D158: } 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))); + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(24))); + tier2_gpr_5 = (ctx.gpr[19] << 2u); + tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_5); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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]); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(36))); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(48)); + tier2_gpr_6 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_5 + static_cast(0)))))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_5 + static_cast(4))); + jump_target = tier2_gpr_5; + tier2_gpr_31 = (0x08A7D190u); + tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_6); ctx.pc = jump_target; - if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7D190u) goto SB_L_08A7D190; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D190u) goto SB_L_08A7D190; TIER2_SB_RETURN(); SB_L_08A7D190: @@ -3062,9 +3081,9 @@ SB_L_08A7D190: } SB_L_08A7D198: - ctx.gpr[4] = (0u | 255u); + tier2_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])); + aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(tier2_gpr_4)); if (branch_taken) { goto SB_L_08A7D78C; } @@ -3072,9 +3091,9 @@ SB_L_08A7D198: } 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]; + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(16))); + tier2_gpr_5 = (0u | 1u); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D6C4; @@ -3083,9 +3102,9 @@ SB_L_08A7D1A4: } 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]; + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(16))); + tier2_gpr_5 = (0u | 4u); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D6C4; @@ -3094,8 +3113,8 @@ SB_L_08A7D1B4: } SB_L_08A7D1C4: - ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-7080))); - { const bool branch_taken = ctx.gpr[4] == 0u; + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-7080))); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D464; @@ -3104,12 +3123,12 @@ SB_L_08A7D1C4: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 14u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D464; @@ -3118,19 +3137,19 @@ SB_L_08A7D1D0: } SB_L_08A7D1EC: - ctx.gpr[31] = (0x08A7D1F4u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 28u, 0x089602C8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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); + tier2_gpr_4 = (2237u << 16u); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(-28736)); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(104))); + tier2_gpr_6 = (tier2_gpr_5 + static_cast(4)); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_6 + static_cast(0))); + { const bool branch_taken = tier2_gpr_6 == 0u; + tier2_gpr_4 = (ctx.gpr[2] | 0u); if (branch_taken) { goto SB_L_08A7D244; } @@ -3138,24 +3157,24 @@ SB_L_08A7D1F4: } SB_L_08A7D210: - aot_mem.aot_store8(ctx.gpr[29] + static_cast(92), static_cast(0u)); + aot_mem.aot_store8(tier2_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] = (aot_mem.aot_load32(tier2_gpr_6 + static_cast(16))); + ctx.gpr[7] = (ctx.gpr[7] < tier2_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)); + tier2_gpr_6 = (tier2_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)); + tier2_gpr_5 = (tier2_gpr_6 | 0u); + tier2_gpr_6 = (tier2_gpr_5 + static_cast(8)); { const bool branch_taken = 0u == 0u; - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_6 + static_cast(0))); if (branch_taken) { goto SB_L_08A7D23C; } @@ -3163,33 +3182,33 @@ SB_L_08A7D228: } SB_L_08A7D238: - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_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)); + if (tier2_gpr_6 != 0u) { + aot_mem.aot_store8(tier2_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); + tier2_gpr_6 = (2237u << 16u); + tier2_gpr_6 = (tier2_gpr_6 + static_cast(-28736)); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_6 + static_cast(104))); + if (tier2_gpr_5 == tier2_gpr_6) { + tier2_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); + aot_mem.aot_store8(tier2_gpr_29 + static_cast(93), static_cast(0u)); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_5 + static_cast(16))); + tier2_gpr_4 = (tier2_gpr_4 < tier2_gpr_6 ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; + tier2_gpr_4 = (2237u << 16u); if (branch_taken) { goto SB_L_08A7D280; } @@ -3197,38 +3216,38 @@ SB_L_08A7D258: } SB_L_08A7D270: - ctx.gpr[4] = (2237u << 16u); + tier2_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); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(-28736)); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(104))); + tier2_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))); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(88), tier2_gpr_5); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(-28736)); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(104))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(88))); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(104), tier2_gpr_4); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(84), tier2_gpr_5); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(104))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(84))); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(80), tier2_gpr_4); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(80))); + tier2_gpr_4 = (tier2_gpr_5 ^ tier2_gpr_4); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + if (tier2_gpr_4 == 0u) { + tier2_gpr_4 = (aot_mem.aot_load32(tier2_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); + tier2_gpr_4 = (0u | 0u); if (branch_taken) { goto SB_L_08A7D2C8; } @@ -3236,11 +3255,11 @@ SB_L_08A7D2BC: } SB_L_08A7D2C4: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(20))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(20))); goto SB_L_08A7D2C8; SB_L_08A7D2C8: - { const bool branch_taken = ctx.gpr[4] == 0u; + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D45C; @@ -3249,9 +3268,9 @@ SB_L_08A7D2C8: } 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); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(352))); + { const bool branch_taken = tier2_gpr_4 != tier2_gpr_5; + tier2_gpr_4 = (2236u << 16u); if (branch_taken) { goto SB_L_08A7D45C; } @@ -3259,19 +3278,19 @@ SB_L_08A7D2D0: } 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]; + tier2_gpr_4 = (tier2_gpr_4 + static_cast(32304)); + tier2_gpr_5 = (aot_mem.aot_load8(tier2_gpr_4 + static_cast(80))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(112)); + tier2_gpr_5 = (tier2_gpr_5 << 5u); + tier2_gpr_6 = (0u - tier2_gpr_5); + tier2_gpr_5 = (tier2_gpr_5 << 2u); + tier2_gpr_6 = (tier2_gpr_6 + tier2_gpr_5); + tier2_gpr_5 = (tier2_gpr_5 << 2u); + ctx.gpr[17] = (tier2_gpr_6 + tier2_gpr_5); + ctx.gpr[17] = (ctx.gpr[17] + tier2_gpr_4); + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + tier2_gpr_5 = (0u | 16u); + { const bool branch_taken = tier2_gpr_4 != tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D45C; @@ -3280,15 +3299,15 @@ SB_L_08A7D2DC: } SB_L_08A7D314: - ctx.gpr[31] = (0x08A7D31Cu); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 28u, 0x089602C8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]; + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[2] + static_cast(852))); + tier2_gpr_5 = (0u | 6u); + { const bool branch_taken = tier2_gpr_4 != tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D344; @@ -3297,15 +3316,15 @@ SB_L_08A7D31C: } SB_L_08A7D32C: - ctx.gpr[31] = (0x08A7D334u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 28u, 0x089602C8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[2] + static_cast(1280)))))); + tier2_gpr_4 = (tier2_gpr_4 & 16u); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7D45C; @@ -3314,8 +3333,8 @@ SB_L_08A7D334: } SB_L_08A7D344: - ctx.gpr[4] = (0u | 3u); - { const bool branch_taken = ctx.gpr[17] == ctx.gpr[4]; + tier2_gpr_4 = (0u | 3u); + { const bool branch_taken = ctx.gpr[17] == tier2_gpr_4; // nop if (branch_taken) { goto SB_L_08A7D3D4; @@ -3324,9 +3343,9 @@ SB_L_08A7D344: } 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]; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (0u | 246u); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D3D4; @@ -3335,9 +3354,9 @@ SB_L_08A7D350: } 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]; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (0u | 237u); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D3D4; @@ -3346,10 +3365,10 @@ SB_L_08A7D360: } 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); + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (0u + static_cast(-966)); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; + tier2_gpr_4 = (2236u << 16u); if (branch_taken) { goto SB_L_08A7D3D4; } @@ -3357,9 +3376,9 @@ SB_L_08A7D370: } 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; + tier2_gpr_4 = (tier2_gpr_4 + static_cast(32304)); + tier2_gpr_4 = (aot_mem.aot_load8(tier2_gpr_4 + static_cast(1956))); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7D3D4; @@ -3377,12 +3396,12 @@ SB_L_08A7D390: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); + tier2_gpr_5 = (1u << 16u); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D3C4; @@ -3391,9 +3410,9 @@ SB_L_08A7D398: } 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]; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(380))); + tier2_gpr_5 = (0u | 4u); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D3D4; @@ -3420,11 +3439,11 @@ SB_L_08A7D3CC: } SB_L_08A7D3D4: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); ctx.gpr[2] = (0u | 2u); - ctx.gpr[4] = (ctx.gpr[4] | 32u); + tier2_gpr_4 = (tier2_gpr_4 | 32u); { const bool branch_taken = 0u == 0u; - aot_mem.aot_store32(ctx.gpr[16] + static_cast(76), ctx.gpr[4]); + aot_mem.aot_store32(tier2_gpr_16 + static_cast(76), tier2_gpr_4); if (branch_taken) { goto SB_L_08A7DB9C; } @@ -3432,15 +3451,15 @@ SB_L_08A7D3D4: } SB_L_08A7D3E8: - ctx.gpr[31] = (0x08A7D3F0u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 28u, 0x089602C8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]; + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[2] + static_cast(852))); + tier2_gpr_5 = (0u | 1u); + { const bool branch_taken = tier2_gpr_4 != tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D440; @@ -3449,9 +3468,9 @@ SB_L_08A7D3F0: } 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]; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (0u | 214u); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D440; @@ -3460,9 +3479,9 @@ SB_L_08A7D400: } 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]; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (0u | 250u); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D440; @@ -3471,9 +3490,9 @@ SB_L_08A7D410: } 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]; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (0u | 219u); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D440; @@ -3482,9 +3501,9 @@ SB_L_08A7D420: } 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]; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (0u | 278u); + { const bool branch_taken = tier2_gpr_4 != tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D45C; @@ -3493,11 +3512,11 @@ SB_L_08A7D430: } 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]); + aot_mem.aot_store32(ctx.gpr[28] + static_cast(10080), tier2_gpr_16); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); + tier2_gpr_5 = (0u + static_cast(-33)); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + aot_mem.aot_store32(tier2_gpr_16 + static_cast(76), tier2_gpr_4); { const bool branch_taken = 0u == 0u; ctx.gpr[2] = (0u | 2u); if (branch_taken) { @@ -3516,14 +3535,14 @@ SB_L_08A7D45C: } SB_L_08A7D464: - ctx.gpr[31] = (0x08A7D46Cu); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 28u, 0x089602C8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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); + { const bool branch_taken = ctx.gpr[2] != tier2_gpr_16; + tier2_gpr_4 = (2236u << 16u); if (branch_taken) { goto SB_L_08A7D60C; } @@ -3531,19 +3550,19 @@ SB_L_08A7D46C: } 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]; + tier2_gpr_4 = (tier2_gpr_4 + static_cast(32304)); + tier2_gpr_5 = (aot_mem.aot_load8(tier2_gpr_4 + static_cast(80))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(112)); + tier2_gpr_5 = (tier2_gpr_5 << 5u); + tier2_gpr_6 = (0u - tier2_gpr_5); + tier2_gpr_5 = (tier2_gpr_5 << 2u); + tier2_gpr_6 = (tier2_gpr_6 + tier2_gpr_5); + tier2_gpr_5 = (tier2_gpr_5 << 2u); + ctx.gpr[17] = (tier2_gpr_6 + tier2_gpr_5); + ctx.gpr[17] = (ctx.gpr[17] + tier2_gpr_4); + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(ctx.gpr[17] + static_cast(0)))))); + tier2_gpr_5 = (0u | 16u); + { const bool branch_taken = tier2_gpr_4 != tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D60C; @@ -3552,17 +3571,17 @@ SB_L_08A7D474: } 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; + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(7800))); + tier2_gpr_5 = (tier2_gpr_4 + tier2_gpr_4); + tier2_gpr_6 = (tier2_gpr_4 << 8u); + tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_5); + tier2_gpr_4 = (tier2_gpr_4 << 5u); + tier2_gpr_5 = (2238u << 16u); + tier2_gpr_4 = (tier2_gpr_6 + tier2_gpr_4); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(-6992)); + tier2_gpr_4 = (tier2_gpr_4 + tier2_gpr_5); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(4))); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7D60C; @@ -3571,15 +3590,15 @@ SB_L_08A7D4AC: } SB_L_08A7D4DC: - ctx.gpr[31] = (0x08A7D4E4u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 28u, 0x089602C8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]; + tier2_gpr_4 = (aot_mem.aot_load32(ctx.gpr[2] + static_cast(852))); + tier2_gpr_5 = (0u | 6u); + { const bool branch_taken = tier2_gpr_4 != tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D50C; @@ -3588,15 +3607,15 @@ SB_L_08A7D4E4: } SB_L_08A7D4F4: - ctx.gpr[31] = (0x08A7D4FCu); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0087_entry, 87u, 28u, 0x089602C8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[2] + static_cast(1280)))))); + tier2_gpr_4 = (tier2_gpr_4 & 16u); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7D60C; @@ -3605,8 +3624,8 @@ SB_L_08A7D4FC: } SB_L_08A7D50C: - ctx.gpr[4] = (0u | 3u); - { const bool branch_taken = ctx.gpr[17] == ctx.gpr[4]; + tier2_gpr_4 = (0u | 3u); + { const bool branch_taken = ctx.gpr[17] == tier2_gpr_4; // nop if (branch_taken) { goto SB_L_08A7D590; @@ -3615,9 +3634,9 @@ SB_L_08A7D50C: } 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]; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (0u | 246u); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D590; @@ -3626,9 +3645,9 @@ SB_L_08A7D518: } 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]; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (0u | 237u); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D590; @@ -3637,10 +3656,10 @@ SB_L_08A7D528: } 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); + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (0u + static_cast(-966)); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; + tier2_gpr_4 = (2236u << 16u); if (branch_taken) { goto SB_L_08A7D590; } @@ -3648,9 +3667,9 @@ SB_L_08A7D538: } 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; + tier2_gpr_4 = (tier2_gpr_4 + static_cast(32304)); + tier2_gpr_4 = (aot_mem.aot_load8(tier2_gpr_4 + static_cast(1956))); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7D590; @@ -3668,13 +3687,13 @@ SB_L_08A7D558: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(352))); + tier2_gpr_5 = (16384u << 16u); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(208))); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + tier2_gpr_4 = (0u < tier2_gpr_4 ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7D590; @@ -3693,7 +3712,7 @@ SB_L_08A7D580: SB_L_08A7D588: { const bool branch_taken = 0u == 0u; - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(852))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(852))); if (branch_taken) { goto SB_L_08A7D5A4; } @@ -3701,11 +3720,11 @@ SB_L_08A7D588: } SB_L_08A7D590: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); ctx.gpr[2] = (0u | 2u); - ctx.gpr[4] = (ctx.gpr[4] | 32u); + tier2_gpr_4 = (tier2_gpr_4 | 32u); { const bool branch_taken = 0u == 0u; - aot_mem.aot_store32(ctx.gpr[16] + static_cast(76), ctx.gpr[4]); + aot_mem.aot_store32(tier2_gpr_16 + static_cast(76), tier2_gpr_4); if (branch_taken) { goto SB_L_08A7DB9C; } @@ -3713,8 +3732,8 @@ SB_L_08A7D590: } SB_L_08A7D5A4: - ctx.gpr[5] = (0u | 1u); - { const bool branch_taken = ctx.gpr[4] != ctx.gpr[5]; + tier2_gpr_5 = (0u | 1u); + { const bool branch_taken = tier2_gpr_4 != tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D5F0; @@ -3723,9 +3742,9 @@ SB_L_08A7D5A4: } 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]; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (0u | 214u); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D5F0; @@ -3734,9 +3753,9 @@ SB_L_08A7D5B0: } 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]; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (0u | 250u); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D5F0; @@ -3745,9 +3764,9 @@ SB_L_08A7D5C0: } 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]; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (0u | 219u); + { const bool branch_taken = tier2_gpr_4 == tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D5F0; @@ -3756,9 +3775,9 @@ SB_L_08A7D5D0: } 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]; + tier2_gpr_4 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_16 + static_cast(86)))))); + tier2_gpr_5 = (0u | 278u); + { const bool branch_taken = tier2_gpr_4 != tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D60C; @@ -3767,11 +3786,11 @@ SB_L_08A7D5E0: } 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]); + aot_mem.aot_store32(ctx.gpr[28] + static_cast(10080), tier2_gpr_16); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); + tier2_gpr_5 = (0u + static_cast(-33)); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + aot_mem.aot_store32(tier2_gpr_16 + static_cast(76), tier2_gpr_4); { const bool branch_taken = 0u == 0u; ctx.gpr[2] = (0u | 2u); if (branch_taken) { @@ -3781,8 +3800,8 @@ SB_L_08A7D5F0: } SB_L_08A7D60C: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(80))); - { const bool branch_taken = ctx.gpr[4] == 0u; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(80))); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D66C; @@ -3791,10 +3810,10 @@ SB_L_08A7D60C: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_5 = (8u << 16u); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D66C; @@ -3803,9 +3822,9 @@ SB_L_08A7D618: } 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_gpr_31 = (0x08A7D634u); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0179_entry, 179u, 50u, 0x08AD0530u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D634u) goto SB_L_08A7D634; TIER2_SB_RETURN(); SB_L_08A7D634: @@ -3818,9 +3837,9 @@ SB_L_08A7D634: } 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_gpr_31 = (0x08A7D644u); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0195_entry, 195u, 375u, 0x08B11994u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D644u) goto SB_L_08A7D644; TIER2_SB_RETURN(); SB_L_08A7D644: @@ -3833,9 +3852,9 @@ SB_L_08A7D644: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); + tier2_gpr_4 = (tier2_gpr_4 & 16u); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7D674; @@ -3871,8 +3890,8 @@ SB_L_08A7D66C: } SB_L_08A7D674: - ctx.gpr[4] = (ctx.gpr[16] + static_cast(48)); - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + tier2_gpr_4 = (tier2_gpr_16 + static_cast(48)); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -3880,8 +3899,8 @@ SB_L_08A7D674: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; 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); + tier2_gpr_4 = (ctx.gpr[28] + static_cast(10048)); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -3894,12 +3913,12 @@ SB_L_08A7D674: 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)); + tier2_gpr_4 = (tier2_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); + const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); const std::uint32_t tier2_vfpu_words[4]{std::bit_cast(vfpu_value[0]), std::bit_cast(vfpu_value[1]), std::bit_cast(vfpu_value[2]), std::bit_cast(vfpu_value[3])}; aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); } - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -3912,18 +3931,18 @@ SB_L_08A7D674: 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_gpr_4 = (ctx.vfpu_scalar_bits_ct<28u>()); + ctx.fpr[12] = std::bit_cast(tier2_gpr_4); + tier2_gpr_31 = (0x08A7D6ACu); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 165u, 0x089451D8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); + tier2_gpr_5 = (0u + static_cast(-129)); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + aot_mem.aot_store32(tier2_gpr_16 + static_cast(76), tier2_gpr_4); { const bool branch_taken = 0u == 0u; ctx.gpr[2] = (0u | 0u); if (branch_taken) { @@ -3933,9 +3952,9 @@ SB_L_08A7D6AC: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); + tier2_gpr_4 = (tier2_gpr_4 & 4096u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D78C; @@ -3944,8 +3963,8 @@ SB_L_08A7D6C4: } SB_L_08A7D6D4: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(80))); - { const bool branch_taken = ctx.gpr[4] == 0u; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(80))); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D734; @@ -3954,10 +3973,10 @@ SB_L_08A7D6D4: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_5 = (8u << 16u); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D734; @@ -3966,9 +3985,9 @@ SB_L_08A7D6E0: } 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_gpr_31 = (0x08A7D6FCu); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0179_entry, 179u, 50u, 0x08AD0530u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D6FCu) goto SB_L_08A7D6FC; TIER2_SB_RETURN(); SB_L_08A7D6FC: @@ -3981,9 +4000,9 @@ SB_L_08A7D6FC: } 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_gpr_31 = (0x08A7D70Cu); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0195_entry, 195u, 375u, 0x08B11994u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D70Cu) goto SB_L_08A7D70C; TIER2_SB_RETURN(); SB_L_08A7D70C: @@ -3996,9 +4015,9 @@ SB_L_08A7D70C: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); + tier2_gpr_4 = (tier2_gpr_4 & 16u); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7D73C; @@ -4034,8 +4053,8 @@ SB_L_08A7D734: } SB_L_08A7D73C: - ctx.gpr[4] = (ctx.gpr[16] + static_cast(48)); - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + tier2_gpr_4 = (tier2_gpr_16 + static_cast(48)); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -4043,8 +4062,8 @@ SB_L_08A7D73C: std::bit_cast(tier2_vfpu_words[2]), std::bit_cast(tier2_vfpu_words[3])}; 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); + tier2_gpr_4 = (ctx.gpr[28] + static_cast(10048)); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -4057,12 +4076,12 @@ SB_L_08A7D73C: 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)); + tier2_gpr_4 = (tier2_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); + const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); const std::uint32_t tier2_vfpu_words[4]{std::bit_cast(vfpu_value[0]), std::bit_cast(vfpu_value[1]), std::bit_cast(vfpu_value[2]), std::bit_cast(vfpu_value[3])}; aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); } - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -4075,18 +4094,18 @@ SB_L_08A7D73C: 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_gpr_4 = (ctx.vfpu_scalar_bits_ct<28u>()); + ctx.fpr[12] = std::bit_cast(tier2_gpr_4); + tier2_gpr_31 = (0x08A7D774u); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 165u, 0x089451D8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); + tier2_gpr_5 = (0u + static_cast(-129)); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + aot_mem.aot_store32(tier2_gpr_16 + static_cast(76), tier2_gpr_4); { const bool branch_taken = 0u == 0u; ctx.gpr[2] = (0u | 0u); if (branch_taken) { @@ -4096,8 +4115,8 @@ SB_L_08A7D774: } SB_L_08A7D78C: - ctx.gpr[4] = (ctx.gpr[16] + static_cast(48)); - { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + tier2_gpr_4 = (tier2_gpr_16 + static_cast(48)); + { const std::uint32_t vfpu_address = tier2_gpr_4 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -4106,17 +4125,17 @@ SB_L_08A7D78C: std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); - const std::uint32_t vfpu_address = ctx.gpr[29] + static_cast(0); + const std::uint32_t vfpu_address = tier2_gpr_29 + static_cast(0); const std::uint32_t tier2_vfpu_words[4]{std::bit_cast(vfpu_value[0]), std::bit_cast(vfpu_value[1]), std::bit_cast(vfpu_value[2]), std::bit_cast(vfpu_value[3])}; aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); } - 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_gpr_5 = (ctx.gpr[28] + static_cast(10048)); + tier2_gpr_31 = (0x08A7D7A4u); + tier2_gpr_4 = (tier2_gpr_29 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0163_entry, 163u, 464u, 0x08A931D0u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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); + { const std::uint32_t vfpu_address = tier2_gpr_29 + static_cast(0); std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ std::bit_cast(tier2_vfpu_words[0]), @@ -4129,10 +4148,10 @@ SB_L_08A7D7A4: 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]); + tier2_gpr_4 = (ctx.vfpu_scalar_bits_ct<28u>()); + ctx.fpr[20] = std::bit_cast(tier2_gpr_4); + tier2_gpr_4 = (17317u << 16u); + ctx.fpr[12] = std::bit_cast(tier2_gpr_4); ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[20] <= ctx.fpr[12])) ? 0x00800000u : 0u); // nop { const bool branch_taken = ((ctx.fcr31 & 0x00800000u) != 0u); @@ -4144,9 +4163,9 @@ SB_L_08A7D7A4: } 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_gpr_31 = (0x08A7D7D8u); + tier2_gpr_4 = (ctx.gpr[17] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0170_entry, 170u, 396u, 0x08AAE0ECu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D7D8u) goto SB_L_08A7D7D8; TIER2_SB_RETURN(); SB_L_08A7D7D8: @@ -4161,9 +4180,9 @@ SB_L_08A7D7D8: } 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_gpr_31 = (0x08A7D7F0u); + tier2_gpr_4 = (ctx.gpr[17] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0170_entry, 170u, 396u, 0x08AAE0ECu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D7F0u) goto SB_L_08A7D7F0; TIER2_SB_RETURN(); SB_L_08A7D7F0: @@ -4171,12 +4190,12 @@ SB_L_08A7D7F0: 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_4 = (tier2_gpr_4 & 14u); + tier2_gpr_4 = (tier2_gpr_4 ^ 8u); + tier2_gpr_4 = (tier2_gpr_4 < static_cast(1) ? 1u : 0u); + tier2_gpr_4 = (tier2_gpr_4 & 255u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D84C; @@ -4185,10 +4204,10 @@ SB_L_08A7D7F4: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_5 = (512u << 16u); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D84C; @@ -4197,18 +4216,18 @@ SB_L_08A7D810: } 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))); + tier2_gpr_4 = (0u | 1u); + if (tier2_gpr_4 == 0u) { + tier2_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); + tier2_gpr_4 = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + tier2_gpr_4 = (tier2_gpr_4 | 8u); { const bool branch_taken = 0u == 0u; - aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(ctx.gpr[4])); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(tier2_gpr_4)); if (branch_taken) { goto SB_L_08A7D84C; } @@ -4216,16 +4235,16 @@ SB_L_08A7D830: } 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])); + tier2_gpr_5 = (0u + static_cast(-9)); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(tier2_gpr_4)); goto SB_L_08A7D84C; SB_L_08A7D84C: - ctx.gpr[4] = (ctx.gpr[17] | 0u); - ctx.gpr[31] = (0x08A7D858u); + tier2_gpr_4 = (ctx.gpr[17] | 0u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0170_entry, 170u, 384u, 0x08AAE058u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D858u) goto SB_L_08A7D858; TIER2_SB_RETURN(); SB_L_08A7D858: @@ -4239,18 +4258,18 @@ SB_L_08A7D858: } 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))); + tier2_gpr_4 = (0u | 0u); + if (tier2_gpr_4 == 0u) { + tier2_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); + tier2_gpr_4 = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + tier2_gpr_4 = (tier2_gpr_4 | 8u); { const bool branch_taken = 0u == 0u; - aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(ctx.gpr[4])); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(tier2_gpr_4)); if (branch_taken) { goto SB_L_08A7D88C; } @@ -4258,14 +4277,14 @@ SB_L_08A7D870: } 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])); + tier2_gpr_5 = (0u + static_cast(-9)); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(tier2_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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(80))); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7D8B0; @@ -4274,22 +4293,22 @@ SB_L_08A7D88C: } 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(92))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(64)); + tier2_gpr_5 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_4 + static_cast(0)))))); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(4))); + jump_target = tier2_gpr_6; + tier2_gpr_31 = (0x08A7D8B0u); + tier2_gpr_4 = (tier2_gpr_16 + tier2_gpr_5); ctx.pc = jump_target; - if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7D8B0u) goto SB_L_08A7D8B0; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 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]; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(80))); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(20))); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(20))); + { const bool branch_taken = tier2_gpr_5 == tier2_gpr_6; // nop if (branch_taken) { goto SB_L_08A7D8D0; @@ -4298,17 +4317,17 @@ SB_L_08A7D8B0: } 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_gpr_5 = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(20))); + tier2_gpr_31 = (0x08A7D8D0u); + tier2_gpr_6 = (0u | 4u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0085_entry, 85u, 455u, 0x0895B470u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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); + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(57))); + tier2_gpr_4 = (static_cast(tier2_gpr_4) < 239 ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 == 0u; + tier2_gpr_4 = (0u | 255u); if (branch_taken) { goto SB_L_08A7D8F0; } @@ -4316,10 +4335,10 @@ SB_L_08A7D8D0: } 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)); + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(57))); + tier2_gpr_4 = (tier2_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])); + aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(tier2_gpr_4)); if (branch_taken) { goto SB_L_08A7D8F4; } @@ -4327,12 +4346,12 @@ SB_L_08A7D8E0: } SB_L_08A7D8F0: - aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(ctx.gpr[4])); + aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(tier2_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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(80))); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D98C; @@ -4341,10 +4360,10 @@ SB_L_08A7D8F4: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_5 = (8u << 16u); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D98C; @@ -4353,9 +4372,9 @@ SB_L_08A7D900: } 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_gpr_31 = (0x08A7D91Cu); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0179_entry, 179u, 50u, 0x08AD0530u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D91Cu) goto SB_L_08A7D91C; TIER2_SB_RETURN(); SB_L_08A7D91C: @@ -4368,9 +4387,9 @@ SB_L_08A7D91C: } 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_gpr_31 = (0x08A7D92Cu); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0195_entry, 195u, 375u, 0x08B11994u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7D92Cu) goto SB_L_08A7D92C; TIER2_SB_RETURN(); SB_L_08A7D92C: @@ -4383,9 +4402,9 @@ SB_L_08A7D92C: } 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]; + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(57))); + tier2_gpr_5 = (0u | 255u); + { const bool branch_taken = tier2_gpr_4 != tier2_gpr_5; // nop if (branch_taken) { goto SB_L_08A7D95C; @@ -4394,9 +4413,9 @@ SB_L_08A7D934: } 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; + tier2_gpr_4 = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + tier2_gpr_4 = (tier2_gpr_4 & 64u); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7D9A0; @@ -4406,7 +4425,7 @@ SB_L_08A7D944: SB_L_08A7D954: { const bool branch_taken = 0u == 0u; - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(76))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); if (branch_taken) { goto SB_L_08A7D994; } @@ -4414,18 +4433,18 @@ SB_L_08A7D954: } SB_L_08A7D95C: - ctx.gpr[4] = (ctx.gpr[16] | 0u); - ctx.gpr[31] = (0x08A7D968u); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 165u, 0x089451D8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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))); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); ctx.gpr[2] = (0u | 0u); - ctx.gpr[4] = (ctx.gpr[4] | 128u); + tier2_gpr_4 = (tier2_gpr_4 | 128u); { const bool branch_taken = 0u == 0u; - aot_mem.aot_store32(ctx.gpr[16] + static_cast(76), ctx.gpr[4]); + aot_mem.aot_store32(tier2_gpr_16 + static_cast(76), tier2_gpr_4); if (branch_taken) { goto SB_L_08A7DB9C; } @@ -4433,8 +4452,8 @@ SB_L_08A7D968: } SB_L_08A7D97C: - ctx.gpr[4] = (0u | 255u); - aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(ctx.gpr[4])); + tier2_gpr_4 = (0u | 255u); + aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(tier2_gpr_4)); { const bool branch_taken = 0u == 0u; ctx.gpr[2] = (0u | 2u); if (branch_taken) { @@ -4453,8 +4472,8 @@ SB_L_08A7D98C: } SB_L_08A7D994: - ctx.gpr[4] = (ctx.gpr[4] & 16u); - { const bool branch_taken = ctx.gpr[4] == 0u; + tier2_gpr_4 = (tier2_gpr_4 & 16u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7D9C4; @@ -4463,17 +4482,17 @@ SB_L_08A7D994: } SB_L_08A7D9A0: - ctx.gpr[4] = (ctx.gpr[16] | 0u); - ctx.gpr[31] = (0x08A7D9ACu); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 165u, 0x089451D8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); + tier2_gpr_5 = (0u + static_cast(-129)); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + aot_mem.aot_store32(tier2_gpr_16 + static_cast(76), tier2_gpr_4); { const bool branch_taken = 0u == 0u; ctx.gpr[2] = (0u | 0u); if (branch_taken) { @@ -4492,9 +4511,9 @@ SB_L_08A7D9C4: } 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; + tier2_gpr_4 = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + tier2_gpr_4 = (tier2_gpr_4 & 32u); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7DA38; @@ -4503,18 +4522,18 @@ SB_L_08A7D9CC: } 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))); + tier2_gpr_4 = (0u | 0u); + if (tier2_gpr_4 == 0u) { + tier2_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); + tier2_gpr_4 = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + tier2_gpr_4 = (tier2_gpr_4 | 8u); { const bool branch_taken = 0u == 0u; - aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(ctx.gpr[4])); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(tier2_gpr_4)); if (branch_taken) { goto SB_L_08A7DA04; } @@ -4522,20 +4541,20 @@ SB_L_08A7D9E8: } 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])); + tier2_gpr_5 = (0u + static_cast(-9)); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(tier2_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_gpr_31 = (0x08A7DA0Cu); + tier2_gpr_4 = (ctx.gpr[17] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0170_entry, 170u, 396u, 0x08AAE0ECu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]); + tier2_gpr_4 = (16880u << 16u); + ctx.fpr[12] = std::bit_cast(tier2_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 @@ -4566,17 +4585,17 @@ SB_L_08A7DA30: } 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); + tier2_gpr_4 = (16800u << 16u); + ctx.fpr[12] = std::bit_cast(tier2_gpr_4); + tier2_gpr_4 = (ctx.gpr[17] | 0u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0170_entry, 170u, 401u, 0x08AAE140u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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; + tier2_gpr_4 = (0u | 0u); + { const bool branch_taken = tier2_gpr_4 == 0u; ctx.gpr[19] = (ctx.gpr[2] | 0u); if (branch_taken) { goto SB_L_08A7DA68; @@ -4585,10 +4604,10 @@ SB_L_08A7DA4C: } SB_L_08A7DA58: - ctx.gpr[4] = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); - ctx.gpr[4] = (ctx.gpr[4] | 8u); + tier2_gpr_4 = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + tier2_gpr_4 = (tier2_gpr_4 | 8u); { const bool branch_taken = 0u == 0u; - aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(ctx.gpr[4])); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(tier2_gpr_4)); if (branch_taken) { goto SB_L_08A7DA78; } @@ -4596,10 +4615,10 @@ SB_L_08A7DA58: } 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])); + tier2_gpr_4 = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(58))); + tier2_gpr_5 = (0u + static_cast(-9)); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(58), static_cast(tier2_gpr_4)); goto SB_L_08A7DA78; SB_L_08A7DA78: @@ -4612,8 +4631,8 @@ SB_L_08A7DA78: } SB_L_08A7DA80: - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(80))); - { const bool branch_taken = ctx.gpr[4] != 0u; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(80))); + { const bool branch_taken = tier2_gpr_4 != 0u; // nop if (branch_taken) { goto SB_L_08A7DAA4; @@ -4622,22 +4641,22 @@ SB_L_08A7DA80: } 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(92))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(64)); + tier2_gpr_5 = (static_cast(static_cast(static_cast(aot_mem.aot_load16(tier2_gpr_4 + static_cast(0)))))); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(4))); + jump_target = tier2_gpr_6; + tier2_gpr_31 = (0x08A7DAA4u); + tier2_gpr_4 = (tier2_gpr_16 + tier2_gpr_5); ctx.pc = jump_target; - if (rt.invoke_chained_call(ctx, &aot_mem) && ctx.pc == 0x08A7DAA4u) goto SB_L_08A7DAA4; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_call(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 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]; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(80))); + tier2_gpr_5 = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(20))); + tier2_gpr_6 = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(20))); + { const bool branch_taken = tier2_gpr_5 == tier2_gpr_6; // nop if (branch_taken) { goto SB_L_08A7DAC4; @@ -4646,17 +4665,17 @@ SB_L_08A7DAA4: } 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_gpr_5 = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(20))); + tier2_gpr_31 = (0x08A7DAC4u); + tier2_gpr_6 = (0u | 4u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0085_entry, 85u, 455u, 0x0895B470u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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); + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(57))); + tier2_gpr_4 = (static_cast(tier2_gpr_4) < 239 ? 1u : 0u); + { const bool branch_taken = tier2_gpr_4 == 0u; + tier2_gpr_4 = (0u | 255u); if (branch_taken) { goto SB_L_08A7DAE4; } @@ -4664,10 +4683,10 @@ SB_L_08A7DAC4: } 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)); + tier2_gpr_4 = (aot_mem.aot_load8(ctx.gpr[17] + static_cast(57))); + tier2_gpr_4 = (tier2_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])); + aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(tier2_gpr_4)); if (branch_taken) { goto SB_L_08A7DAE8; } @@ -4675,12 +4694,12 @@ SB_L_08A7DAD4: } SB_L_08A7DAE4: - aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(ctx.gpr[4])); + aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(tier2_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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(80))); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7DB20; @@ -4689,10 +4708,10 @@ SB_L_08A7DAE8: } 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; + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(72))); + tier2_gpr_5 = (8u << 16u); + tier2_gpr_4 = (tier2_gpr_4 & tier2_gpr_5); + { const bool branch_taken = tier2_gpr_4 == 0u; // nop if (branch_taken) { goto SB_L_08A7DB20; @@ -4701,9 +4720,9 @@ SB_L_08A7DAF4: } 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_gpr_31 = (0x08A7DB10u); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0179_entry, 179u, 50u, 0x08AD0530u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7DB10u) goto SB_L_08A7DB10; TIER2_SB_RETURN(); SB_L_08A7DB10: @@ -4734,9 +4753,9 @@ SB_L_08A7DB20: } 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_gpr_31 = (0x08A7DB30u); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0195_entry, 195u, 375u, 0x08B11994u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && ctx.pc == 0x08A7DB30u) goto SB_L_08A7DB30; TIER2_SB_RETURN(); SB_L_08A7DB30: @@ -4749,17 +4768,17 @@ SB_L_08A7DB30: } SB_L_08A7DB38: - ctx.gpr[4] = (ctx.gpr[16] | 0u); - ctx.gpr[31] = (0x08A7DB44u); + tier2_gpr_4 = (tier2_gpr_16 | 0u); + tier2_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; + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0080_entry, 80u, 165u, 0x089451D8u>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_16 + static_cast(76))); + tier2_gpr_4 = (tier2_gpr_4 | 128u); { const bool branch_taken = 0u == 0u; - aot_mem.aot_store32(ctx.gpr[16] + static_cast(76), ctx.gpr[4]); + aot_mem.aot_store32(tier2_gpr_16 + static_cast(76), tier2_gpr_4); if (branch_taken) { goto SB_L_08A7DB5C; } @@ -4767,8 +4786,8 @@ SB_L_08A7DB44: } SB_L_08A7DB54: - ctx.gpr[4] = (0u | 255u); - aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(ctx.gpr[4])); + tier2_gpr_4 = (0u | 255u); + aot_mem.aot_store8(ctx.gpr[17] + static_cast(57), static_cast(tier2_gpr_4)); goto SB_L_08A7DB5C; SB_L_08A7DB5C: @@ -4781,14 +4800,14 @@ SB_L_08A7DB5C: } 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_gpr_31 = (0x08A7DB6Cu); + tier2_gpr_4 = (ctx.gpr[17] | 0u); + if (([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (rt.invoke_chained_direct<&recomp_unit_0170_entry, 170u, 396u, 0x08AAE0ECu>(ctx, &aot_mem)); if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; return tier2_same_; }()) && 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]); + tier2_gpr_4 = (16968u << 16u); + ctx.fpr[12] = std::bit_cast(tier2_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 @@ -4824,35 +4843,35 @@ SB_L_08A7DB98: SB_L_08A7DB9C: { std::uint32_t tier2_words[6]{}; - if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(116), tier2_words)) { + if (aot_mem.aot_try_load32_block(tier2_gpr_29 + static_cast(116), tier2_words)) { ctx.fpr[20] = std::bit_cast(tier2_words[0]); - ctx.gpr[16] = tier2_words[1]; + tier2_gpr_16 = tier2_words[1]; ctx.gpr[17] = tier2_words[2]; ctx.gpr[18] = tier2_words[3]; ctx.gpr[19] = tier2_words[4]; - ctx.gpr[31] = tier2_words[5]; + tier2_gpr_31 = tier2_words[5]; } else { - 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))); + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_29 + static_cast(116))); + tier2_gpr_16 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(120))); + ctx.gpr[17] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(124))); + ctx.gpr[18] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(128))); + ctx.gpr[19] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(132))); + tier2_gpr_31 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(136))); } } - jump_target = ctx.gpr[31]; - ctx.gpr[29] = (ctx.gpr[29] + static_cast(144)); + jump_target = tier2_gpr_31; + tier2_gpr_29 = (tier2_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)); - { const std::uint32_t tier2_words[13]{ctx.gpr[5], std::bit_cast(ctx.fpr[20]), std::bit_cast(ctx.fpr[22]), ctx.gpr[16], ctx.gpr[17], ctx.gpr[18], ctx.gpr[19], ctx.gpr[20], ctx.gpr[21], ctx.gpr[22], ctx.gpr[23], ctx.gpr[30], ctx.gpr[31]}; - aot_mem.aot_store32_block(ctx.gpr[29] + static_cast(16), tier2_words); } - { const bool branch_taken = ctx.gpr[6] == 0u; - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + tier2_gpr_29 = (tier2_gpr_29 + static_cast(-80)); + tier2_gpr_5 = (0u | 12u); + tier2_gpr_6 = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-7080))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(8)); + { const std::uint32_t tier2_words[13]{tier2_gpr_5, std::bit_cast(ctx.fpr[20]), std::bit_cast(ctx.fpr[22]), tier2_gpr_16, ctx.gpr[17], ctx.gpr[18], ctx.gpr[19], ctx.gpr[20], ctx.gpr[21], ctx.gpr[22], ctx.gpr[23], ctx.gpr[30], tier2_gpr_31}; + aot_mem.aot_store32_block(tier2_gpr_29 + static_cast(16), tier2_words); } + { const bool branch_taken = tier2_gpr_6 == 0u; + aot_mem.aot_store32(tier2_gpr_29 + static_cast(12), tier2_gpr_4); if (branch_taken) { goto SB_L_08A7ECBC; } @@ -4860,16 +4879,16 @@ SB_L_08A7EC68: } SB_L_08A7ECB4: - ctx.gpr[4] = (0u | 3u); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[4]); + tier2_gpr_4 = (0u | 3u); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(16), tier2_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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(16))); + tier2_gpr_5 = (tier2_gpr_4 + static_cast(-1)); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(8), tier2_gpr_5); + { const bool branch_taken = tier2_gpr_4 == 0u; + aot_mem.aot_store32(tier2_gpr_29 + static_cast(16), tier2_gpr_5); if (branch_taken) { goto SB_L_08A7F048; } @@ -4877,18 +4896,18 @@ SB_L_08A7ECBC: } 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)); + tier2_gpr_4 = (ctx.gpr[28] + static_cast(-5492)); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(4), tier2_gpr_4); + tier2_gpr_4 = (49648u << 16u); + tier2_gpr_5 = (2280u << 16u); + ctx.fpr[20] = std::bit_cast(tier2_gpr_4); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(-29568)); ctx.gpr[30] = (2280u << 16u); ctx.gpr[23] = (2279u << 16u); - ctx.gpr[4] = (16880u << 16u); + tier2_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.fpr[22] = std::bit_cast(tier2_gpr_4); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(0), tier2_gpr_5); ctx.gpr[22] = (0u | 1u); ctx.gpr[21] = (0u | 3u); ctx.gpr[30] = (ctx.gpr[30] + static_cast(-21568)); @@ -4897,11 +4916,11 @@ SB_L_08A7ECD0: 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)); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(12))); + ctx.gpr[19] = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(0))); + tier2_gpr_4 = (tier2_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]); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(12), tier2_gpr_4); if (branch_taken) { goto SB_L_08A7F030; } @@ -4910,9 +4929,9 @@ SB_L_08A7ED14: 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]; + tier2_gpr_5 = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(84))); + tier2_gpr_4 = (aot_mem.aot_load16(ctx.gpr[28] + static_cast(-25492))); + { const bool branch_taken = tier2_gpr_5 == tier2_gpr_4; ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(8))); if (branch_taken) { goto SB_L_08A7F028; @@ -4921,13 +4940,13 @@ SB_L_08A7ED28: } 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); + tier2_gpr_6 = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(76))); + tier2_gpr_5 = (0u + static_cast(-1025)); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(84), static_cast(tier2_gpr_4)); + tier2_gpr_4 = (tier2_gpr_6 & tier2_gpr_5); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(76), tier2_gpr_4); + tier2_gpr_31 = (0x08A7ED58u); + tier2_gpr_4 = (ctx.gpr[17] | 0u); goto SB_L_08A7CEC8; SB_L_08A7F028: @@ -4940,12 +4959,12 @@ SB_L_08A7F028: } 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(16))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(8))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(-1)); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(8), tier2_gpr_4); + { const bool branch_taken = tier2_gpr_5 != 0u; + aot_mem.aot_store32(tier2_gpr_29 + static_cast(16), tier2_gpr_4); if (branch_taken) { goto SB_L_08A7ED14; } @@ -4954,10 +4973,10 @@ SB_L_08A7F030: SB_L_08A7F048: { std::uint32_t tier2_words[12]{}; - if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(20), tier2_words)) { + if (aot_mem.aot_try_load32_block(tier2_gpr_29 + static_cast(20), tier2_words)) { ctx.fpr[20] = std::bit_cast(tier2_words[0]); ctx.fpr[22] = std::bit_cast(tier2_words[1]); - ctx.gpr[16] = tier2_words[2]; + tier2_gpr_16 = tier2_words[2]; ctx.gpr[17] = tier2_words[3]; ctx.gpr[18] = tier2_words[4]; ctx.gpr[19] = tier2_words[5]; @@ -4966,35 +4985,35 @@ SB_L_08A7F048: ctx.gpr[22] = tier2_words[8]; ctx.gpr[23] = tier2_words[9]; ctx.gpr[30] = tier2_words[10]; - ctx.gpr[31] = tier2_words[11]; + tier2_gpr_31 = tier2_words[11]; } else { - 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))); + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_29 + static_cast(20))); + ctx.fpr[22] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_29 + static_cast(24))); + tier2_gpr_16 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(28))); + ctx.gpr[17] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(32))); + ctx.gpr[18] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(36))); + ctx.gpr[19] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(40))); + ctx.gpr[20] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(44))); + ctx.gpr[21] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(48))); + ctx.gpr[22] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(52))); + ctx.gpr[23] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(56))); + ctx.gpr[30] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(60))); + tier2_gpr_31 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(64))); } } - jump_target = ctx.gpr[31]; - ctx.gpr[29] = (ctx.gpr[29] + static_cast(80)); + jump_target = tier2_gpr_31; + tier2_gpr_29 = (tier2_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)); - { const std::uint32_t tier2_words[13]{ctx.gpr[5], std::bit_cast(ctx.fpr[20]), std::bit_cast(ctx.fpr[22]), ctx.gpr[16], ctx.gpr[17], ctx.gpr[18], ctx.gpr[19], ctx.gpr[20], ctx.gpr[21], ctx.gpr[22], ctx.gpr[23], ctx.gpr[30], ctx.gpr[31]}; - aot_mem.aot_store32_block(ctx.gpr[29] + static_cast(16), tier2_words); } - { const bool branch_taken = ctx.gpr[6] == 0u; - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + tier2_gpr_29 = (tier2_gpr_29 + static_cast(-80)); + tier2_gpr_5 = (0u | 12u); + tier2_gpr_6 = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-7080))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(8)); + { const std::uint32_t tier2_words[13]{tier2_gpr_5, std::bit_cast(ctx.fpr[20]), std::bit_cast(ctx.fpr[22]), tier2_gpr_16, ctx.gpr[17], ctx.gpr[18], ctx.gpr[19], ctx.gpr[20], ctx.gpr[21], ctx.gpr[22], ctx.gpr[23], ctx.gpr[30], tier2_gpr_31}; + aot_mem.aot_store32_block(tier2_gpr_29 + static_cast(16), tier2_words); } + { const bool branch_taken = tier2_gpr_6 == 0u; + aot_mem.aot_store32(tier2_gpr_29 + static_cast(12), tier2_gpr_4); if (branch_taken) { goto SB_L_08A7F0D4; } @@ -5002,16 +5021,16 @@ SB_L_08A7F080: } SB_L_08A7F0CC: - ctx.gpr[4] = (0u | 4u); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[4]); + tier2_gpr_4 = (0u | 4u); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(16), tier2_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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(16))); + tier2_gpr_5 = (tier2_gpr_4 + static_cast(-1)); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(8), tier2_gpr_5); + { const bool branch_taken = tier2_gpr_4 == 0u; + aot_mem.aot_store32(tier2_gpr_29 + static_cast(16), tier2_gpr_5); if (branch_taken) { goto SB_L_08A7F4A0; } @@ -5019,18 +5038,18 @@ SB_L_08A7F0D4: } 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)); + tier2_gpr_4 = (ctx.gpr[28] + static_cast(-5492)); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(4), tier2_gpr_4); + tier2_gpr_4 = (49648u << 16u); + tier2_gpr_5 = (2280u << 16u); + ctx.fpr[20] = std::bit_cast(tier2_gpr_4); + tier2_gpr_5 = (tier2_gpr_5 + static_cast(-29568)); ctx.gpr[30] = (2280u << 16u); ctx.gpr[23] = (2279u << 16u); - ctx.gpr[4] = (16880u << 16u); + tier2_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.fpr[22] = std::bit_cast(tier2_gpr_4); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(0), tier2_gpr_5); ctx.gpr[22] = (0u | 1u); ctx.gpr[21] = (0u | 3u); ctx.gpr[30] = (ctx.gpr[30] + static_cast(-21568)); @@ -5039,11 +5058,11 @@ SB_L_08A7F0E8: 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)); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(12))); + ctx.gpr[19] = (aot_mem.aot_load32(tier2_gpr_4 + static_cast(0))); + tier2_gpr_4 = (tier2_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]); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(12), tier2_gpr_4); if (branch_taken) { goto SB_L_08A7F488; } @@ -5052,9 +5071,9 @@ SB_L_08A7F12C: 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]; + tier2_gpr_5 = (aot_mem.aot_load16(ctx.gpr[17] + static_cast(84))); + tier2_gpr_4 = (aot_mem.aot_load16(ctx.gpr[28] + static_cast(-25492))); + { const bool branch_taken = tier2_gpr_5 == tier2_gpr_4; ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[19] + static_cast(8))); if (branch_taken) { goto SB_L_08A7F480; @@ -5063,13 +5082,13 @@ SB_L_08A7F140: } 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); + tier2_gpr_6 = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(76))); + tier2_gpr_5 = (0u + static_cast(-1025)); + aot_mem.aot_store16(ctx.gpr[17] + static_cast(84), static_cast(tier2_gpr_4)); + tier2_gpr_4 = (tier2_gpr_6 & tier2_gpr_5); + aot_mem.aot_store32(ctx.gpr[17] + static_cast(76), tier2_gpr_4); + tier2_gpr_31 = (0x08A7F170u); + tier2_gpr_4 = (ctx.gpr[17] | 0u); goto SB_L_08A7CEC8; SB_L_08A7F480: @@ -5082,12 +5101,12 @@ SB_L_08A7F480: } 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]); + tier2_gpr_4 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(16))); + tier2_gpr_5 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(8))); + tier2_gpr_4 = (tier2_gpr_4 + static_cast(-1)); + aot_mem.aot_store32(tier2_gpr_29 + static_cast(8), tier2_gpr_4); + { const bool branch_taken = tier2_gpr_5 != 0u; + aot_mem.aot_store32(tier2_gpr_29 + static_cast(16), tier2_gpr_4); if (branch_taken) { goto SB_L_08A7F12C; } @@ -5096,10 +5115,10 @@ SB_L_08A7F488: SB_L_08A7F4A0: { std::uint32_t tier2_words[12]{}; - if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(20), tier2_words)) { + if (aot_mem.aot_try_load32_block(tier2_gpr_29 + static_cast(20), tier2_words)) { ctx.fpr[20] = std::bit_cast(tier2_words[0]); ctx.fpr[22] = std::bit_cast(tier2_words[1]); - ctx.gpr[16] = tier2_words[2]; + tier2_gpr_16 = tier2_words[2]; ctx.gpr[17] = tier2_words[3]; ctx.gpr[18] = tier2_words[4]; ctx.gpr[19] = tier2_words[5]; @@ -5108,35 +5127,38 @@ SB_L_08A7F4A0: ctx.gpr[22] = tier2_words[8]; ctx.gpr[23] = tier2_words[9]; ctx.gpr[30] = tier2_words[10]; - ctx.gpr[31] = tier2_words[11]; + tier2_gpr_31 = tier2_words[11]; } else { - 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))); + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_29 + static_cast(20))); + ctx.fpr[22] = std::bit_cast(aot_mem.aot_load32(tier2_gpr_29 + static_cast(24))); + tier2_gpr_16 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(28))); + ctx.gpr[17] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(32))); + ctx.gpr[18] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(36))); + ctx.gpr[19] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(40))); + ctx.gpr[20] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(44))); + ctx.gpr[21] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(48))); + ctx.gpr[22] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(52))); + ctx.gpr[23] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(56))); + ctx.gpr[30] = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(60))); + tier2_gpr_31 = (aot_mem.aot_load32(tier2_gpr_29 + static_cast(64))); } } - jump_target = ctx.gpr[31]; - ctx.gpr[29] = (ctx.gpr[29] + static_cast(80)); + jump_target = tier2_gpr_31; + tier2_gpr_29 = (tier2_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]; + jump_target = tier2_gpr_31; ctx.gpr[2] = (ctx.gpr[2] + static_cast(-1372)); local_pc = jump_target; goto TIER2_LOCAL_DISPATCH_U0158; - +// TIER2_GPR_BODY_END #undef TIER2_SB_RETURN +#undef TIER2_GPR_BEFORE_COLD +#undef TIER2_GPR_SYNC_IN +#undef TIER2_GPR_SYNC_OUT } } // namespace vcs diff --git a/profiles/vcs/scripts/build_release_ninja.bat b/profiles/vcs/scripts/build_release_ninja.bat index b4066e1..1df0bb3 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_v3_dataflow_20260816" +set "SUPERBLOCK_STAMP=%BUILD%\.vcs_tier2_v4_150fps_buildfix3_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 V3 dataflow clusters O2 /Ob3 /GL- +echo Generated AOT: O3, cold /Ob0, measured hot /Ob3; Tier2 V4 150FPS clusters O2 /Ob3; Geometry /Ob2 + shadow-off compile-guard; /GL- + GPR shadow + SIMD 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 V3 dataflow second layer... +echo [0b2/7] Building profile-guided Tier-2 V4 150FPS 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,10 @@ if errorlevel 1 goto :FAIL if exist "%BUILD%" if not exist "%SUPERBLOCK_STAMP%" ( echo. - echo [0c-super/7] Tier2 SUPERBLOCK V3 DATAFLOW - 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%\*vcs_tier2_cluster_*.obj" >nul 2>&1 - del /s /q "%BUILD%\*vcs_profile*.obj" >nul 2>&1 + echo [0c-super/7] Tier2 V4 BUILDFIX3 - invalidating Geometry + runtime log once... + rem BUILDFIX3 only changes Geometry codegen/shadow policy and runtime metadata. + rem Keep every already-valid V4 object so Ninja does not repeat the expensive build. + del /s /q "%BUILD%\*vcs_tier2_cluster_geometry*.obj" >nul 2>&1 del /s /q "%BUILD%\*vcs_runtime_log*.obj" >nul 2>&1 ) @@ -170,7 +169,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 V3 DATAFLOW 2026-08-16 +>"%SUPERBLOCK_STAMP%" echo VCS Tier2 V4 BUILDFIX3 2026-08-16 echo. echo [2b/7] Building tests and DX12 probes... diff --git a/profiles/vcs/tools/build_tier2_superblocks.py b/profiles/vcs/tools/build_tier2_superblocks.py index c74e9c4..0ac47f7 100644 --- a/profiles/vcs/tools/build_tier2_superblocks.py +++ b/profiles/vcs/tools/build_tier2_superblocks.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 -"""Generate VCS Tier-2 SUPERBLOCK V3 dataflow multi-cluster second-layer AOT. +"""Generate VCS Tier-2 SUPERBLOCK V4 150FPS multi-cluster second-layer AOT. -V3 is profile-guided and intentionally keeps the original generated corpus as +V4 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. @@ -137,7 +137,7 @@ CLUSTERS: List[Cluster] = [ -# Tier-2 V3 dataflow/memory lowering. V2 proved that eliminating dispatch +# Tier-2 V4 dataflow/memory lowering inherited from V3. V2 proved that eliminating dispatch # alone is not enough: the hot clusters still spend most of their time in the # translated body. These transforms deliberately target memory-access runs # where semantics can be preserved without keeping guest registers dirty @@ -283,6 +283,102 @@ def _batch_simple_store_runs(text: str) -> tuple[str, int, int]: return '\n'.join(out) + ('\n' if text.endswith('\n') else ''), runs, words + +MAT4_MUL_RE = re.compile( + r'for \(std::uint32_t a = 0; a < 4u; \+\+a\) \{\s*' + r'for \(std::uint32_t b = 0; b < 4u; \+\+b\) \{\s*' + r'float sum = 0\.0f;\s*' + r'for \(std::uint32_t c = 0; c < 4u; \+\+c\) sum \+= vfpu_s\[b \* 4u \+ c\] \* vfpu_t\[a \* 4u \+ c\];\s*' + r'vfpu_d\[a \* 4u \+ b\] = sum;\s*' + r'\}\s*\}') + +MAT4_VEC_FIRST3_RE = re.compile( + r'for \(std::uint32_t row = 0; row \+ 1u < vfpu_side; \+\+row\) \{\s*' + r'float sum = 0\.0f;\s*' + r'for \(std::uint32_t column = 0; column < vfpu_side; \+\+column\) sum \+= vfpu_matrix\[row \* 4u \+ column\] \* vfpu_target\[column\];\s*' + r'vfpu_result\[row\] = sum;\s*' + r'\}') + + +def optimize_tier2_simd(text: str) -> tuple[str, Dict[str, int]]: + stats = {'mat4_mul': 0, 'mat4_vec_first3': 0} + def repl_mul(_: re.Match[str]) -> str: + stats['mat4_mul'] += 1 + return 'psprecomp::vcs_tier2_mat4_mul_ordered(vfpu_s, vfpu_t, vfpu_d);' + text = MAT4_MUL_RE.sub(repl_mul, text) + def repl_vec(_: re.Match[str]) -> str: + stats['mat4_vec_first3'] += 1 + return ('if constexpr (vfpu_side == 4u) {\n' + ' psprecomp::vcs_tier2_mat4_vec_first3_ordered(vfpu_matrix, vfpu_target, vfpu_result);\n' + ' } else {\n' + ' for (std::uint32_t row = 0; row + 1u < vfpu_side; ++row) {\n' + ' float sum = 0.0f;\n' + ' for (std::uint32_t column = 0; column < vfpu_side; ++column) sum += vfpu_matrix[row * 4u + column] * vfpu_target[column];\n' + ' vfpu_result[row] = sum;\n' + ' }\n' + ' }') + text = MAT4_VEC_FIRST3_RE.sub(repl_vec, text) + return text, stats + +_GPR_BODY_BEGIN = '// TIER2_GPR_BODY_BEGIN\n' +_GPR_BODY_END = '// TIER2_GPR_BODY_END\n' +_GPR_DECL_PLACEHOLDER = ' // TIER2_GPR_SHADOW_DECLS\n' +_GPR_DIRECT_BOOL_RE = re.compile(r'rt\.invoke_chained_direct<[^;\n]+?>\(ctx, &aot_mem\)') +_GPR_DYNAMIC_BOOL_RE = re.compile(r'rt\.invoke_chained_call\(ctx, &aot_mem\)') + + +def optimize_tier2_gpr_shadow(text: str, cluster_key: str) -> tuple[str, Dict[str, object]]: + """Promote six hot GPRs with explicit synchronization at visibility boundaries.""" + begin = text.find(_GPR_BODY_BEGIN) + end = text.find(_GPR_BODY_END) + if begin < 0 or end < 0 or end <= begin: + raise RuntimeError(f'{cluster_key}: GPR body markers missing') + body_start = begin + len(_GPR_BODY_BEGIN) + body = text[body_start:end] + eligible = cluster_key not in {'physics', 'matrix', 'geometry'} + counts = collections.Counter(int(x) for x in re.findall(r'ctx\.gpr\[(\d+)\]', body)) + selected = [reg for reg, _ in counts.most_common() if reg != 0][:6] if eligible else [] + + if selected: + decls = ''.join(f' std::uint32_t tier2_gpr_{r} = ctx.gpr[{r}];\n' for r in selected) + out_body = ' '.join(f'ctx.gpr[{r}] = tier2_gpr_{r};' for r in selected) + in_body = ' '.join(f'tier2_gpr_{r} = ctx.gpr[{r}];' for r in selected) + macros = (decls + + ' bool tier2_gpr_shadow_valid = true;\n' + + f'#define TIER2_GPR_SYNC_OUT() do {{ if (tier2_gpr_shadow_valid) {{ {out_body} }} }} while (false)\n' + + f'#define TIER2_GPR_SYNC_IN() do {{ if (tier2_gpr_shadow_valid) {{ {in_body} }} }} while (false)\n' + + '#define TIER2_GPR_BEFORE_COLD() do { TIER2_GPR_SYNC_OUT(); tier2_gpr_shadow_valid = false; } while (false)\n') + else: + macros = (' bool tier2_gpr_shadow_valid = true;\n' + '#define TIER2_GPR_SYNC_OUT() do {} while (false)\n' + '#define TIER2_GPR_SYNC_IN() do {} while (false)\n' + '#define TIER2_GPR_BEFORE_COLD() do { tier2_gpr_shadow_valid = false; } while (false)\n') + if _GPR_DECL_PLACEHOLDER not in text: + raise RuntimeError(f'{cluster_key}: GPR declaration placeholder missing') + + if selected: + def wrap_bool(m: re.Match[str]) -> str: + expr = m.group(0) + return ('([&]() { TIER2_GPR_SYNC_OUT(); const bool tier2_same_ = (' + expr + '); ' + 'if (tier2_same_) TIER2_GPR_SYNC_IN(); else tier2_gpr_shadow_valid = false; ' + 'return tier2_same_; }())') + body = _GPR_DIRECT_BOOL_RE.sub(wrap_bool, body) + body = _GPR_DYNAMIC_BOOL_RE.sub(wrap_bool, body) + for r in selected: + body = body.replace(f'ctx.gpr[{r}]', f'tier2_gpr_{r}') + text = text[:body_start] + body + text[end:] + + # Insert declarations only after body splicing; doing this earlier shifts + # the saved marker offsets and corrupts the generated CFG. + text = text.replace(_GPR_DECL_PLACEHOLDER, macros, 1) + + return text, { + 'enabled': int(bool(selected)), + 'registers': selected, + 'occurrences': sum(counts[r] for r in selected), + } + + def optimize_tier2_dataflow(text: str) -> tuple[str, Dict[str, int]]: stats: Dict[str, int] = { 'vfpu_quad_loads': 0, 'vfpu_quad_stores': 0, 'append32': 0, 'advance32': 0, @@ -526,7 +622,7 @@ def transform_block(block: str, source_unit: int, selected: Mapping[int, Set[int 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_GPR_BEFORE_COLD(); psprecomp::recomp_unit_{source_unit:04d}_entry(rt, ctx, {entry}u, aot_mem); ' f'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) @@ -589,11 +685,11 @@ def emit_cluster(cluster: Cluster, selected: Mapping[int, Set[int]], 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)) + if (!tier2_complete_shadow(tier2_nested_tail)) tier2_same_context = false; }} --tier2_return_depth; - if (!rt.tier2_complete_fused_transfers(ctx, 1u)) + if (!tier2_complete_shadow(1u)) tier2_same_context = false; if (!tier2_same_context) TIER2_SB_RETURN(); goto TIER2_FUSED_RETURN_DISPATCH; @@ -619,7 +715,7 @@ def emit_cluster(cluster: Cluster, selected: Mapping[int, Set[int]], 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();' + f'TIER2_GPR_BEFORE_COLD(); 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) {{ @@ -629,10 +725,11 @@ def emit_cluster(cluster: Cluster, selected: Mapping[int, Set[int]], break;''') cpp = f'''// AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: {cluster.key} +// Tier-2 SUPERBLOCK V4 150FPS cluster: {cluster.key} #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" +#include "vcs_fast_paths.hpp" #include @@ -657,8 +754,17 @@ void {cluster.function}(psprecomp::Runtime &rt, std::uint32_t local_pc = 0u; std::uint32_t local_transfers = 0u; std::uint32_t entry_id = 0u; + // TIER2_GPR_SHADOW_DECLS + + auto tier2_complete_shadow = [&](std::uint32_t count) -> bool {{ + TIER2_GPR_SYNC_OUT(); + const bool same = rt.tier2_complete_fused_transfers(ctx, count); + if (!same) tier2_gpr_shadow_valid = false; + return same; + }}; #define TIER2_SB_RETURN() do {{ \ + TIER2_GPR_SYNC_OUT(); \ tier2_scope.finish(); \ /* Unwind every logical invoke_chained_direct frame in true LIFO \ order. Tail frames created inside a fused JAL unwind before that \ @@ -672,12 +778,12 @@ void {cluster.function}(psprecomp::Runtime &rt, 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_); \ + (void)tier2_complete_shadow(tier2_tail_count_); \ --tier2_return_depth; \ - (void)rt.tier2_complete_fused_transfers(ctx, 1u); \ + (void)tier2_complete_shadow(1u); \ }} \ if (tier2_pending_transfers != 0u) {{ \ - (void)rt.tier2_complete_fused_transfers(ctx, tier2_pending_transfers); \ + (void)tier2_complete_shadow(tier2_pending_transfers); \ tier2_pending_transfers = 0u; \ }} \ return; \ @@ -708,15 +814,21 @@ TIER2_ENTRY_DISPATCH: TIER2_SB_RETURN(); }} -{chr(10).join(chunks)} - -#undef TIER2_SB_RETURN +// TIER2_GPR_BODY_BEGIN\n{chr(10).join(chunks)}// TIER2_GPR_BODY_END\n\n#undef TIER2_SB_RETURN +#undef TIER2_GPR_BEFORE_COLD +#undef TIER2_GPR_SYNC_IN +#undef TIER2_GPR_SYNC_OUT }} }} // namespace vcs ''' cpp, dataflow_stats = optimize_tier2_dataflow(cpp) stats.update({f'dataflow_{k}': v for k, v in dataflow_stats.items()}) + cpp, simd_stats = optimize_tier2_simd(cpp) + stats.update({f'simd_{k}': v for k, v in simd_stats.items()}) + cpp, gpr_stats = optimize_tier2_gpr_shadow(cpp, cluster.key) + stats['gpr_shadow_occurrences'] = int(gpr_stats['occurrences']) + stats['gpr_shadow_registers'] = len(gpr_stats['registers']) path = host / f'vcs_tier2_cluster_{cluster.key}.cpp' old = path.read_text(encoding='utf-8') if path.exists() else None @@ -779,7 +891,7 @@ def main() -> int: selected_by_cluster[cluster.key] = selected path, stats = emit_cluster(cluster, selected, sources, host) generated_paths.append(path) - print(f'Tier2 V3 cluster {cluster.key}: ' + ' '.join(f'{k}={v}' for k, v in sorted(stats.items()))) + print(f'Tier2 V4 cluster {cluster.key}: ' + ' '.join(f'{k}={v}' for k, v in sorted(stats.items()))) total.update(stats) hooks_by_unit: Dict[int, List[Tuple[Cluster, int]]] = collections.defaultdict(list) @@ -802,7 +914,7 @@ def main() -> int: # common file is handwritten by V2 and must remain; generated cluster files # carry all hot code. - print('Tier2 SUPERBLOCK V3 DATAFLOW:', + print('Tier2 SUPERBLOCK V4 150FPS:', 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"]}',