diff --git a/include/psprecomp/guest_memory.hpp b/include/psprecomp/guest_memory.hpp index 53f01c1..3dc9153 100644 --- a/include/psprecomp/guest_memory.hpp +++ b/include/psprecomp/guest_memory.hpp @@ -117,6 +117,127 @@ public: } owner_->aot_store32_slow(address, value); } + + // Tier-2 dataflow helpers: collapse a run of adjacent 32-bit guest + // accesses into one address canonicalization / bounds check. These are + // deliberately available only through AotFastView so generated Tier-2 + // code can use them without changing the generic GuestMemory contract. + // + // On the little-endian hosts VCS targets, memcpy lets MSVC/GCC emit a + // compact vector move for small compile-time N. Slow/EDRAM/watch paths + // retain the exact per-word behavior and ordering of the original AOT. + template + [[nodiscard]] PSPRECOMP_MEMORY_FAST_PATH bool aot_try_load32_block( + std::uint32_t address, std::uint32_t (&values)[N]) const { + static_assert(N != 0u); + constexpr std::uint32_t kTail = static_cast((N - 1u) * 4u); + const std::uint32_t offset = ram_offset_of_fast(address); + if (offset > ram_limit32_ || kTail > (ram_limit32_ - offset)) + return false; + if constexpr (std::endian::native == std::endian::little) { + std::memcpy(values, ram_data_ + offset, N * sizeof(std::uint32_t)); + } else { + for (std::size_t i = 0; i < N; ++i) + values[i] = GuestMemory::read_le32(ram_data_ + offset + i * 4u); + } + return true; + } + + template + PSPRECOMP_MEMORY_FAST_PATH void aot_load32_block( + std::uint32_t address, std::uint32_t (&values)[N]) const { + if (aot_try_load32_block(address, values)) return; + for (std::size_t i = 0; i < N; ++i) + values[i] = aot_load32(address + static_cast(i * 4u)); + } + + template + [[nodiscard]] PSPRECOMP_MEMORY_FAST_PATH bool aot_try_store32_block( + std::uint32_t address, const std::uint32_t (&values)[N]) const { + static_assert(N != 0u); + constexpr std::uint32_t kTail = static_cast((N - 1u) * 4u); + const std::uint32_t offset = ram_offset_of_fast(address); +#if defined(PSPRECOMP_AOT_ASSUME_NO_WRITE_WATCH) + const bool direct = offset <= ram_limit32_ && kTail <= (ram_limit32_ - offset); +#else + const bool direct = !write_watch_enabled_ && offset <= ram_limit32_ && + kTail <= (ram_limit32_ - offset); +#endif + if (!direct) return false; + if constexpr (std::endian::native == std::endian::little) { + std::memcpy(ram_data_ + offset, values, N * sizeof(std::uint32_t)); + } else { + for (std::size_t i = 0; i < N; ++i) + GuestMemory::write_le32(ram_data_ + offset + i * 4u, values[i]); + } + return true; + } + + template + PSPRECOMP_MEMORY_FAST_PATH void aot_store32_block( + std::uint32_t address, const std::uint32_t (&values)[N]) const { + if (aot_try_store32_block(address, values)) return; + for (std::size_t i = 0; i < N; ++i) + aot_store32(address + static_cast(i * 4u), values[i]); + } + + // Common PSP command/list builder idiom: + // p = *cursor; *p = value; p = *cursor; p += 4; *cursor = p; + // VCS executes this sequence extremely often in the geometry/boundary + // hot traces. The direct RAM path performs one cursor read, one data + // write and one cursor write. If the data write aliases the cursor, or + // if either address leaves plain RAM/write-watch-safe memory, fall back + // to the exact scalar sequence so the second cursor load observes any + // aliasing side effect just like the generated MIPS did. + PSPRECOMP_MEMORY_FAST_PATH std::uint32_t aot_append32( + std::uint32_t cursor_address, std::uint32_t value, + std::uint32_t *old_pointer = nullptr) const { + const std::uint32_t cursor_offset = ram_offset_of_fast(cursor_address); +#if defined(PSPRECOMP_AOT_ASSUME_NO_WRITE_WATCH) + const bool cursor_direct = cursor_offset <= ram_limit32_; +#else + const bool cursor_direct = !write_watch_enabled_ && cursor_offset <= ram_limit32_; +#endif + if (cursor_direct) { + const std::uint32_t pointer = GuestMemory::read_le32(ram_data_ + cursor_offset); + const std::uint32_t target_offset = ram_offset_of_fast(pointer); + const bool target_direct = target_offset <= ram_limit32_; + const bool disjoint = target_direct && + (target_offset + 3u < cursor_offset || cursor_offset + 3u < target_offset); + if (disjoint) { + GuestMemory::write_le32(ram_data_ + target_offset, value); + const std::uint32_t next = pointer + 4u; + GuestMemory::write_le32(ram_data_ + cursor_offset, next); + if (old_pointer != nullptr) *old_pointer = pointer; + return next; + } + } + const std::uint32_t pointer = aot_load32(cursor_address); + if (old_pointer != nullptr) *old_pointer = pointer; + aot_store32(pointer, value); + const std::uint32_t reloaded = aot_load32(cursor_address); + const std::uint32_t next = reloaded + 4u; + aot_store32(cursor_address, next); + return next; + } + PSPRECOMP_MEMORY_FAST_PATH std::uint32_t aot_advance32( + std::uint32_t cursor_address) const { + const std::uint32_t cursor_offset = ram_offset_of_fast(cursor_address); +#if defined(PSPRECOMP_AOT_ASSUME_NO_WRITE_WATCH) + if (cursor_offset <= ram_limit32_) { +#else + if (!write_watch_enabled_ && cursor_offset <= ram_limit32_) { +#endif + const std::uint32_t next = + GuestMemory::read_le32(ram_data_ + cursor_offset) + 4u; + GuestMemory::write_le32(ram_data_ + cursor_offset, next); + return next; + } + const std::uint32_t next = aot_load32(cursor_address) + 4u; + aot_store32(cursor_address, next); + return next; + } + [[nodiscard]] PSPRECOMP_MEMORY_FAST_PATH std::uint32_t aot_load_word_left( std::uint32_t address, std::uint32_t existing) const { const std::uint32_t shift = (address & 3u) * 8u; diff --git a/profiles/vcs/VCS_TIER2_SUPERBLOCK_V3_DATAFLOW_2026-08-16.md b/profiles/vcs/VCS_TIER2_SUPERBLOCK_V3_DATAFLOW_2026-08-16.md new file mode 100644 index 0000000..18058b3 --- /dev/null +++ b/profiles/vcs/VCS_TIER2_SUPERBLOCK_V3_DATAFLOW_2026-08-16.md @@ -0,0 +1,55 @@ +# VCS Tier-2 Superblock V3 Dataflow — 2026-08-16 + +## Purpose +V2 proved that multi-cluster Tier-2 coverage is high but call/tail fusion alone does not remove enough guest CPU time. V3 keeps the V2 unwind/reentry safety fixes and attacks repeated guest-memory work inside the hot superblock bodies. + +## Architecture retained from V2 +- 7 Tier-2 clusters / 1,060 hot blocks. +- 49 static fused direct calls and 13 fused tail edges. +- Safe AOT fallback, chain-depth/starvation accounting, unwind fix, and reentry guard. +- Existing per-window TIER2 telemetry remains active. + +## V3 dataflow/memory lowering +`GuestMemory::AotFastView` now exposes block/batched fast paths with exact scalar fallback: +- `aot_try_load32_block` / `aot_load32_block` +- `aot_try_store32_block` / `aot_store32_block` +- `aot_append32` +- `aot_advance32` + +The Tier-2 generator lowers hot-body patterns to those helpers only when it can prove the required adjacency/order. Slow/VRAM/write-watch/alias cases preserve the original scalar behavior. + +Static V3 lowering across the 7 clusters: +- 104 VFPU four-word loads batched. +- 29 VFPU four-word stores batched. +- 14 generic contiguous load runs / 141 words. +- 21 generic contiguous store runs / 146 words. +- 51 append32 command-builder patterns. +- 89 advance32 cursor patterns. + +## Validation +- `psprecomp_tests`: PASS. +- `vcs_profile_tests`: PASS. +- `vfpu_tier2_tests`: PASS. +- Generator second run: zero changes. +- 7/7 Tier-2 cluster objects compiled using the real VCSNative target flags. +- 8/10 hooked generated units have fresh real target objects; units 0157/0158 pass exact-command syntax validation but the Linux optimizer exceeded the interactive execution window when rebuilding those very large units. +- Full Linux VCSNative link was not claimed because the guest-memory header change causes a broad AOT rebuild and exceeds the container execution window. + +## Build / test +Apply the V3 overlay on top of the current V2 CRASHFIX tree and run: + +```bat +profiles\vcs\BUILD_VCS_NINJA.bat +``` + +Do not delete object files manually. The V3 stamp invalidates the intended Tier-2 objects, while the `guest_memory.hpp` dependency causes Ninja to rebuild any AOT units that require the new header automatically. + +Expected runtime log: + +```text +stage=tier2-superblock-v3-dataflow-2026-08-16 +tier2_superblocks=... version=3 ... dataflow=1 vfpu_block32=133 mem_runs=35 mem_words=287 append32=51 advance32=89 +``` + +## Performance status +The isolated Linux helper microbenchmarks showed roughly 18% lower time for the batched four-word load helper and roughly 16% lower time for the append32 pattern. These are local microbenchmarks only; V3 game FPS/guest CPU improvement is unproven until the Windows runtime log is measured. diff --git a/profiles/vcs/host/vcs_runtime_log.cpp b/profiles/vcs/host/vcs_runtime_log.cpp index add5f3e..156a9cb 100644 --- a/profiles/vcs/host/vcs_runtime_log.cpp +++ b/profiles/vcs/host/vcs_runtime_log.cpp @@ -63,7 +63,7 @@ void runtime_log_initialize(const VcsConfiguration &configuration) { return; } s.file << "VCSNative runtime log\n"; - s.file << "stage=tier2-superblock-v2-unwind-hotfix-2026-08-16\n"; + s.file << "stage=tier2-superblock-v3-dataflow-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 +72,8 @@ 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=2 clusters=7 mask=0x" << std::hex << tier2_cluster_mask() << std::dec - << " hot_blocks=1060 static_fused_calls=49 static_fused_tail=13 hooks=25 unwind_fix=1 reentry_guard=1\n\n"; + << " 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"; 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 3047bf4..0542603 100644 --- a/profiles/vcs/host/vcs_tier2_cluster_boundary.cpp +++ b/profiles/vcs/host/vcs_tier2_cluster_boundary.cpp @@ -1,5 +1,5 @@ // AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Tier-2 SUPERBLOCK V2 cluster: boundary +// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: boundary #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" @@ -308,11 +308,9 @@ SB_L_0895BF88: ctx.gpr[6] = (4096u << 16u); aot_mem.aot_store32(ctx.gpr[5] + static_cast(20), ctx.gpr[4]); ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + { 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); ctx.gpr[2] = (0u | 0u); goto SB_L_0895BFBC; @@ -321,11 +319,9 @@ SB_L_0895BFBC: ctx.gpr[5] = (ctx.gpr[20] + ctx.gpr[4]); ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[5] + static_cast(40))); ctx.gpr[6] = (ctx.gpr[2] | ctx.gpr[23]); - ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - aot_mem.aot_store32(ctx.gpr[7] + static_cast(0), ctx.gpr[6]); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[6]); + { 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]); @@ -337,9 +333,7 @@ SB_L_0895BFBC: aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); ctx.pc = 0x0895C000u; TIER2_SB_RETURN(); SB_L_0895C000: - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[5]); + ctx.gpr[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; @@ -469,9 +463,7 @@ SB_L_0895C0A8: aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[5]); ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(29552)); { const bool branch_taken = ctx.gpr[19] == 0u; // nop if (branch_taken) { @@ -494,11 +486,9 @@ SB_L_0895C118: ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); ctx.gpr[5] = (ctx.gpr[5] >> 8u); ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + { 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.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])); @@ -514,9 +504,7 @@ SB_L_0895C118: aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(29552)); ctx.gpr[4] = (ctx.gpr[19] | 0u); ctx.gpr[31] = (0x0895C1B4u); ctx.fpr[12] = std::bit_cast(std::bit_cast(ctx.fpr[20])); @@ -612,18 +600,14 @@ SB_L_0895C244: ctx.gpr[6] = (ctx.gpr[7] & ctx.gpr[21]); ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(29552)); ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[8] + static_cast(8))); goto SB_L_0895C2A8; @@ -657,19 +641,15 @@ SB_L_0895C2C8: ctx.gpr[5] = (std::bit_cast(ctx.fpr[20])); ctx.gpr[5] = (ctx.gpr[5] >> 8u); ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + { 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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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; // nop @@ -689,11 +669,9 @@ SB_L_0895C318: SB_L_0895C324: ctx.gpr[16] = (0u < ctx.gpr[2] ? 1u : 0u); ctx.gpr[4] = (8704u << 16u); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + { 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); ctx.gpr[31] = (0x0895C34Cu); ctx.gpr[5] = (0u | 0u); @@ -703,129 +681,93 @@ SB_L_0895C324: SB_L_0895C34C: ctx.gpr[4] = (22016u << 16u); ctx.gpr[4] = (ctx.gpr[4] + static_cast(-1)); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + { 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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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])); @@ -837,11 +779,9 @@ SB_L_0895C34C: SB_L_0895C54C: ctx.gpr[4] = (8960u << 16u); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + { 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; } goto SB_L_0895C564; SB_L_0895C564: @@ -857,26 +797,18 @@ SB_L_0895C564: SB_L_0895C570: ctx.gpr[4] = (7680u << 16u); ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + { 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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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); ctx.gpr[8] = (256u << 16u); @@ -885,28 +817,20 @@ SB_L_0895C570: ctx.gpr[8] = (40960u << 16u); ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[8]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[6]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(29552)); goto SB_L_0895C640; SB_L_0895C640: @@ -1071,15 +995,11 @@ SB_L_0895C764: ctx.gpr[6] = (57088u << 16u); ctx.gpr[6] = (ctx.gpr[6] + static_cast(170)); aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[6]); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[6]); + ctx.gpr[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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[5]); + ctx.gpr[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]); @@ -1123,18 +1043,14 @@ SB_L_0895C800: ctx.gpr[7] = (ctx.gpr[18] & ctx.gpr[20]); ctx.gpr[6] = (ctx.gpr[7] | ctx.gpr[6]); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[16] = (ctx.gpr[16] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[16]); + ctx.gpr[16] = aot_mem.aot_advance32(ctx.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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(29552)); ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); goto SB_L_0895C864; @@ -1168,16 +1084,12 @@ SB_L_0895C884: SB_L_0895C88C: ctx.gpr[4] = (6144u << 16u); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + { 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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(29552)); ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[29] + static_cast(129))); ctx.gpr[31] = (0x0895C8C4u); ctx.gpr[4] = (0u | 11u); @@ -1187,22 +1099,16 @@ SB_L_0895C88C: SB_L_0895C8C4: ctx.gpr[4] = (8704u << 16u); ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + { 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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_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; // nop @@ -1215,29 +1121,45 @@ SB_L_0895C8C4: SB_L_0895C918: ctx.gpr[4] = (8960u << 16u); ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(29552), ctx.gpr[4]); + { 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; } goto SB_L_0895C934; SB_L_0895C934: ctx.gpr[2] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(96))); - ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(136))); - ctx.fpr[22] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(140))); - ctx.fpr[24] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(144))); - ctx.fpr[26] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(148))); - ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(152))); - ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(156))); - ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(160))); - ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(164))); - ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(168))); - ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(172))); - ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(176))); - ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(180))); - ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(184))); - ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(188))); + { std::uint32_t tier2_words[14]{}; + if (aot_mem.aot_try_load32_block(ctx.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]; + ctx.gpr[18] = tier2_words[6]; + ctx.gpr[19] = tier2_words[7]; + ctx.gpr[20] = tier2_words[8]; + ctx.gpr[21] = tier2_words[9]; + ctx.gpr[22] = tier2_words[10]; + ctx.gpr[23] = tier2_words[11]; + 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))); + } } jump_target = ctx.gpr[31]; ctx.gpr[29] = (ctx.gpr[29] + static_cast(192)); local_pc = jump_target; diff --git a/profiles/vcs/host/vcs_tier2_cluster_edge43.cpp b/profiles/vcs/host/vcs_tier2_cluster_edge43.cpp index 2dbffd7..055c129 100644 --- a/profiles/vcs/host/vcs_tier2_cluster_edge43.cpp +++ b/profiles/vcs/host/vcs_tier2_cluster_edge43.cpp @@ -1,5 +1,5 @@ // AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Tier-2 SUPERBLOCK V2 cluster: edge43 +// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: edge43 #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" @@ -199,32 +199,36 @@ TIER2_ENTRY_DISPATCH: SB_L_088B1780: { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } ctx.execute_vfpu_vminmax_ct<2u, 0u, 1u, 3u, false>(); ctx.execute_vfpu_vminmax_ct<3u, 0u, 1u, 3u, true>(); @@ -302,15 +306,8 @@ SB_L_088B180C: SB_L_088B18EC: ctx.gpr[29] = (ctx.gpr[29] + static_cast(-128)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(84), ctx.gpr[16]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(88), ctx.gpr[17]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(92), ctx.gpr[18]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(96), ctx.gpr[19]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(100), ctx.gpr[20]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(104), ctx.gpr[21]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(108), ctx.gpr[22]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(112), ctx.gpr[23]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(116), ctx.gpr[31]); + { 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); } ctx.gpr[16] = (ctx.gpr[8] | 0u); ctx.gpr[17] = (ctx.gpr[7] | 0u); ctx.gpr[18] = (ctx.gpr[6] | 0u); @@ -340,39 +337,44 @@ SB_L_088B1940: SB_L_088B1B74: { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[7] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; ctx.read_vfpu_vector_with_source_prefix_ct<5u, 3u, 0u>(vfpu_s); @@ -499,16 +501,12 @@ SB_L_088B1BD0: SB_L_088B1C2C: { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<1u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[8] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + 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<7u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[9] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + 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); } aot_mem.aot_store32(ctx.gpr[10] + static_cast(0), ctx.vfpu_scalar_bits_ct<24u>()); jump_target = ctx.gpr[31]; ctx.gpr[2] = (0u + static_cast(1)); @@ -526,11 +524,12 @@ SB_L_088B3FCC: ctx.gpr[18] = (ctx.gpr[18] + ctx.gpr[30]); ctx.gpr[5] = (ctx.gpr[29] + static_cast(16)); { const std::uint32_t vfpu_address = ctx.gpr[18] + static_cast(0); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); } ctx.execute_vfpu_vx2i_ct<0u, 2u, 2u, 3u>(); ctx.execute_vfpu_vx2i_ct<1u, 66u, 2u, 3u>(); @@ -554,16 +553,12 @@ 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); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + const std::uint32_t 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); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + const std::uint32_t 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); goto SB_L_088B1780; @@ -871,17 +866,32 @@ SB_L_088B4234: goto SB_L_088B4238; SB_L_088B4238: - ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(60))); - ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(64))); - ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(68))); - ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(72))); - ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(76))); - ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(80))); - ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(84))); - ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(88))); - ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(92))); - ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(96))); - ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + { std::uint32_t tier2_words[11]{}; + if (aot_mem.aot_try_load32_block(ctx.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]; + ctx.gpr[18] = tier2_words[3]; + ctx.gpr[19] = tier2_words[4]; + ctx.gpr[20] = tier2_words[5]; + ctx.gpr[21] = tier2_words[6]; + ctx.gpr[22] = tier2_words[7]; + ctx.gpr[23] = tier2_words[8]; + ctx.gpr[30] = tier2_words[9]; + ctx.gpr[31] = tier2_words[10]; + } else { + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(60))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(64))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(68))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(72))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(76))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(80))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(84))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(88))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(92))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(96))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + } } jump_target = ctx.gpr[31]; ctx.gpr[29] = (ctx.gpr[29] + static_cast(112)); local_pc = jump_target; diff --git a/profiles/vcs/host/vcs_tier2_cluster_entity.cpp b/profiles/vcs/host/vcs_tier2_cluster_entity.cpp index 5b8b88d..475ecc1 100644 --- a/profiles/vcs/host/vcs_tier2_cluster_entity.cpp +++ b/profiles/vcs/host/vcs_tier2_cluster_entity.cpp @@ -1,5 +1,5 @@ // AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Tier-2 SUPERBLOCK V2 cluster: entity +// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: entity #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" @@ -563,39 +563,44 @@ SB_L_08A6E930: 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); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast(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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<3u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } { float vfpu_value[4]{}; ctx.write_vfpu_vector_with_destination_prefix_ct<35u, 3u>(vfpu_value); } @@ -603,11 +608,12 @@ SB_L_08A6E930: 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); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<8u, 4u>(vfpu_value); } { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; ctx.read_vfpu_matrix_ct<32u, 4u>(vfpu_matrix); @@ -1115,18 +1121,20 @@ SB_L_08A6ECA0: ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(20))); ctx.gpr[4] = (ctx.gpr[4] + static_cast(16)); { const std::uint32_t vfpu_address = ctx.gpr[8] + static_cast(0); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); @@ -1136,44 +1144,47 @@ SB_L_08A6ECA0: ctx.gpr[21] = (ctx.gpr[29] + static_cast(144)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + const std::uint32_t 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[21] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); } { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; ctx.read_vfpu_matrix_ct<36u, 3u>(vfpu_matrix); @@ -1205,23 +1216,20 @@ SB_L_08A6ECA0: ctx.gpr[4] = (ctx.gpr[29] + static_cast(48)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + const std::uint32_t 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); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + const std::uint32_t 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))); @@ -1262,39 +1270,44 @@ SB_L_08A6ED20: SB_L_08A6ED2C: { const std::uint32_t vfpu_address = ctx.gpr[21] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[30] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[30] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[30] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[30] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); } { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; ctx.read_vfpu_matrix_ct<36u, 3u>(vfpu_matrix); @@ -1326,10 +1339,8 @@ SB_L_08A6ED2C: ctx.gpr[4] = (ctx.gpr[29] + static_cast(160)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + 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.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[26])) ? 0x00800000u : 0u); // nop diff --git a/profiles/vcs/host/vcs_tier2_cluster_geometry.cpp b/profiles/vcs/host/vcs_tier2_cluster_geometry.cpp index 3a72b98..09cd516 100644 --- a/profiles/vcs/host/vcs_tier2_cluster_geometry.cpp +++ b/profiles/vcs/host/vcs_tier2_cluster_geometry.cpp @@ -1,5 +1,5 @@ // AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Tier-2 SUPERBLOCK V2 cluster: geometry +// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: geometry #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" @@ -956,17 +956,8 @@ SB_L_089554A0: SB_L_089554A8: ctx.gpr[29] = (ctx.gpr[29] + static_cast(-64)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), std::bit_cast(ctx.fpr[20])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[16]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(20), ctx.gpr[17]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(24), ctx.gpr[18]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(28), ctx.gpr[19]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(32), ctx.gpr[20]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(36), ctx.gpr[21]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(40), ctx.gpr[22]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(44), ctx.gpr[23]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(48), ctx.gpr[30]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(52), ctx.gpr[31]); + { const 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]}; + aot_mem.aot_store32_block(ctx.gpr[29] + static_cast(12), tier2_words); } { const bool branch_taken = ctx.gpr[5] == 0u; ctx.gpr[17] = (ctx.gpr[4] | 0u); if (branch_taken) { @@ -1098,20 +1089,16 @@ SB_L_08955608: aot_mem.aot_store32(ctx.gpr[18] + static_cast(20), ctx.gpr[4]); ctx.gpr[23] = (4096u << 16u); ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[23]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[18] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[18] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[22] = (256u << 16u); ctx.gpr[22] = (ctx.gpr[22] + static_cast(-1)); ctx.gpr[5] = (ctx.gpr[21] & ctx.gpr[22]); ctx.gpr[21] = (2560u << 16u); ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[21]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[18] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[18] + static_cast(0)); ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[28] + static_cast(-16976))); ctx.gpr[4] = (17008u << 16u); ctx.fpr[13] = std::bit_cast(ctx.gpr[4]); @@ -1239,11 +1226,9 @@ SB_L_0895570C: aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), ctx.gpr[19]); aot_mem.aot_store8(ctx.gpr[29] + static_cast(4), static_cast(ctx.gpr[4])); ctx.gpr[4] = (2816u << 16u); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); ctx.gpr[19] = (ctx.gpr[4] - ctx.gpr[17]); ctx.gpr[4] = (2236u << 16u); @@ -1284,32 +1269,43 @@ SB_L_0895576C: ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[30]); aot_mem.aot_store32(ctx.gpr[18] + static_cast(20), ctx.gpr[4]); ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[23]); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[18] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[18] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[6] = tier2_old_pointer; } ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[21]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[18] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[18] + static_cast(0)); ctx.gpr[4] = (0u | 255u); aot_mem.aot_store32(ctx.gpr[18] + static_cast(20), ctx.gpr[4]); goto SB_L_089557B4; SB_L_089557B4: - ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(16))); - ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(20))); - ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(24))); - ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(28))); - ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(32))); - ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(36))); - ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(40))); - ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(44))); - ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(48))); - ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(52))); + { std::uint32_t tier2_words[11]{}; + if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(12), tier2_words)) { + ctx.fpr[20] = std::bit_cast(tier2_words[0]); + ctx.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[20] = tier2_words[5]; + ctx.gpr[21] = tier2_words[6]; + ctx.gpr[22] = tier2_words[7]; + ctx.gpr[23] = tier2_words[8]; + ctx.gpr[30] = tier2_words[9]; + ctx.gpr[31] = tier2_words[10]; + } else { + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(16))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(20))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(24))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(28))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(32))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(36))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(40))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(44))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(48))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(52))); + } } jump_target = ctx.gpr[31]; ctx.gpr[29] = (ctx.gpr[29] + static_cast(64)); local_pc = jump_target; @@ -1387,17 +1383,8 @@ SB_L_08956F40: SB_L_08957228: ctx.gpr[29] = (ctx.gpr[29] + static_cast(-64)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), std::bit_cast(ctx.fpr[20])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[16]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[17]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(20), ctx.gpr[18]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(24), ctx.gpr[19]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(28), ctx.gpr[20]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(32), ctx.gpr[21]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(36), ctx.gpr[22]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(40), ctx.gpr[23]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(44), ctx.gpr[30]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(48), ctx.gpr[31]); + { 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]}; + aot_mem.aot_store32_block(ctx.gpr[29] + static_cast(8), tier2_words); } ctx.gpr[6] = (aot_mem.aot_load16(ctx.gpr[5] + static_cast(6))); ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(24))); ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast(0))); @@ -1414,20 +1401,16 @@ SB_L_08957228: aot_mem.aot_store32(ctx.gpr[17] + static_cast(20), ctx.gpr[6]); ctx.gpr[30] = (4096u << 16u); ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[30]); - ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[7] + static_cast(0), ctx.gpr[6]); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); - ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(0), ctx.gpr[6]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[6] = aot_mem.aot_append32(ctx.gpr[17] + static_cast(0), ctx.gpr[6], &tier2_old_pointer); + ctx.gpr[7] = tier2_old_pointer; } ctx.gpr[23] = (256u << 16u); ctx.gpr[23] = (ctx.gpr[23] + static_cast(-1)); ctx.gpr[5] = (ctx.gpr[5] & ctx.gpr[23]); ctx.gpr[22] = (2560u << 16u); ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[22]); aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(0)); ctx.gpr[20] = (0u | 255u); aot_mem.aot_store32(ctx.gpr[17] + static_cast(20), ctx.gpr[20]); ctx.gpr[5] = (0u | 1u); @@ -1511,11 +1494,9 @@ SB_L_08957350: aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[21]); aot_mem.aot_store8(ctx.gpr[29] + static_cast(0), static_cast(ctx.gpr[5])); ctx.gpr[4] = (2816u << 16u); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); ctx.gpr[21] = (ctx.gpr[4] - ctx.gpr[18]); ctx.gpr[4] = (2236u << 16u); @@ -1557,31 +1538,42 @@ SB_L_089573B0: ctx.gpr[4] = (ctx.gpr[4] & ctx.gpr[5]); aot_mem.aot_store32(ctx.gpr[17] + static_cast(20), ctx.gpr[4]); ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[30]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[22]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast(0)); aot_mem.aot_store32(ctx.gpr[17] + static_cast(20), ctx.gpr[20]); goto SB_L_089573F8; SB_L_089573F8: - ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(8))); - ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(16))); - ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(20))); - ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(24))); - ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(28))); - ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(32))); - ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(36))); - ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(40))); - ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(44))); - ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(48))); + { std::uint32_t tier2_words[11]{}; + if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(8), tier2_words)) { + ctx.fpr[20] = std::bit_cast(tier2_words[0]); + ctx.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[20] = tier2_words[5]; + ctx.gpr[21] = tier2_words[6]; + ctx.gpr[22] = tier2_words[7]; + ctx.gpr[23] = tier2_words[8]; + ctx.gpr[30] = tier2_words[9]; + ctx.gpr[31] = tier2_words[10]; + } else { + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(8))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(16))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(20))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(24))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(28))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(32))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(36))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(40))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(44))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(48))); + } } jump_target = ctx.gpr[31]; ctx.gpr[29] = (ctx.gpr[29] + static_cast(64)); local_pc = jump_target; @@ -1595,11 +1587,12 @@ SB_L_0895742C: SB_L_08957500: { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<15u, 4u>(vfpu_value); } ctx.gpr[8] = (aot_mem.aot_load_word_left(ctx.gpr[4] + static_cast(2), ctx.gpr[8])); ctx.gpr[9] = (aot_mem.aot_load_word_left(ctx.gpr[4] + static_cast(6), ctx.gpr[9])); @@ -1832,17 +1825,8 @@ SB_L_089576FC: SB_L_08958D28: ctx.gpr[29] = (ctx.gpr[29] + static_cast(-624)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(576), std::bit_cast(ctx.fpr[20])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(580), ctx.gpr[16]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(584), ctx.gpr[17]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(588), ctx.gpr[18]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(592), ctx.gpr[19]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(596), ctx.gpr[20]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(600), ctx.gpr[21]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(604), ctx.gpr[22]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(608), ctx.gpr[23]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(612), ctx.gpr[30]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(616), ctx.gpr[31]); + { 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]}; + aot_mem.aot_store32_block(ctx.gpr[29] + static_cast(576), tier2_words); } ctx.gpr[16] = (2236u << 16u); ctx.gpr[16] = (ctx.gpr[16] + static_cast(29232)); ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(301))); @@ -2123,11 +2107,12 @@ SB_L_08958F34: SB_L_08958F60: { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { float vfpu_s[4]{}, vfpu_d[4]{}; ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); @@ -2136,10 +2121,8 @@ SB_L_08958F60: ctx.gpr[4] = (ctx.gpr[29] + static_cast(96)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + 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[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(548))); ctx.gpr[4] = (static_cast(ctx.gpr[16]) < static_cast(ctx.gpr[4]) ? 1u : 0u); { const bool branch_taken = ctx.gpr[4] == 0u; @@ -2247,70 +2230,66 @@ SB_L_08959024: SB_L_08959070: { const std::uint32_t vfpu_address = ctx.gpr[30] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } ctx.gpr[4] = (ctx.gpr[29] + static_cast(320)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + 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[16] + static_cast(96))); ctx.gpr[4] = (std::bit_cast(ctx.fpr[12])); ctx.set_vfpu_scalar_bits_ct<1u>(ctx.gpr[4]); { const std::uint32_t vfpu_address = ctx.gpr[18] + static_cast(0); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } ctx.execute_vfpu_vscl_ct<0u, 0u, 1u, 3u>(); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[18] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + 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[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(100))); ctx.gpr[4] = (std::bit_cast(ctx.fpr[13])); ctx.set_vfpu_scalar_bits_ct<1u>(ctx.gpr[4]); { const std::uint32_t vfpu_address = ctx.gpr[22] + static_cast(0); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } ctx.execute_vfpu_vscl_ct<0u, 0u, 1u, 3u>(); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[22] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + 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[16] + static_cast(104))); ctx.gpr[4] = (std::bit_cast(ctx.fpr[12])); ctx.set_vfpu_scalar_bits_ct<1u>(ctx.gpr[4]); { const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast(0); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } ctx.execute_vfpu_vscl_ct<0u, 0u, 1u, 3u>(); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + 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[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(104))); ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(580))); ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(20))); @@ -2351,40 +2330,45 @@ SB_L_08959118: ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(88))); aot_mem.aot_store32(ctx.gpr[29] + static_cast(264), std::bit_cast(ctx.fpr[12])); { const std::uint32_t vfpu_address = ctx.gpr[23] + static_cast(0); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(572))); { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); } { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; ctx.read_vfpu_matrix_ct<36u, 3u>(vfpu_matrix); @@ -2416,10 +2400,8 @@ SB_L_08959118: ctx.gpr[4] = (ctx.gpr[29] + static_cast(384)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + 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(384))); ctx.gpr[4] = (std::bit_cast(ctx.fpr[12])); ctx.set_vfpu_scalar_bits_ct<0u>(ctx.gpr[4]); @@ -2544,11 +2526,12 @@ SB_L_08959234: SB_L_08959258: { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { float vfpu_s[4]{}, vfpu_d[4]{}; ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); @@ -2557,10 +2540,8 @@ SB_L_08959258: ctx.gpr[4] = (ctx.gpr[29] + static_cast(112)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + 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[4] = (2236u << 16u); ctx.gpr[4] = (ctx.gpr[4] + static_cast(29552)); ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(-23440))); @@ -2648,48 +2629,34 @@ SB_L_08959314: ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); ctx.gpr[5] = (5888u << 16u); ctx.gpr[5] = (ctx.gpr[5] + static_cast(1)); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[5] = aot_mem.aot_append32(ctx.gpr[4] + static_cast(0), ctx.gpr[5], &tier2_old_pointer); + ctx.gpr[6] = tier2_old_pointer; } ctx.gpr[6] = (23808u << 16u); ctx.gpr[6] = (ctx.gpr[6] + static_cast(255)); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[4] + static_cast(0)); ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(9004))); ctx.gpr[7] = (23552u << 16u); ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[4] + static_cast(0)); ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(8544))); ctx.gpr[7] = (21504u << 16u); ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[4] + 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[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[4] + static_cast(0)); ctx.gpr[6] = (51457u << 16u); ctx.gpr[6] = (ctx.gpr[6] + static_cast(256)); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[4] + static_cast(0)); ctx.gpr[6] = (39680u << 16u); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[4] + static_cast(0)); ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(500))); { const bool branch_taken = ctx.gpr[4] != 0u; // nop @@ -2719,11 +2686,12 @@ SB_L_089593F0: SB_L_08959414: { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { float vfpu_s[4]{}, vfpu_d[4]{}; ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); @@ -2732,10 +2700,8 @@ SB_L_08959414: ctx.gpr[16] = (ctx.gpr[29] + static_cast(128)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[16] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + 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[17] = (ctx.gpr[29] + static_cast(144)); ctx.gpr[5] = (2246u << 16u); ctx.gpr[5] = (ctx.gpr[5] + static_cast(1408)); @@ -2761,9 +2727,16 @@ SB_L_0895944C: TIER2_SB_RETURN(); SB_L_08959458: - ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(64))); - ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(68))); - ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(72))); + { std::uint32_t tier2_words[3]{}; + if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(64), tier2_words)) { + ctx.fpr[12] = std::bit_cast(tier2_words[0]); + ctx.fpr[13] = std::bit_cast(tier2_words[1]); + ctx.fpr[14] = std::bit_cast(tier2_words[2]); + } else { + ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(64))); + ctx.fpr[13] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(68))); + ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(72))); + } } ctx.gpr[31] = (0x0895946Cu); ctx.gpr[4] = (ctx.gpr[17] | 0u); if (rt.invoke_chained_direct<&recomp_unit_0023_entry, 23u, 4u, 0x08860094u>(ctx, &aot_mem) && ctx.pc == 0x0895946Cu) goto SB_L_0895946C; @@ -2776,9 +2749,7 @@ SB_L_0895946C: aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[18]); ctx.gpr[4] = (15360u << 16u); aot_mem.aot_store32(ctx.gpr[18] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[16] + static_cast(0)); ctx.gpr[4] = (ctx.gpr[16] | 0u); ctx.gpr[5] = (0u | 61u); ctx.gpr[31] = (0x089594A0u); @@ -2788,11 +2759,9 @@ SB_L_0895946C: SB_L_089594A0: ctx.gpr[4] = (2816u << 16u); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[5] = (ctx.gpr[18] + static_cast(-8)); ctx.gpr[6] = (15u << 16u); aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); @@ -2894,60 +2863,68 @@ SB_L_0895957C: SB_L_08959598: ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(564))); { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<36u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<37u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<38u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<39u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(64); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<40u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(80); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<41u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(96); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<42u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(112); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<43u, 4u>(vfpu_value); } ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(588))); ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(32))); @@ -3027,11 +3004,12 @@ SB_L_0895964C: SB_L_08959654: { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<27u, 4u>(vfpu_value); } goto SB_L_08959658; @@ -3071,24 +3049,21 @@ SB_L_0895968C: ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[6]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[5] + static_cast(0)); ctx.gpr[4] = (ctx.gpr[29] + static_cast(128)); { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(552))); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + const 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); } goto SB_L_089596E4; SB_L_089596E4: @@ -3705,24 +3680,21 @@ SB_L_089599B4: aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[7]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[6] + static_cast(0)); ctx.gpr[4] = (ctx.gpr[29] + static_cast(112)); { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(552))); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + const 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 bool branch_taken = 0u == 0u; // nop if (branch_taken) { @@ -4555,27 +4527,19 @@ SB_L_08959E54: ctx.gpr[4] = (ctx.gpr[4] & 255u); ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[5]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[6] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[5] = (57088u << 16u); ctx.gpr[5] = (ctx.gpr[5] + static_cast(50)); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[6] + static_cast(0)); ctx.gpr[5] = (57344u << 16u); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[6] + static_cast(0)); ctx.gpr[5] = (57600u << 16u); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[6] + static_cast(0)); ctx.gpr[5] = (59136u << 16u); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); @@ -4589,28 +4553,20 @@ SB_L_08959E54: ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); ctx.gpr[5] = (ctx.gpr[5] >> 8u); ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[6] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[5] = (50944u << 16u); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[6] + static_cast(0)); ctx.gpr[5] = (23808u << 16u); ctx.gpr[5] = (ctx.gpr[5] + static_cast(255)); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[6] + static_cast(0)); ctx.gpr[5] = (56319u << 16u); ctx.gpr[5] = (ctx.gpr[5] + static_cast(4103)); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[6] + static_cast(0)); { const bool branch_taken = 0u == 0u; // nop if (branch_taken) { @@ -4641,60 +4597,68 @@ SB_L_08959F54: SB_L_08959F5C: ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(564))); { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<36u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<37u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<38u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<39u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(64); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<40u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(80); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<41u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(96); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<42u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(112); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<43u, 4u>(vfpu_value); } ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(580))); ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(32))); @@ -4767,11 +4731,12 @@ SB_L_08959FF4: SB_L_08959FFC: { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<27u, 4u>(vfpu_value); } goto SB_L_0895A000; @@ -5097,27 +5062,19 @@ SB_L_0895A1B8: ctx.gpr[4] = (ctx.gpr[4] & 255u); ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[5]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[6] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[5] = (57088u << 16u); ctx.gpr[5] = (ctx.gpr[5] + static_cast(50)); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[6] + static_cast(0)); ctx.gpr[5] = (57344u << 16u); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[6] + static_cast(0)); ctx.gpr[5] = (57600u << 16u); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[6] + static_cast(0)); ctx.gpr[5] = (59136u << 16u); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); @@ -5131,22 +5088,16 @@ SB_L_0895A1B8: ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); ctx.gpr[5] = (ctx.gpr[5] >> 8u); ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[6] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[5] = (50944u << 16u); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[6] + static_cast(0)); ctx.gpr[5] = (56319u << 16u); ctx.gpr[5] = (ctx.gpr[5] + static_cast(4103)); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[6] + static_cast(0)); goto SB_L_0895A298; SB_L_0895A298: @@ -5190,60 +5141,68 @@ SB_L_0895A2E0: ctx.gpr[22] = (0u | 0u); ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(564))); { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<36u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<37u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<38u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<39u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(64); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<40u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(80); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<41u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(96); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<42u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(112); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<43u, 4u>(vfpu_value); } ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11764))); ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(11768))); @@ -5303,23 +5262,20 @@ SB_L_0895A36C: ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[6]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[5] + static_cast(0)); ctx.gpr[4] = (ctx.gpr[29] + static_cast(128)); { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[11] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + const 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 bool branch_taken = 0u == 0u; // nop if (branch_taken) { @@ -5345,23 +5301,20 @@ SB_L_0895A3BC: aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[6]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[5] + static_cast(0)); ctx.gpr[4] = (ctx.gpr[29] + static_cast(112)); { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[11] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + const 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); } goto SB_L_0895A414; SB_L_0895A414: @@ -5378,11 +5331,9 @@ SB_L_0895A420: ctx.gpr[4] = (23808u << 16u); ctx.gpr[18] = (aot_mem.aot_load8(ctx.gpr[16] + static_cast(9))); ctx.gpr[4] = (ctx.gpr[18] | ctx.gpr[4]); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[5] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[5] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[6] = tier2_old_pointer; } ctx.gpr[4] = (ctx.gpr[18] + static_cast(-16)); ctx.gpr[6] = (static_cast(ctx.gpr[4]) < 0 ? 1u : 0u); { const bool branch_taken = ctx.gpr[6] != 0u; @@ -5480,11 +5431,9 @@ SB_L_0895A4A4: ctx.gpr[5] = (ctx.gpr[19] << 8u); ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[6] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[6] + static_cast(0))); goto SB_L_0895A4D0; @@ -5567,9 +5516,7 @@ SB_L_0895A510: ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[30]); aot_mem.aot_store32(ctx.gpr[29] + static_cast(572), ctx.gpr[30]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[23] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[23] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[23] + static_cast(0)); ctx.gpr[6] = (59136u << 16u); ctx.gpr[6] = (ctx.gpr[6] + static_cast(1)); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); @@ -5589,9 +5536,7 @@ SB_L_0895A560: aot_mem.aot_store32(ctx.gpr[23] + static_cast(0), ctx.gpr[4]); ctx.gpr[5] = (59136u << 16u); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[23] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[23] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[23] + static_cast(0)); ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(568))); ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(572))); goto SB_L_0895A588; @@ -5611,11 +5556,9 @@ SB_L_0895A598: ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(508))); ctx.gpr[5] = (56319u << 16u); ctx.gpr[5] = (ctx.gpr[5] + static_cast(4102)); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[5] = aot_mem.aot_append32(ctx.gpr[4] + static_cast(0), ctx.gpr[5], &tier2_old_pointer); + ctx.gpr[6] = tier2_old_pointer; } ctx.gpr[6] = (59136u << 16u); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); @@ -5629,28 +5572,20 @@ SB_L_0895A598: ctx.gpr[6] = (std::bit_cast(ctx.fpr[12])); ctx.gpr[6] = (ctx.gpr[6] >> 8u); ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[5] = aot_mem.aot_append32(ctx.gpr[4] + static_cast(0), ctx.gpr[5], &tier2_old_pointer); + ctx.gpr[6] = tier2_old_pointer; } ctx.gpr[6] = (21504u << 16u); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[4] + static_cast(0)); ctx.gpr[6] = (23808u << 16u); ctx.gpr[6] = (ctx.gpr[6] + static_cast(255)); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[4] + static_cast(0)); ctx.gpr[6] = (23808u << 16u); ctx.gpr[6] = (ctx.gpr[6] + static_cast(-1)); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[4] + static_cast(0)); ctx.gpr[6] = (16256u << 16u); ctx.fpr[12] = std::bit_cast(ctx.gpr[6]); ctx.gpr[6] = (std::bit_cast(ctx.fpr[12])); @@ -5658,23 +5593,17 @@ SB_L_0895A598: ctx.gpr[7] = (18432u << 16u); ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[4] + static_cast(0)); ctx.gpr[6] = (std::bit_cast(ctx.fpr[12])); ctx.gpr[6] = (ctx.gpr[6] >> 8u); ctx.gpr[7] = (18688u << 16u); ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[4] + static_cast(0)); ctx.gpr[6] = (51456u << 16u); ctx.gpr[6] = (ctx.gpr[6] + static_cast(256)); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[4] + static_cast(0)); ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(1464))); ctx.gpr[6] = (256u << 16u); ctx.gpr[6] = (ctx.gpr[6] + static_cast(-1)); @@ -5693,24 +5622,21 @@ SB_L_0895A598: aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[4] + static_cast(0)); ctx.gpr[4] = (ctx.gpr[29] + static_cast(112)); { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(552))); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + const 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[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(216))); ctx.gpr[4] = (ctx.gpr[4] & 1u); { const bool branch_taken = ctx.gpr[4] == 0u; @@ -5738,17 +5664,32 @@ SB_L_0895A724: TIER2_SB_RETURN(); SB_L_0895A72C: - ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(576))); - ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(580))); - ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(584))); - ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(588))); - ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(592))); - ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(596))); - ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(600))); - ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(604))); - ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(608))); - ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(612))); - ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(616))); + { std::uint32_t tier2_words[11]{}; + if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(576), tier2_words)) { + ctx.fpr[20] = std::bit_cast(tier2_words[0]); + ctx.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[20] = tier2_words[5]; + ctx.gpr[21] = tier2_words[6]; + ctx.gpr[22] = tier2_words[7]; + ctx.gpr[23] = tier2_words[8]; + ctx.gpr[30] = tier2_words[9]; + ctx.gpr[31] = tier2_words[10]; + } else { + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(576))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(580))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(584))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(588))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(592))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(596))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(600))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(604))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(608))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(612))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(616))); + } } jump_target = ctx.gpr[31]; ctx.gpr[29] = (ctx.gpr[29] + static_cast(624)); local_pc = jump_target; @@ -5756,22 +5697,8 @@ SB_L_0895A72C: SB_L_0895A760: ctx.gpr[29] = (ctx.gpr[29] + static_cast(-144)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(72), std::bit_cast(ctx.fpr[20])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(76), std::bit_cast(ctx.fpr[22])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(80), std::bit_cast(ctx.fpr[24])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(84), std::bit_cast(ctx.fpr[26])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(88), std::bit_cast(ctx.fpr[28])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(92), std::bit_cast(ctx.fpr[30])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(96), ctx.gpr[16]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(100), ctx.gpr[17]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(104), ctx.gpr[18]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(108), ctx.gpr[19]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(112), ctx.gpr[20]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(116), ctx.gpr[21]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(120), ctx.gpr[22]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(124), ctx.gpr[23]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(128), ctx.gpr[30]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(132), ctx.gpr[31]); + { const std::uint32_t tier2_words[16]{std::bit_cast(ctx.fpr[20]), std::bit_cast(ctx.fpr[22]), std::bit_cast(ctx.fpr[24]), std::bit_cast(ctx.fpr[26]), std::bit_cast(ctx.fpr[28]), std::bit_cast(ctx.fpr[30]), 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(72), tier2_words); } ctx.gpr[6] = (ctx.gpr[6] & 255u); ctx.gpr[7] = (0u | 0u); aot_mem.aot_store32(ctx.gpr[29] + static_cast(52), ctx.gpr[6]); @@ -5801,11 +5728,9 @@ SB_L_0895A760: SB_L_0895A7F4: ctx.gpr[4] = (4608u << 16u); ctx.gpr[4] = (ctx.gpr[4] + static_cast(277)); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[4] = (3840u << 16u); ctx.gpr[4] = (ctx.gpr[7] & ctx.gpr[4]); ctx.gpr[5] = (ctx.gpr[4] >> 8u); @@ -5815,20 +5740,16 @@ SB_L_0895A7F4: aot_mem.aot_store32(ctx.gpr[16] + static_cast(20), ctx.gpr[4]); ctx.gpr[5] = (4096u << 16u); ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[5]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[5] = (256u << 16u); ctx.gpr[5] = (ctx.gpr[5] + static_cast(-1)); ctx.gpr[5] = (ctx.gpr[7] & ctx.gpr[5]); ctx.gpr[6] = (256u << 16u); ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[16] + static_cast(0)); goto SB_L_0895A86C; SB_L_0895A86C: @@ -5892,11 +5813,9 @@ SB_L_0895A904: ctx.gpr[6] = (std::bit_cast(ctx.fpr[24])); ctx.gpr[6] = (ctx.gpr[6] >> 8u); ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[5] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[5], &tier2_old_pointer); + ctx.gpr[6] = tier2_old_pointer; } goto SB_L_0895A92C; SB_L_0895A92C: @@ -5916,11 +5835,9 @@ SB_L_0895A93C: ctx.gpr[6] = (std::bit_cast(ctx.fpr[28])); ctx.gpr[6] = (ctx.gpr[6] >> 8u); ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[5] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[5], &tier2_old_pointer); + ctx.gpr[6] = tier2_old_pointer; } goto SB_L_0895A964; SB_L_0895A964: @@ -5946,11 +5863,9 @@ SB_L_0895A970: SB_L_0895A97C: ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(9004))); ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[5] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[5], &tier2_old_pointer); + ctx.gpr[6] = tier2_old_pointer; } goto SB_L_0895A998; SB_L_0895A998: @@ -6025,11 +5940,9 @@ SB_L_0895A9D8: ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); ctx.gpr[5] = (ctx.gpr[5] >> 8u); ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast(4))); ctx.gpr[6] = (ctx.gpr[6] & 15u); ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(44))); @@ -6054,11 +5967,9 @@ SB_L_0895AA24: ctx.gpr[4] = (std::bit_cast(ctx.fpr[22])); ctx.gpr[4] = (ctx.gpr[4] >> 8u); ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[10]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[5] = (std::bit_cast(ctx.fpr[22])); ctx.gpr[5] = (ctx.gpr[5] >> 8u); ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[9]); @@ -6166,11 +6077,9 @@ SB_L_0895AAF0: ctx.gpr[4] = (std::bit_cast(ctx.fpr[22])); ctx.gpr[4] = (ctx.gpr[4] >> 8u); ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[10]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[5] = (std::bit_cast(ctx.fpr[22])); ctx.gpr[5] = (ctx.gpr[5] >> 8u); ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[9]); @@ -6189,18 +6098,14 @@ SB_L_0895AB30: ctx.gpr[4] = (std::bit_cast(ctx.fpr[12])); ctx.gpr[4] = (ctx.gpr[4] >> 8u); ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[10]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[5] = (std::bit_cast(ctx.fpr[13])); ctx.gpr[5] = (ctx.gpr[5] >> 8u); ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[9]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[16] + static_cast(0)); aot_mem.aot_store8(ctx.gpr[29] + static_cast(60), static_cast(ctx.gpr[19])); goto SB_L_0895AB70; @@ -6241,11 +6146,9 @@ SB_L_0895ABAC: { const std::int64_t product = static_cast(static_cast(ctx.gpr[5])) * static_cast(static_cast(ctx.gpr[4])); ctx.lo = static_cast(product); ctx.hi = static_cast(static_cast(product) >> 32u); } ctx.gpr[4] = (ctx.lo); ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[7]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } aot_mem.aot_store8(ctx.gpr[29] + static_cast(48), static_cast(ctx.gpr[19])); goto SB_L_0895ABDC; @@ -6274,11 +6177,9 @@ SB_L_0895ABEC: SB_L_0895ABFC: ctx.gpr[4] = (7680u << 16u); ctx.gpr[4] = (ctx.gpr[4] + static_cast(1)); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[29] + static_cast(12), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[17] + static_cast(0)))))); ctx.gpr[5] = (ctx.gpr[5] & 112u); ctx.gpr[6] = (49664u << 16u); @@ -6287,17 +6188,13 @@ SB_L_0895ABFC: ctx.gpr[5] = (ctx.gpr[5] << 16u); ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[29] + static_cast(12)); ctx.gpr[5] = (49920u << 16u); ctx.gpr[6] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[17] + static_cast(0)))))); ctx.gpr[6] = (ctx.gpr[6] & 7u); ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[29] + static_cast(12)); ctx.gpr[5] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[17] + static_cast(0)))))); ctx.gpr[6] = (ctx.gpr[5] & 8u); ctx.gpr[6] = (ctx.gpr[6] >> 3u); @@ -6308,15 +6205,11 @@ SB_L_0895ABFC: ctx.gpr[5] = (ctx.gpr[5] << 8u); ctx.gpr[5] = (ctx.gpr[6] | ctx.gpr[5]); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[29] + static_cast(12)); ctx.gpr[5] = (50433u << 16u); ctx.gpr[5] = (ctx.gpr[5] + static_cast(-253)); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[29] + static_cast(12)); ctx.gpr[4] = (static_cast(static_cast(static_cast(aot_mem.aot_load8(ctx.gpr[17] + static_cast(0)))))); ctx.gpr[4] = (ctx.gpr[4] & 7u); ctx.gpr[13] = (ctx.gpr[4] ^ 4u); @@ -6386,28 +6279,22 @@ SB_L_0895AD38: ctx.gpr[7] = (ctx.gpr[4] + static_cast(160)); ctx.gpr[7] = (ctx.gpr[7] << 24u); ctx.gpr[7] = (ctx.gpr[7] | ctx.gpr[12]); - ctx.gpr[8] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - aot_mem.aot_store32(ctx.gpr[8] + static_cast(0), ctx.gpr[7]); - ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - ctx.gpr[7] = (ctx.gpr[7] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[7]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[7] = aot_mem.aot_append32(ctx.gpr[29] + static_cast(12), ctx.gpr[7], &tier2_old_pointer); + ctx.gpr[8] = tier2_old_pointer; } ctx.gpr[8] = (ctx.gpr[4] + static_cast(168)); ctx.gpr[8] = (ctx.gpr[8] << 24u); ctx.gpr[5] = (ctx.gpr[8] | ctx.gpr[5]); ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[3]); aot_mem.aot_store32(ctx.gpr[7] + static_cast(0), ctx.gpr[5]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[29] + static_cast(12)); ctx.gpr[7] = (ctx.gpr[4] + static_cast(184)); ctx.gpr[7] = (ctx.gpr[7] << 24u); ctx.gpr[7] = (ctx.gpr[7] | ctx.gpr[2]); ctx.gpr[8] = (ctx.gpr[11] << 8u); ctx.gpr[7] = (ctx.gpr[7] | ctx.gpr[8]); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[7]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[29] + static_cast(12)); ctx.gpr[5] = (ctx.gpr[19] << (ctx.gpr[11] & 31u)); { const std::int64_t product = static_cast(static_cast(ctx.gpr[6])) * static_cast(static_cast(ctx.gpr[5])); ctx.lo = static_cast(product); ctx.hi = static_cast(static_cast(product) >> 32u); } ctx.gpr[5] = (ctx.lo); @@ -6471,19 +6358,13 @@ SB_L_0895AE00: aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[5]); ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[6]); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[29] + static_cast(12)); ctx.gpr[5] = (51968u << 16u); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[29] + static_cast(12)); ctx.gpr[5] = (2816u << 16u); aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[29] + static_cast(12)); ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); ctx.gpr[17] = (ctx.gpr[4] - ctx.gpr[5]); ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(68))); @@ -6535,11 +6416,9 @@ SB_L_0895AEC0: ctx.gpr[4] = (4096u << 16u); aot_mem.aot_store32(ctx.gpr[16] + static_cast(20), ctx.gpr[5]); ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } goto SB_L_0895AEF0; SB_L_0895AEF0: @@ -6547,11 +6426,9 @@ SB_L_0895AEF0: ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[21] + static_cast(4))); ctx.gpr[5] = (ctx.gpr[5] & ctx.gpr[20]); ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } { const bool branch_taken = 0u == 0u; // nop if (branch_taken) { @@ -6562,11 +6439,9 @@ SB_L_0895AEF0: SB_L_0895AF1C: ctx.gpr[4] = (7680u << 16u); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } goto SB_L_0895AF34; SB_L_0895AF34: @@ -6580,11 +6455,9 @@ SB_L_0895AF34: SB_L_0895AF3C: ctx.gpr[4] = (7680u << 16u); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } goto SB_L_0895AF54; SB_L_0895AF54: @@ -6618,11 +6491,9 @@ SB_L_0895AF6C: aot_mem.aot_store8(ctx.gpr[23] + static_cast(1472), static_cast(ctx.gpr[6])); ctx.gpr[5] = (7424u << 16u); ctx.gpr[5] = (ctx.gpr[5] + static_cast(1)); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[5] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[5], &tier2_old_pointer); + ctx.gpr[6] = tier2_old_pointer; } goto SB_L_0895AFC4; SB_L_0895AFC4: @@ -6825,11 +6696,9 @@ SB_L_0895B168: SB_L_0895B174: ctx.gpr[4] = (39680u << 16u); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } { const bool branch_taken = 0u == 0u; // nop if (branch_taken) { @@ -6869,18 +6738,14 @@ SB_L_0895B1B4: ctx.gpr[7] = (ctx.gpr[30] & ctx.gpr[20]); ctx.gpr[6] = (ctx.gpr[7] | ctx.gpr[6]); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[16] + static_cast(0)); goto SB_L_0895B1FC; SB_L_0895B1FC: ctx.gpr[4] = (ctx.gpr[17] | ctx.gpr[4]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } goto SB_L_0895B214; SB_L_0895B214: @@ -6897,11 +6762,9 @@ SB_L_0895B214: SB_L_0895B228: ctx.gpr[4] = (ctx.gpr[17] | ctx.gpr[4]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } goto SB_L_0895B240; SB_L_0895B240: @@ -6925,21 +6788,17 @@ SB_L_0895B258: ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); ctx.gpr[5] = (ctx.gpr[5] >> 8u); ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(64))); ctx.gpr[5] = (7424u << 16u); aot_mem.aot_store8(ctx.gpr[23] + static_cast(1472), static_cast(0u)); ctx.gpr[4] = (ctx.gpr[4] & 255u); ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[5]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[4], &tier2_old_pointer); + ctx.gpr[5] = tier2_old_pointer; } goto SB_L_0895B2B0; SB_L_0895B2B0: @@ -6967,11 +6826,9 @@ SB_L_0895B2CC: ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(9004))); ctx.gpr[6] = (23552u << 16u); ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[5]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[5]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[5] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[5], &tier2_old_pointer); + ctx.gpr[6] = tier2_old_pointer; } goto SB_L_0895B2EC; SB_L_0895B2EC: @@ -6989,40 +6846,56 @@ SB_L_0895B2F8: ctx.gpr[6] = (ctx.gpr[6] >> 8u); ctx.gpr[7] = (18944u << 16u); ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]); - ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - aot_mem.aot_store32(ctx.gpr[7] + static_cast(0), ctx.gpr[6]); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[6]); + { std::uint32_t tier2_old_pointer = 0u; + ctx.gpr[6] = aot_mem.aot_append32(ctx.gpr[16] + static_cast(0), ctx.gpr[6], &tier2_old_pointer); + ctx.gpr[7] = tier2_old_pointer; } ctx.gpr[7] = (std::bit_cast(ctx.fpr[22])); ctx.gpr[7] = (ctx.gpr[7] >> 8u); ctx.gpr[8] = (19200u << 16u); ctx.gpr[7] = (ctx.gpr[7] | ctx.gpr[8]); aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[7]); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast(0))); - ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[6]); + ctx.gpr[6] = aot_mem.aot_advance32(ctx.gpr[16] + static_cast(0)); goto SB_L_0895B33C; SB_L_0895B33C: ctx.gpr[2] = (ctx.gpr[5] | ctx.gpr[4]); ctx.gpr[2] = (0u < ctx.gpr[2] ? 1u : 0u); - ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(72))); - ctx.fpr[22] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(76))); - ctx.fpr[24] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(80))); - ctx.fpr[26] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(84))); - ctx.fpr[28] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(88))); - ctx.fpr[30] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(92))); - ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(96))); - ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); - ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(104))); - ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(108))); - ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(112))); - ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(116))); - ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(120))); - ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(124))); - ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(128))); - ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(132))); + { std::uint32_t tier2_words[16]{}; + if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(72), 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.fpr[28] = std::bit_cast(tier2_words[4]); + ctx.fpr[30] = std::bit_cast(tier2_words[5]); + ctx.gpr[16] = tier2_words[6]; + ctx.gpr[17] = tier2_words[7]; + ctx.gpr[18] = tier2_words[8]; + ctx.gpr[19] = tier2_words[9]; + ctx.gpr[20] = tier2_words[10]; + ctx.gpr[21] = tier2_words[11]; + ctx.gpr[22] = tier2_words[12]; + ctx.gpr[23] = tier2_words[13]; + ctx.gpr[30] = tier2_words[14]; + ctx.gpr[31] = tier2_words[15]; + } else { + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(72))); + ctx.fpr[22] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(76))); + ctx.fpr[24] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(80))); + ctx.fpr[26] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(84))); + ctx.fpr[28] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(88))); + ctx.fpr[30] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(92))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(96))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(100))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(104))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(108))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(112))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(116))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(120))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(124))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(128))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(132))); + } } jump_target = ctx.gpr[31]; ctx.gpr[29] = (ctx.gpr[29] + static_cast(144)); local_pc = jump_target; diff --git a/profiles/vcs/host/vcs_tier2_cluster_matrix.cpp b/profiles/vcs/host/vcs_tier2_cluster_matrix.cpp index e36063a..24ec5ea 100644 --- a/profiles/vcs/host/vcs_tier2_cluster_matrix.cpp +++ b/profiles/vcs/host/vcs_tier2_cluster_matrix.cpp @@ -1,5 +1,5 @@ // AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Tier-2 SUPERBLOCK V2 cluster: matrix +// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: matrix #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" @@ -237,72 +237,71 @@ TIER2_ENTRY_DISPATCH: SB_L_088B4738: ctx.gpr[29] = (ctx.gpr[29] + static_cast(-352)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(296), std::bit_cast(ctx.fpr[20])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(300), ctx.gpr[16]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(304), ctx.gpr[17]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(308), ctx.gpr[18]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(312), ctx.gpr[19]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(316), ctx.gpr[20]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(320), ctx.gpr[21]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(324), ctx.gpr[22]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(328), ctx.gpr[23]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(332), ctx.gpr[30]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(336), ctx.gpr[31]); + { const std::uint32_t 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]}; + aot_mem.aot_store32_block(ctx.gpr[29] + static_cast(296), tier2_words); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[4] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<3u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<36u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[6] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<37u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[6] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<38u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[6] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<19u, 4u>(vfpu_value); } { float vfpu_value[4]{}; ctx.write_vfpu_vector_with_destination_prefix_ct<39u, 3u>(vfpu_value); } @@ -351,26 +350,29 @@ SB_L_088B4738: ctx.write_vfpu_matrix(vfpu_d, 44u, 4u); ctx.eat_vfpu_prefixes(); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<8u, 4u>(vfpu_value); } ctx.gpr[4] = (ctx.gpr[7] + static_cast(16)); { const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<28u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<29u, 4u>(vfpu_value); } { float vfpu_s[4]{}, vfpu_d[4]{}; ctx.read_vfpu_vector_with_source_prefix_ct<104u, 1u, 0u>(vfpu_s); @@ -424,10 +426,8 @@ SB_L_088B4738: ctx.gpr[4] = (ctx.gpr[29] + static_cast(16)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<20u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + 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.execute_vfpu_vcmp_ct<20u, 16u, 3u, 2u>(); { const bool branch_taken = ((ctx.vfpu_ctrl[3] >> 4u) & 1u) != 0u; // nop @@ -769,9 +769,8 @@ SB_L_088B4A08: ctx.gpr[8] = (std::bit_cast(ctx.fpr[13])); ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[5] + static_cast(8))); ctx.gpr[5] = (std::bit_cast(ctx.fpr[14])); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[7]); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(4), ctx.gpr[8]); - aot_mem.aot_store32(ctx.gpr[6] + static_cast(8), ctx.gpr[5]); + { const std::uint32_t tier2_words[3]{ctx.gpr[7], ctx.gpr[8], ctx.gpr[5]}; + aot_mem.aot_store32_block(ctx.gpr[6] + static_cast(0), tier2_words); } ctx.gpr[5] = (ctx.gpr[19] + static_cast(28)); ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(0))); ctx.gpr[7] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(1))); @@ -795,9 +794,8 @@ SB_L_088B4AC8: ctx.gpr[6] = (std::bit_cast(ctx.fpr[13])); ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[22] + static_cast(8))); ctx.gpr[7] = (std::bit_cast(ctx.fpr[14])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(80), ctx.gpr[5]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(84), ctx.gpr[6]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(88), ctx.gpr[7]); + { const std::uint32_t tier2_words[3]{ctx.gpr[5], ctx.gpr[6], ctx.gpr[7]}; + aot_mem.aot_store32_block(ctx.gpr[29] + static_cast(80), tier2_words); } ctx.fpr[15] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[22] + static_cast(12))); aot_mem.aot_store32(ctx.gpr[29] + static_cast(92), std::bit_cast(ctx.fpr[15])); ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast(0))); @@ -1009,9 +1007,8 @@ SB_L_088B4C7C: ctx.gpr[5] = (std::bit_cast(ctx.fpr[13])); ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(8))); ctx.gpr[6] = (std::bit_cast(ctx.fpr[14])); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(0), ctx.gpr[4]); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(4), ctx.gpr[5]); - aot_mem.aot_store32(ctx.gpr[16] + static_cast(8), ctx.gpr[6]); + { const std::uint32_t tier2_words[3]{ctx.gpr[4], ctx.gpr[5], ctx.gpr[6]}; + aot_mem.aot_store32_block(ctx.gpr[16] + static_cast(0), tier2_words); } ctx.fpr[15] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(16))); aot_mem.aot_store32(ctx.gpr[29] + static_cast(144), std::bit_cast(ctx.fpr[15])); ctx.fpr[15] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(20))); @@ -1019,32 +1016,36 @@ SB_L_088B4C7C: ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[16] + static_cast(24))); aot_mem.aot_store32(ctx.gpr[29] + static_cast(152), std::bit_cast(ctx.fpr[12])); { const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast(0); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[20] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[20] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); } { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; ctx.read_vfpu_matrix(vfpu_matrix, 36u, 3u); @@ -1070,10 +1071,8 @@ SB_L_088B4C7C: ctx.write_vfpu_vector_with_destination_prefix(vfpu_result, 0u, vfpu_side); } { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + 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[4] = (ctx.gpr[16] + static_cast(16)); ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(0))); ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); @@ -1081,9 +1080,8 @@ SB_L_088B4C7C: ctx.gpr[6] = (std::bit_cast(ctx.fpr[13])); ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(8))); ctx.gpr[7] = (std::bit_cast(ctx.fpr[14])); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(4), ctx.gpr[6]); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(8), ctx.gpr[7]); + { const std::uint32_t tier2_words[3]{ctx.gpr[5], ctx.gpr[6], ctx.gpr[7]}; + aot_mem.aot_store32_block(ctx.gpr[4] + static_cast(0), tier2_words); } ctx.gpr[18] = (ctx.gpr[18] + static_cast(1)); ctx.gpr[4] = (static_cast(ctx.gpr[18]) < static_cast(ctx.gpr[21]) ? 1u : 0u); { const bool branch_taken = ctx.gpr[4] != 0u; @@ -1347,9 +1345,8 @@ SB_L_088B4EE4: ctx.gpr[5] = (std::bit_cast(ctx.fpr[13])); ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[18] + static_cast(8))); ctx.gpr[6] = (std::bit_cast(ctx.fpr[14])); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(0), ctx.gpr[4]); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(4), ctx.gpr[5]); - aot_mem.aot_store32(ctx.gpr[17] + static_cast(8), ctx.gpr[6]); + { const std::uint32_t tier2_words[3]{ctx.gpr[4], ctx.gpr[5], ctx.gpr[6]}; + aot_mem.aot_store32_block(ctx.gpr[17] + static_cast(0), tier2_words); } ctx.fpr[15] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(16))); aot_mem.aot_store32(ctx.gpr[29] + static_cast(176), std::bit_cast(ctx.fpr[15])); ctx.fpr[15] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(20))); @@ -1357,32 +1354,36 @@ SB_L_088B4EE4: ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(24))); aot_mem.aot_store32(ctx.gpr[29] + static_cast(184), std::bit_cast(ctx.fpr[12])); { const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast(0); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[20] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.gpr[20] + 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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); } { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); } { float vfpu_matrix[16]{}, vfpu_target_raw[4]{}, vfpu_target[4]{}, vfpu_result[4]{}; ctx.read_vfpu_matrix(vfpu_matrix, 36u, 3u); @@ -1408,10 +1409,8 @@ SB_L_088B4EE4: ctx.write_vfpu_vector_with_destination_prefix(vfpu_result, 0u, vfpu_side); } { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[18] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + 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[4] = (ctx.gpr[17] + static_cast(16)); ctx.fpr[12] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[18] + static_cast(0))); ctx.gpr[5] = (std::bit_cast(ctx.fpr[12])); @@ -1419,9 +1418,8 @@ SB_L_088B4EE4: ctx.gpr[6] = (std::bit_cast(ctx.fpr[13])); ctx.fpr[14] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[18] + static_cast(8))); ctx.gpr[7] = (std::bit_cast(ctx.fpr[14])); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(0), ctx.gpr[5]); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(4), ctx.gpr[6]); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(8), ctx.gpr[7]); + { const std::uint32_t tier2_words[3]{ctx.gpr[5], ctx.gpr[6], ctx.gpr[7]}; + aot_mem.aot_store32_block(ctx.gpr[4] + static_cast(0), tier2_words); } goto SB_L_088B4F60; SB_L_088B4F60: @@ -1440,17 +1438,32 @@ SB_L_088B4F70: goto SB_L_088B4F74; SB_L_088B4F74: - ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(296))); - ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(300))); - ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(304))); - ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(308))); - ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(312))); - ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(316))); - ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(320))); - ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(324))); - ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(328))); - ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(332))); - ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(336))); + { std::uint32_t tier2_words[11]{}; + if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(296), tier2_words)) { + ctx.fpr[20] = std::bit_cast(tier2_words[0]); + ctx.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[20] = tier2_words[5]; + ctx.gpr[21] = tier2_words[6]; + ctx.gpr[22] = tier2_words[7]; + ctx.gpr[23] = tier2_words[8]; + ctx.gpr[30] = tier2_words[9]; + ctx.gpr[31] = tier2_words[10]; + } else { + ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(296))); + ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(300))); + ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(304))); + ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(308))); + ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(312))); + ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(316))); + ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(320))); + ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(324))); + ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(328))); + ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(332))); + ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(336))); + } } jump_target = ctx.gpr[31]; ctx.gpr[29] = (ctx.gpr[29] + static_cast(352)); local_pc = jump_target; diff --git a/profiles/vcs/host/vcs_tier2_cluster_physics.cpp b/profiles/vcs/host/vcs_tier2_cluster_physics.cpp index 9779100..550e871 100644 --- a/profiles/vcs/host/vcs_tier2_cluster_physics.cpp +++ b/profiles/vcs/host/vcs_tier2_cluster_physics.cpp @@ -1,5 +1,5 @@ // AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Tier-2 SUPERBLOCK V2 cluster: physics +// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: physics #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" @@ -170,18 +170,14 @@ SB_L_08A09524: aot_mem.aot_store32(ctx.gpr[7] + static_cast(29552), ctx.gpr[6]); ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[8]); aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); - ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast(29552))); - ctx.gpr[6] = (ctx.gpr[6] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[7] + static_cast(29552), ctx.gpr[6]); + ctx.gpr[6] = aot_mem.aot_advance32(ctx.gpr[7] + static_cast(29552)); goto SB_L_08A09574; SB_L_08A09574: ctx.gpr[4] = (1028u << 16u); ctx.gpr[4] = (ctx.gpr[5] | ctx.gpr[4]); aot_mem.aot_store32(ctx.gpr[6] + static_cast(0), ctx.gpr[4]); - ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast(29552))); - ctx.gpr[4] = (ctx.gpr[4] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[7] + static_cast(29552), ctx.gpr[4]); + ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[7] + static_cast(29552)); goto SB_L_08A0958C; SB_L_08A0958C: @@ -192,10 +188,8 @@ SB_L_08A0958C: SB_L_08A09B2C: ctx.gpr[29] = (ctx.gpr[29] + static_cast(-16)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[16]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[17]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), ctx.gpr[18]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[19]); + { 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(0), tier2_words); } // PSP CACHE is a no-op in coherent host memory. ctx.set_vfpu_scalar_bits_ct<30u>(ctx.gpr[16]); ctx.set_vfpu_scalar_bits_ct<62u>(ctx.gpr[17]); diff --git a/profiles/vcs/host/vcs_tier2_cluster_world.cpp b/profiles/vcs/host/vcs_tier2_cluster_world.cpp index 2ed374e..51b62da 100644 --- a/profiles/vcs/host/vcs_tier2_cluster_world.cpp +++ b/profiles/vcs/host/vcs_tier2_cluster_world.cpp @@ -1,5 +1,5 @@ // AUTO-GENERATED by profiles/vcs/tools/build_tier2_superblocks.py. -// Tier-2 SUPERBLOCK V2 cluster: world +// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: world #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" @@ -1022,9 +1022,8 @@ SB_L_08A79DF8: ctx.gpr[17] = (ctx.gpr[17] + static_cast(17440)); aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[16]); ctx.gpr[16] = (ctx.gpr[17] + static_cast(16)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), ctx.gpr[18]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[19]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[31]); + { 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))); ctx.gpr[19] = (0u | 0u); ctx.gpr[4] = (static_cast(ctx.gpr[19]) < static_cast(ctx.gpr[4]) ? 1u : 0u); @@ -1188,12 +1187,8 @@ SB_L_08A79F28: SB_L_08A79F5C: ctx.gpr[29] = (ctx.gpr[29] + static_cast(-32)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), std::bit_cast(ctx.fpr[20])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[16]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), ctx.gpr[17]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[18]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[19]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(20), ctx.gpr[31]); + { 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); 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; @@ -1370,12 +1365,22 @@ SB_L_08A7A06C: TIER2_SB_RETURN(); SB_L_08A7A074: - ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(0))); - ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(4))); - ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(8))); - ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(16))); - ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(20))); + { std::uint32_t tier2_words[6]{}; + if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(0), tier2_words)) { + ctx.fpr[20] = std::bit_cast(tier2_words[0]); + ctx.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]; + } 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))); + } } jump_target = ctx.gpr[31]; ctx.gpr[29] = (ctx.gpr[29] + static_cast(32)); local_pc = jump_target; @@ -1384,13 +1389,8 @@ SB_L_08A7A074: SB_L_08A7A664: ctx.gpr[29] = (ctx.gpr[29] + static_cast(-32)); ctx.gpr[5] = (ctx.gpr[5] & 255u); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(0), ctx.gpr[16]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(4), ctx.gpr[17]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(8), ctx.gpr[18]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(12), ctx.gpr[19]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[20]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(20), ctx.gpr[21]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(24), ctx.gpr[31]); + { const 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); if (branch_taken) { @@ -1823,13 +1823,24 @@ SB_L_08A7A90C: TIER2_SB_RETURN(); SB_L_08A7A928: - ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(0))); - ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(4))); - ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(8))); - ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(12))); - ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(16))); - ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(20))); - ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(24))); + { 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]; + 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]; + } 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))); + } } jump_target = ctx.gpr[31]; ctx.gpr[29] = (ctx.gpr[29] + static_cast(32)); local_pc = jump_target; @@ -1861,18 +1872,11 @@ SB_L_08A7A94C: aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), ctx.gpr[5]); ctx.gpr[6] = (ctx.gpr[6] + static_cast(1)); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast(0))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[20] + static_cast(0), ctx.gpr[5]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(40), ctx.gpr[16]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(44), ctx.gpr[17]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(48), ctx.gpr[18]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(52), ctx.gpr[19]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(60), ctx.gpr[21]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(64), ctx.gpr[22]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(68), ctx.gpr[23]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(72), ctx.gpr[30]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(76), ctx.gpr[31]); + ctx.gpr[5] = aot_mem.aot_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)); @@ -2256,19 +2260,21 @@ 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); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } ctx.gpr[4] = (ctx.gpr[16] + static_cast(48)); { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); @@ -2277,16 +2283,15 @@ SB_L_08A7ACB8: ctx.write_vfpu_vector_with_destination_prefix_ct<0u, 3u>(vfpu_d); } { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[29] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + const std::uint32_t 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); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } ctx.execute_vfpu_vdot_ct<28u, 0u, 0u, 3u>(); { float vfpu_s[4]{}, vfpu_d[4]{}; @@ -2380,16 +2385,30 @@ SB_L_08A7AD54: aot_mem.aot_store8(ctx.gpr[28] + static_cast(-24632), static_cast(ctx.gpr[4])); ctx.gpr[4] = (ctx.gpr[5] + static_cast(4)); aot_mem.aot_store32(ctx.gpr[16] + static_cast(29552), ctx.gpr[4]); - ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(40))); - ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(44))); - ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(48))); - ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(52))); - ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(56))); - ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(60))); - ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(64))); - ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(68))); - ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(72))); - ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(76))); + { 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]; + 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[22] = tier2_words[6]; + ctx.gpr[23] = tier2_words[7]; + ctx.gpr[30] = tier2_words[8]; + ctx.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))); + } } jump_target = ctx.gpr[31]; ctx.gpr[29] = (ctx.gpr[29] + static_cast(80)); local_pc = jump_target; @@ -2483,9 +2502,7 @@ SB_L_08A7B5CC: ctx.gpr[6] = (51457u << 16u); ctx.gpr[6] = (ctx.gpr[6] + static_cast(256)); aot_mem.aot_store32(ctx.gpr[5] + static_cast(0), ctx.gpr[6]); - ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast(29552))); - ctx.gpr[5] = (ctx.gpr[5] + static_cast(4)); - aot_mem.aot_store32(ctx.gpr[4] + static_cast(29552), ctx.gpr[5]); + ctx.gpr[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]); @@ -2517,18 +2534,17 @@ 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); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[29] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + const std::uint32_t 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; @@ -2590,10 +2606,8 @@ SB_L_08A7CEC8: ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast(7656))); aot_mem.aot_store32(ctx.gpr[29] + static_cast(116), std::bit_cast(ctx.fpr[20])); ctx.gpr[5] = (static_cast(ctx.gpr[4]) < static_cast(ctx.gpr[5]) ? 1u : 0u); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(124), ctx.gpr[17]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(128), ctx.gpr[18]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(132), ctx.gpr[19]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(136), ctx.gpr[31]); + { const 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; ctx.gpr[17] = (0u | 0u); if (branch_taken) { @@ -3859,19 +3873,21 @@ 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); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } ctx.gpr[4] = (ctx.gpr[28] + static_cast(10048)); { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); @@ -3881,16 +3897,15 @@ SB_L_08A7D674: ctx.gpr[4] = (ctx.gpr[29] + static_cast(16)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + const std::uint32_t 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); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } ctx.execute_vfpu_vdot_ct<28u, 0u, 0u, 3u>(); { float vfpu_s[4]{}, vfpu_d[4]{}; @@ -4021,19 +4036,21 @@ 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); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } ctx.gpr[4] = (ctx.gpr[28] + static_cast(10048)); { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); } { float vfpu_s[4]{}, vfpu_t[4]{}, vfpu_d[4]{}; ctx.read_vfpu_vector_with_source_prefix_ct<0u, 3u, 0u>(vfpu_s); @@ -4043,16 +4060,15 @@ SB_L_08A7D73C: ctx.gpr[4] = (ctx.gpr[29] + static_cast(32)); { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + const std::uint32_t 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); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } ctx.execute_vfpu_vdot_ct<28u, 0u, 0u, 3u>(); { float vfpu_s[4]{}, vfpu_d[4]{}; @@ -4082,18 +4098,17 @@ 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); + std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words); float vfpu_value[4]{ - std::bit_cast(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } { float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value); const std::uint32_t vfpu_address = ctx.gpr[29] + static_cast(0); - aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast(vfpu_value[0])); - aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast(vfpu_value[1])); - aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast(vfpu_value[2])); - aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast(vfpu_value[3])); } + const std::uint32_t 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); @@ -4102,11 +4117,12 @@ SB_L_08A7D78C: SB_L_08A7D7A4: { const std::uint32_t vfpu_address = ctx.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(aot_mem.aot_load32(vfpu_address + 0u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 4u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 8u)), - std::bit_cast(aot_mem.aot_load32(vfpu_address + 12u))}; + std::bit_cast(tier2_vfpu_words[0]), + std::bit_cast(tier2_vfpu_words[1]), + std::bit_cast(tier2_vfpu_words[2]), + std::bit_cast(tier2_vfpu_words[3])}; ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); } ctx.execute_vfpu_vdot_ct<28u, 0u, 0u, 3u>(); { float vfpu_s[4]{}, vfpu_d[4]{}; @@ -4807,12 +4823,22 @@ SB_L_08A7DB98: goto SB_L_08A7DB9C; SB_L_08A7DB9C: - ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(116))); - ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(120))); - ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(124))); - ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(128))); - ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(132))); - ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(136))); + { std::uint32_t tier2_words[6]{}; + if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast(116), tier2_words)) { + ctx.fpr[20] = std::bit_cast(tier2_words[0]); + ctx.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]; + } 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))); + } } jump_target = ctx.gpr[31]; ctx.gpr[29] = (ctx.gpr[29] + static_cast(144)); local_pc = jump_target; @@ -4823,19 +4849,8 @@ SB_L_08A7EC68: ctx.gpr[5] = (0u | 12u); ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-7080))); ctx.gpr[4] = (ctx.gpr[4] + static_cast(8)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[5]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(20), std::bit_cast(ctx.fpr[20])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(24), std::bit_cast(ctx.fpr[22])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(28), ctx.gpr[16]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(32), ctx.gpr[17]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(36), ctx.gpr[18]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(40), ctx.gpr[19]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(44), ctx.gpr[20]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(48), ctx.gpr[21]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(52), ctx.gpr[22]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(56), ctx.gpr[23]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(60), ctx.gpr[30]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(64), ctx.gpr[31]); + { const 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]); if (branch_taken) { @@ -4938,18 +4953,34 @@ SB_L_08A7F030: } SB_L_08A7F048: - ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(20))); - ctx.fpr[22] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(24))); - ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(28))); - ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(32))); - ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(36))); - ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(40))); - ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(44))); - ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(48))); - ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(52))); - ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(56))); - ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(60))); - ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(64))); + { std::uint32_t tier2_words[12]{}; + if (aot_mem.aot_try_load32_block(ctx.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]; + ctx.gpr[17] = tier2_words[3]; + ctx.gpr[18] = tier2_words[4]; + ctx.gpr[19] = tier2_words[5]; + ctx.gpr[20] = tier2_words[6]; + ctx.gpr[21] = tier2_words[7]; + ctx.gpr[22] = tier2_words[8]; + ctx.gpr[23] = tier2_words[9]; + ctx.gpr[30] = tier2_words[10]; + ctx.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))); + } } jump_target = ctx.gpr[31]; ctx.gpr[29] = (ctx.gpr[29] + static_cast(80)); local_pc = jump_target; @@ -4960,19 +4991,8 @@ SB_L_08A7F080: ctx.gpr[5] = (0u | 12u); ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast(-7080))); ctx.gpr[4] = (ctx.gpr[4] + static_cast(8)); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(16), ctx.gpr[5]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(20), std::bit_cast(ctx.fpr[20])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(24), std::bit_cast(ctx.fpr[22])); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(28), ctx.gpr[16]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(32), ctx.gpr[17]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(36), ctx.gpr[18]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(40), ctx.gpr[19]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(44), ctx.gpr[20]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(48), ctx.gpr[21]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(52), ctx.gpr[22]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(56), ctx.gpr[23]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(60), ctx.gpr[30]); - aot_mem.aot_store32(ctx.gpr[29] + static_cast(64), ctx.gpr[31]); + { const 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]); if (branch_taken) { @@ -5075,18 +5095,34 @@ SB_L_08A7F488: } SB_L_08A7F4A0: - ctx.fpr[20] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(20))); - ctx.fpr[22] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[29] + static_cast(24))); - ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(28))); - ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(32))); - ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(36))); - ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(40))); - ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(44))); - ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(48))); - ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(52))); - ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(56))); - ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(60))); - ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast(64))); + { std::uint32_t tier2_words[12]{}; + if (aot_mem.aot_try_load32_block(ctx.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]; + ctx.gpr[17] = tier2_words[3]; + ctx.gpr[18] = tier2_words[4]; + ctx.gpr[19] = tier2_words[5]; + ctx.gpr[20] = tier2_words[6]; + ctx.gpr[21] = tier2_words[7]; + ctx.gpr[22] = tier2_words[8]; + ctx.gpr[23] = tier2_words[9]; + ctx.gpr[30] = tier2_words[10]; + ctx.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))); + } } jump_target = ctx.gpr[31]; ctx.gpr[29] = (ctx.gpr[29] + static_cast(80)); local_pc = jump_target; diff --git a/profiles/vcs/scripts/build_release_ninja.bat b/profiles/vcs/scripts/build_release_ninja.bat index b39cbcf..b4066e1 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_v2_unwind_hotfix_20260816" +set "SUPERBLOCK_STAMP=%BUILD%\.vcs_tier2_superblock_v3_dataflow_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 V2 clusters O2 /Ob3 /GL- +echo Generated AOT: O3, cold /Ob0, measured hot /Ob3; Tier2 V3 dataflow clusters O2 /Ob3 /GL- echo Host/core LTCG: ON echo AVX2/fast paths: ON echo ================================================================ @@ -113,7 +113,7 @@ echo [0b/7] Reapplying BOOTFIX-safe Tier-2 transforms (OPT1 semantic transforms call "%PROFILE%\APPLY_TIER2_EXTREME.bat" if errorlevel 1 goto :FAIL -echo [0b2/7] Building profile-guided Tier-2 V2 multi-cluster second layer... +echo [0b2/7] Building profile-guided Tier-2 V3 dataflow 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,7 +128,7 @@ if errorlevel 1 goto :FAIL if exist "%BUILD%" if not exist "%SUPERBLOCK_STAMP%" ( echo. - echo [0c-super/7] Tier2 SUPERBLOCK V2 UNWIND HOTFIX - invalidating measured hook/cluster objects once... + 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 @@ -170,7 +170,7 @@ echo [2/7] Building VCSNative with Ninja... "%CMAKE_EXE%" --build "%BUILD%" --parallel %JOBS% --target VCSNative if errorlevel 1 goto :FAIL >"%BOOTFIX_STAMP%" echo VCS Tier2 BOOTFIX 2026-08-16 v1 ->"%SUPERBLOCK_STAMP%" echo VCS Tier2 SUPERBLOCK V2 UNWIND HOTFIX 2026-08-16 +>"%SUPERBLOCK_STAMP%" echo VCS Tier2 SUPERBLOCK V3 DATAFLOW 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 05bd0f6..c74e9c4 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 V2 multi-cluster second-layer AOT. +"""Generate VCS Tier-2 SUPERBLOCK V3 dataflow multi-cluster second-layer AOT. -V2 is profile-guided and intentionally keeps the original generated corpus as +V3 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. @@ -136,6 +136,205 @@ CLUSTERS: List[Cluster] = [ ] + +# Tier-2 V3 dataflow/memory lowering. 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 +# across control-flow boundaries. +QUAD_VFPU_LOAD_RE = re.compile( + r'float vfpu_value\[4\]\{\s*' + r'std::bit_cast\(aot_mem\.aot_load32\(vfpu_address \+ 0u\)\),\s*' + r'std::bit_cast\(aot_mem\.aot_load32\(vfpu_address \+ 4u\)\),\s*' + r'std::bit_cast\(aot_mem\.aot_load32\(vfpu_address \+ 8u\)\),\s*' + r'std::bit_cast\(aot_mem\.aot_load32\(vfpu_address \+ 12u\)\)\};', + re.S) + +QUAD_VFPU_STORE_RE = re.compile( + r'aot_mem\.aot_store32\(vfpu_address \+ 0u, (?P[^;]+)\);\s*' + r'aot_mem\.aot_store32\(vfpu_address \+ 4u, (?P[^;]+)\);\s*' + r'aot_mem\.aot_store32\(vfpu_address \+ 8u, (?P[^;]+)\);\s*' + r'aot_mem\.aot_store32\(vfpu_address \+ 12u, (?P[^;]+)\);') + +_SIMPLE_GPR_LOAD_RE = re.compile( + r'^(?P\s*)ctx\.gpr\[(?P\d+)\] = \(aot_mem\.aot_load32\(' + r'ctx\.gpr\[(?P\d+)\] \+ static_cast\((?P-?\d+)\)\)\);$') +_SIMPLE_FPR_LOAD_RE = re.compile( + r'^(?P\s*)ctx\.fpr\[(?P\d+)\] = std::bit_cast\(aot_mem\.aot_load32\(' + r'ctx\.gpr\[(?P\d+)\] \+ static_cast\((?P-?\d+)\)\)\);$') + + +def _match_simple_load(line: str): + m = _SIMPLE_GPR_LOAD_RE.match(line) + if m is not None: + return m, 'gpr' + m = _SIMPLE_FPR_LOAD_RE.match(line) + if m is not None: + return m, 'fpr' + return None, None + + +APPEND32_RE = re.compile( + r'(?P\s*)ctx\.gpr\[(?P\d+)\] = \(aot_mem\.aot_load32\(' + r'ctx\.gpr\[(?P\d+)\] \+ static_cast\((?P-?\d+)\)\)\);\n' + r'(?P=indent)aot_mem\.aot_store32\(ctx\.gpr\[(?P=old)\] \+ static_cast\(0\), ' + r'(?Pctx\.gpr\[(?P\d+)\])\);\n' + r'(?P=indent)ctx\.gpr\[(?P\d+)\] = \(aot_mem\.aot_load32\(' + r'ctx\.gpr\[(?P=base)\] \+ static_cast\((?P=off)\)\)\);\n' + r'(?P=indent)ctx\.gpr\[(?P=new)\] = \(ctx\.gpr\[(?P=new)\] \+ static_cast\(4\)\);\n' + r'(?P=indent)aot_mem\.aot_store32\(ctx\.gpr\[(?P=base)\] \+ static_cast\((?P=off)\), ' + r'ctx\.gpr\[(?P=new)\]\);') + +ADVANCE32_RE = re.compile( + r'(?P\s*)ctx\.gpr\[(?P\d+)\] = \(aot_mem\.aot_load32\(' + r'ctx\.gpr\[(?P\d+)\] \+ static_cast\((?P-?\d+)\)\)\);\n' + r'(?P=indent)ctx\.gpr\[(?P=reg)\] = \(ctx\.gpr\[(?P=reg)\] \+ static_cast\(4\)\);\n' + r'(?P=indent)aot_mem\.aot_store32\(ctx\.gpr\[(?P=base)\] \+ static_cast\((?P=off)\), ' + r'ctx\.gpr\[(?P=reg)\]\);') + +_SIMPLE_STORE_RE = re.compile( + r'^(?P\s*)aot_mem\.aot_store32\(' + r'ctx\.gpr\[(?P\d+)\] \+ static_cast\((?P-?\d+)\), ' + r'(?P.+)\);$') + +_SAFE_STORE_VALUE_RE = re.compile( + r'^(?:ctx\.gpr\[\d+\]|std::bit_cast\(ctx\.fpr\[\d+\]\)|' + r'static_cast\([^;]+\)|0x[0-9A-Fa-f]+u|\d+u?)$') + + +def _batch_simple_load_runs(text: str) -> tuple[str, int, int]: + lines = text.splitlines() + out: List[str] = [] + runs = 0 + words = 0 + i = 0 + while i < len(lines): + first, first_kind = _match_simple_load(lines[i]) + if first is None: + out.append(lines[i]); i += 1; continue + base = int(first.group('base')) + indent = first.group('indent') + group = [(first, first_kind)] + j = i + 1 + expected = int(first.group('offset')) + 4 + while j < len(lines): + m, kind = _match_simple_load(lines[j]) + if m is None or int(m.group('base')) != base or m.group('indent') != indent or int(m.group('offset')) != expected: + break + # Do not batch a run that overwrites the address base before all + # loads have executed. That would change later effective addresses. + if kind == 'gpr' and int(m.group('dst')) == base: + break + group.append((m, kind)) + expected += 4 + j += 1 + if len(group) < 3 or (first_kind == 'gpr' and int(first.group('dst')) == base): + out.append(lines[i]); i += 1; continue + + n = len(group) + start = int(group[0][0].group('offset')) + out.append(f'{indent}{{ std::uint32_t tier2_words[{n}]{{}};') + out.append(f'{indent} if (aot_mem.aot_try_load32_block(ctx.gpr[{base}] + static_cast({start}), tier2_words)) {{') + for k, (m, kind) in enumerate(group): + if kind == 'gpr': + out.append(f'{indent} ctx.gpr[{m.group("dst")}] = tier2_words[{k}];') + else: + out.append(f'{indent} ctx.fpr[{m.group("dst")}] = std::bit_cast(tier2_words[{k}]);') + out.append(f'{indent} }} else {{') + # Preserve exact slow/fault path ordering and partial architectural state. + out.extend(f'{indent} {lines[i+k].lstrip()}' for k in range(n)) + out.append(f'{indent} }} }}') + runs += 1; words += n + i = j + return '\n'.join(out) + ('\n' if text.endswith('\n') else ''), runs, words + + +def _batch_simple_store_runs(text: str) -> tuple[str, int, int]: + lines = text.splitlines() + out: List[str] = [] + runs = 0 + words = 0 + i = 0 + while i < len(lines): + first = _SIMPLE_STORE_RE.match(lines[i]) + if first is None or _SAFE_STORE_VALUE_RE.match(first.group('value').strip()) is None: + out.append(lines[i]); i += 1; continue + base = int(first.group('base')) + indent = first.group('indent') + group = [first] + j = i + 1 + expected = int(first.group('offset')) + 4 + while j < len(lines): + m = _SIMPLE_STORE_RE.match(lines[j]) + if (m is None or int(m.group('base')) != base or m.group('indent') != indent or + int(m.group('offset')) != expected or + _SAFE_STORE_VALUE_RE.match(m.group('value').strip()) is None): + break + group.append(m); expected += 4; j += 1 + if len(group) < 3: + out.append(lines[i]); i += 1; continue + n = len(group) + start = int(group[0].group('offset')) + values = ', '.join(m.group('value').strip() for m in group) + out.append(f'{indent}{{ const std::uint32_t tier2_words[{n}]{{{values}}};') + out.append(f'{indent} aot_mem.aot_store32_block(ctx.gpr[{base}] + static_cast({start}), tier2_words); }}') + runs += 1; words += n + i = j + return '\n'.join(out) + ('\n' if text.endswith('\n') else ''), runs, words + + +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, + 'load_runs': 0, 'load_words': 0, 'store_runs': 0, 'store_words': 0, + } + + def quad_load_repl(_: re.Match[str]) -> str: + stats['vfpu_quad_loads'] += 1 + return ('std::uint32_t tier2_vfpu_words[4]{}; ' + 'aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);\n' + ' float vfpu_value[4]{\n' + ' std::bit_cast(tier2_vfpu_words[0]),\n' + ' std::bit_cast(tier2_vfpu_words[1]),\n' + ' std::bit_cast(tier2_vfpu_words[2]),\n' + ' std::bit_cast(tier2_vfpu_words[3])};') + text = QUAD_VFPU_LOAD_RE.sub(quad_load_repl, text) + + def quad_store_repl(m: re.Match[str]) -> str: + stats['vfpu_quad_stores'] += 1 + vals = ', '.join(m.group(f'v{i}').strip() for i in range(4)) + return (f'const std::uint32_t tier2_vfpu_words[4]{{{vals}}};\n' + ' aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words);') + text = QUAD_VFPU_STORE_RE.sub(quad_store_repl, text) + + def append32_repl(m: re.Match[str]) -> str: + # The value is constrained to a plain GPR read. The cursor load itself + # has no side effects, so moving that read into aot_append32 cannot + # reorder any architectural mutation. Preserve both destination GPRs. + if m.group('old') == m.group('new') or m.group('old') == m.group('value_reg'): + return m.group(0) + stats['append32'] += 1 + indent = m.group('indent') + cursor = (f'ctx.gpr[{m.group("base")}] + ' + f'static_cast({m.group("off")})') + return (f'{indent}{{ std::uint32_t tier2_old_pointer = 0u;\n' + f'{indent} ctx.gpr[{m.group("new")}] = aot_mem.aot_append32(' + f'{cursor}, {m.group("value")}, &tier2_old_pointer);\n' + f'{indent} ctx.gpr[{m.group("old")}] = tier2_old_pointer; }}') + text = APPEND32_RE.sub(append32_repl, text) + + def advance32_repl(m: re.Match[str]) -> str: + stats['advance32'] += 1 + indent = m.group('indent') + cursor = (f'ctx.gpr[{m.group("base")}] + ' + f'static_cast({m.group("off")})') + return f'{indent}ctx.gpr[{m.group("reg")}] = aot_mem.aot_advance32({cursor});' + text = ADVANCE32_RE.sub(advance32_repl, text) + + text, stats['load_runs'], stats['load_words'] = _batch_simple_load_runs(text) + text, stats['store_runs'], stats['store_words'] = _batch_simple_store_runs(text) + return text, stats + def strip_hooks(text: str) -> str: for begin, end in ((HOOK_BEGIN, HOOK_END), (OLD_HOOK_BEGIN, OLD_HOOK_END)): text = re.sub(re.escape(begin) + r'.*?' + re.escape(end), '', text, flags=re.S) @@ -430,7 +629,7 @@ 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 V2 cluster: {cluster.key} +// Tier-2 SUPERBLOCK V3 DATAFLOW cluster: {cluster.key} #include "vcs_tier2_superblocks.hpp" #include "psprecomp/runtime.hpp" #include "generated_units.hpp" @@ -516,6 +715,9 @@ TIER2_ENTRY_DISPATCH: }} // namespace vcs ''' + cpp, dataflow_stats = optimize_tier2_dataflow(cpp) + stats.update({f'dataflow_{k}': v for k, v in dataflow_stats.items()}) + path = host / f'vcs_tier2_cluster_{cluster.key}.cpp' old = path.read_text(encoding='utf-8') if path.exists() else None if old != cpp: @@ -577,7 +779,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 V2 cluster {cluster.key}: ' + ' '.join(f'{k}={v}' for k, v in sorted(stats.items()))) + print(f'Tier2 V3 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) @@ -600,7 +802,7 @@ def main() -> int: # common file is handwritten by V2 and must remain; generated cluster files # carry all hot code. - print('Tier2 SUPERBLOCK V2 COMPLETE:', + print('Tier2 SUPERBLOCK V3 DATAFLOW:', 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"]}', diff --git a/tests/test_main.cpp b/tests/test_main.cpp index 2eb0ebb..6f1a84e 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -1832,6 +1832,56 @@ int main() { unaligned_aot.aot_store_word_right(unaligned_base + 3u, 0xAABBCCDDu); require(unaligned_memory.load32(unaligned_base) == 0xDD332211u, "AOT SWR lane 3 failed"); + // Tier-2 V3 batches adjacent 32-bit memory traffic behind one RAM + // canonicalization/bounds check. Verify both the direct RAM path and + // the slow EDRAM fallback stay bit-identical to scalar AOT accesses. + constexpr std::uint32_t batch_base = 0x08810100u; + const std::uint32_t batch_write[4]{0x11223344u, 0x55667788u, 0x99AABBCCu, 0xDDEEFF00u}; + unaligned_aot.aot_store32_block(batch_base, batch_write); + std::uint32_t batch_read[4]{}; + unaligned_aot.aot_load32_block(batch_base, batch_read); + for (std::size_t i = 0; i < 4u; ++i) + require(batch_read[i] == batch_write[i], "AOT 32-bit RAM block transfer failed"); + std::uint32_t batch_try[4]{}; + require(unaligned_aot.aot_try_load32_block(batch_base, batch_try), + "AOT RAM block direct-path probe failed"); + constexpr std::uint32_t batch_vram = 0x04000100u; + unaligned_aot.aot_store32_block(batch_vram, batch_write); + std::uint32_t batch_vram_read[4]{}; + unaligned_aot.aot_load32_block(batch_vram, batch_vram_read); + require(!unaligned_aot.aot_try_load32_block(batch_vram, batch_try), + "AOT EDRAM block unexpectedly used RAM direct path"); + for (std::size_t i = 0; i < 4u; ++i) + require(batch_vram_read[i] == batch_write[i], "AOT 32-bit EDRAM block fallback failed"); + + constexpr std::uint32_t append_cursor = batch_base + 0x40u; + constexpr std::uint32_t append_target = batch_base + 0x80u; + unaligned_memory.store32(append_cursor, append_target); + std::uint32_t append_old = 0u; + const std::uint32_t append_next = + unaligned_aot.aot_append32(append_cursor, 0xDEADBEEFu, &append_old); + require(append_old == append_target && append_next == append_target + 4u, + "AOT append32 direct-path pointer result failed"); + require(unaligned_memory.load32(append_target) == 0xDEADBEEFu && + unaligned_memory.load32(append_cursor) == append_target + 4u, + "AOT append32 direct-path memory result failed"); + // Self-alias forces the exact scalar fallback: the data store mutates + // the cursor before its architectural reload. + constexpr std::uint32_t alias_cursor = batch_base + 0xC0u; + unaligned_memory.store32(alias_cursor, alias_cursor); + append_old = 0u; + const std::uint32_t alias_next = + unaligned_aot.aot_append32(alias_cursor, 0x0881F000u, &append_old); + require(append_old == alias_cursor && alias_next == 0x0881F004u && + unaligned_memory.load32(alias_cursor) == 0x0881F004u, + "AOT append32 alias fallback semantics failed"); + + constexpr std::uint32_t advance_cursor = batch_base + 0xE0u; + unaligned_memory.store32(advance_cursor, 0x0881A000u); + require(unaligned_aot.aot_advance32(advance_cursor) == 0x0881A004u && + unaligned_memory.load32(advance_cursor) == 0x0881A004u, + "AOT advance32 direct-path semantics failed"); + psprecomp::NidRegistry nids; require(nids.resolve("IoFileMgrForUser", 0x109F50BCu) == "sceIoOpen", "NID registry failed"); require(nids.resolve("SysMemUserForUser", 0x7591C7DBu) == "sceKernelSetCompiledSdkVersion",