mirror of
https://github.com/jessicanataliagta/PSPRecomp
synced 2026-09-30 01:34:34 -04:00
otimizações round 6
otimizações round 6
This commit is contained in:
@@ -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 <std::size_t N>
|
||||
[[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<std::uint32_t>((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 <std::size_t N>
|
||||
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<std::uint32_t>(i * 4u));
|
||||
}
|
||||
|
||||
template <std::size_t N>
|
||||
[[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<std::uint32_t>((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 <std::size_t N>
|
||||
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<std::uint32_t>(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;
|
||||
|
||||
@@ -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<N>` / `aot_load32_block<N>`
|
||||
- `aot_try_store32_block<N>` / `aot_store32_block<N>`
|
||||
- `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.
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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<std::uint32_t>(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<std::uint32_t>(29552)));
|
||||
aot_mem.aot_store32(ctx.gpr[5] + static_cast<std::uint32_t>(0), ctx.gpr[4]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
{ std::uint32_t tier2_old_pointer = 0u;
|
||||
ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(40)));
|
||||
ctx.gpr[6] = (ctx.gpr[2] | ctx.gpr[23]);
|
||||
ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
aot_mem.aot_store32(ctx.gpr[7] + static_cast<std::uint32_t>(0), ctx.gpr[6]);
|
||||
ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[6] = (ctx.gpr[6] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[6]);
|
||||
{ std::uint32_t tier2_old_pointer = 0u;
|
||||
ctx.gpr[6] = aot_mem.aot_append32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(29552)));
|
||||
ctx.gpr[5] = (ctx.gpr[5] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[5]);
|
||||
ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(1));
|
||||
ctx.gpr[5] = (ctx.gpr[4] < static_cast<std::uint32_t>(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<std::uint32_t>(29552), ctx.gpr[5]);
|
||||
ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]);
|
||||
aot_mem.aot_store32(ctx.gpr[5] + static_cast<std::uint32_t>(0), ctx.gpr[6]);
|
||||
ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[5] = (ctx.gpr[5] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[5]);
|
||||
ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(29552)));
|
||||
aot_mem.aot_store32(ctx.gpr[5] + static_cast<std::uint32_t>(0), ctx.gpr[4]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
{ std::uint32_t tier2_old_pointer = 0u;
|
||||
ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4], &tier2_old_pointer);
|
||||
ctx.gpr[5] = tier2_old_pointer; }
|
||||
ctx.fpr[13] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[18] + static_cast<std::uint32_t>(12)));
|
||||
ctx.fpr[12] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[18] + static_cast<std::uint32_t>(16)));
|
||||
ctx.gpr[5] = (std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
||||
@@ -514,9 +504,7 @@ SB_L_0895C118:
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[5] = (ctx.gpr[5] | ctx.gpr[6]);
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[4] = (ctx.gpr[19] | 0u);
|
||||
ctx.gpr[31] = (0x0895C1B4u);
|
||||
ctx.fpr[12] = std::bit_cast<float>(std::bit_cast<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[7] = (aot_mem.aot_load32(ctx.gpr[8] + static_cast<std::uint32_t>(8)));
|
||||
goto SB_L_0895C2A8;
|
||||
|
||||
@@ -657,19 +641,15 @@ SB_L_0895C2C8:
|
||||
ctx.gpr[5] = (std::bit_cast<std::uint32_t>(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<std::uint32_t>(29552)));
|
||||
aot_mem.aot_store32(ctx.gpr[5] + static_cast<std::uint32_t>(0), ctx.gpr[4]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
{ std::uint32_t tier2_old_pointer = 0u;
|
||||
ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4], &tier2_old_pointer);
|
||||
ctx.gpr[5] = tier2_old_pointer; }
|
||||
ctx.gpr[5] = (18688u << 16u);
|
||||
ctx.gpr[6] = (std::bit_cast<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[29] + static_cast<std::uint32_t>(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<std::uint32_t>(29552)));
|
||||
aot_mem.aot_store32(ctx.gpr[5] + static_cast<std::uint32_t>(0), ctx.gpr[4]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
{ std::uint32_t tier2_old_pointer = 0u;
|
||||
ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(-1));
|
||||
ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
aot_mem.aot_store32(ctx.gpr[5] + static_cast<std::uint32_t>(0), ctx.gpr[4]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
{ std::uint32_t tier2_old_pointer = 0u;
|
||||
ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(255));
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[5] = (22272u << 16u);
|
||||
ctx.gpr[5] = (ctx.gpr[5] + static_cast<std::uint32_t>(-1));
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[5] = (22528u << 16u);
|
||||
ctx.gpr[5] = (ctx.gpr[5] + static_cast<std::uint32_t>(-1));
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[5] = (24320u << 16u);
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.fpr[12] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(-17664)));
|
||||
ctx.gpr[5] = (std::bit_cast<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.fpr[13] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(-17660)));
|
||||
ctx.gpr[5] = (std::bit_cast<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.fpr[12] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(-17656)));
|
||||
ctx.gpr[5] = (std::bit_cast<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[5] = (37120u << 16u);
|
||||
ctx.gpr[5] = (ctx.gpr[5] + static_cast<std::uint32_t>(-1));
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[5] = (6144u << 16u);
|
||||
ctx.gpr[5] = (ctx.gpr[5] + static_cast<std::uint32_t>(1));
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[5] = (24576u << 16u);
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.fpr[12] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(-17648)));
|
||||
ctx.gpr[5] = (std::bit_cast<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.fpr[13] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(-17644)));
|
||||
ctx.gpr[5] = (std::bit_cast<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.fpr[12] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(-17640)));
|
||||
ctx.gpr[5] = (std::bit_cast<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[5] = (37888u << 16u);
|
||||
ctx.gpr[5] = (ctx.gpr[5] + static_cast<std::uint32_t>(-1));
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[5] = (6400u << 16u);
|
||||
ctx.gpr[5] = (ctx.gpr[5] + static_cast<std::uint32_t>(1));
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[5] = (49152u << 16u);
|
||||
ctx.gpr[5] = (ctx.gpr[5] + static_cast<std::uint32_t>(2));
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[5] = (49408u << 16u);
|
||||
ctx.gpr[5] = (ctx.gpr[5] + static_cast<std::uint32_t>(256));
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast<std::uint32_t>(-17676)));
|
||||
{ const bool branch_taken = ctx.gpr[4] == 0u;
|
||||
aot_mem.aot_store8(ctx.gpr[29] + static_cast<std::uint32_t>(129), static_cast<std::uint8_t>(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<std::uint32_t>(29552)));
|
||||
aot_mem.aot_store32(ctx.gpr[5] + static_cast<std::uint32_t>(0), ctx.gpr[4]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
{ std::uint32_t tier2_old_pointer = 0u;
|
||||
ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(1));
|
||||
ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
aot_mem.aot_store32(ctx.gpr[5] + static_cast<std::uint32_t>(0), ctx.gpr[4]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
{ std::uint32_t tier2_old_pointer = 0u;
|
||||
ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[5] = (49920u << 16u);
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[5] = (51968u << 16u);
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(-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<std::uint32_t>(0), ctx.gpr[6]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(64));
|
||||
ctx.gpr[6] = (ctx.gpr[6] | ctx.gpr[7]);
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[6]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[6] = (47104u << 16u);
|
||||
ctx.gpr[6] = (ctx.gpr[6] + static_cast<std::uint32_t>(1542));
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[6]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(170));
|
||||
aot_mem.aot_store32(ctx.gpr[16] + static_cast<std::uint32_t>(0), ctx.gpr[6]);
|
||||
ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[6] = (ctx.gpr[6] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[6]);
|
||||
ctx.gpr[6] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[5] = (ctx.gpr[5] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[5]);
|
||||
ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[6]);
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[16] = (ctx.gpr[16] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[16]);
|
||||
ctx.gpr[16] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[4]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(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<std::uint32_t>(29552)));
|
||||
aot_mem.aot_store32(ctx.gpr[5] + static_cast<std::uint32_t>(0), ctx.gpr[4]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
{ std::uint32_t tier2_old_pointer = 0u;
|
||||
ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[29] + static_cast<std::uint32_t>(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<std::uint32_t>(1));
|
||||
ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
aot_mem.aot_store32(ctx.gpr[5] + static_cast<std::uint32_t>(0), ctx.gpr[4]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
{ std::uint32_t tier2_old_pointer = 0u;
|
||||
ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[5] = (49408u << 16u);
|
||||
ctx.gpr[5] = (ctx.gpr[5] + static_cast<std::uint32_t>(256));
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[17] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[4] = (aot_mem.aot_load8(ctx.gpr[28] + static_cast<std::uint32_t>(-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<std::uint32_t>(1));
|
||||
ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
aot_mem.aot_store32(ctx.gpr[5] + static_cast<std::uint32_t>(0), ctx.gpr[4]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
{ std::uint32_t tier2_old_pointer = 0u;
|
||||
ctx.gpr[4] = aot_mem.aot_append32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(96)));
|
||||
ctx.fpr[20] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(136)));
|
||||
ctx.fpr[22] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(140)));
|
||||
ctx.fpr[24] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(144)));
|
||||
ctx.fpr[26] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(148)));
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(152)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(156)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(160)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(164)));
|
||||
ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(168)));
|
||||
ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(172)));
|
||||
ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(176)));
|
||||
ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(180)));
|
||||
ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(184)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(188)));
|
||||
{ std::uint32_t tier2_words[14]{};
|
||||
if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast<std::uint32_t>(136), tier2_words)) {
|
||||
ctx.fpr[20] = std::bit_cast<float>(tier2_words[0]);
|
||||
ctx.fpr[22] = std::bit_cast<float>(tier2_words[1]);
|
||||
ctx.fpr[24] = std::bit_cast<float>(tier2_words[2]);
|
||||
ctx.fpr[26] = std::bit_cast<float>(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<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(136)));
|
||||
ctx.fpr[22] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(140)));
|
||||
ctx.fpr[24] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(144)));
|
||||
ctx.fpr[26] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(148)));
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(152)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(156)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(160)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(164)));
|
||||
ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(168)));
|
||||
ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(172)));
|
||||
ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(176)));
|
||||
ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(180)));
|
||||
ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(184)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(188)));
|
||||
} }
|
||||
jump_target = ctx.gpr[31];
|
||||
ctx.gpr[29] = (ctx.gpr[29] + static_cast<std::uint32_t>(192));
|
||||
local_pc = jump_target;
|
||||
|
||||
@@ -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<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[5] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[5] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); }
|
||||
ctx.execute_vfpu_vminmax_ct<2u, 0u, 1u, 3u, false>();
|
||||
ctx.execute_vfpu_vminmax_ct<3u, 0u, 1u, 3u, true>();
|
||||
@@ -302,15 +306,8 @@ SB_L_088B180C:
|
||||
|
||||
SB_L_088B18EC:
|
||||
ctx.gpr[29] = (ctx.gpr[29] + static_cast<std::uint32_t>(-128));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(84), ctx.gpr[16]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(88), ctx.gpr[17]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(92), ctx.gpr[18]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(96), ctx.gpr[19]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(100), ctx.gpr[20]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(104), ctx.gpr[21]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(108), ctx.gpr[22]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(112), ctx.gpr[23]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[5] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[6] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[7] + static_cast<std::uint32_t>(0);
|
||||
std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
||||
float vfpu_value[4]{
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); }
|
||||
{ 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<std::uint32_t>(0);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
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<std::uint32_t>(0);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
||||
aot_mem.aot_store32(ctx.gpr[10] + static_cast<std::uint32_t>(0), ctx.vfpu_scalar_bits_ct<24u>());
|
||||
jump_target = ctx.gpr[31];
|
||||
ctx.gpr[2] = (0u + static_cast<std::uint32_t>(1));
|
||||
@@ -526,11 +524,12 @@ SB_L_088B3FCC:
|
||||
ctx.gpr[18] = (ctx.gpr[18] + ctx.gpr[30]);
|
||||
ctx.gpr[5] = (ctx.gpr[29] + static_cast<std::uint32_t>(16));
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[18] + static_cast<std::uint32_t>(0);
|
||||
std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
||||
float vfpu_value[4]{
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); }
|
||||
ctx.execute_vfpu_vx2i_ct<0u, 2u, 2u, 3u>();
|
||||
ctx.execute_vfpu_vx2i_ct<1u, 66u, 2u, 3u>();
|
||||
@@ -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<std::uint32_t>(0);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
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<std::uint32_t>(16);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
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<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(60)));
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(64)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(68)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(72)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(76)));
|
||||
ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(80)));
|
||||
ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(84)));
|
||||
ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(88)));
|
||||
ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(92)));
|
||||
ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(96)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(100)));
|
||||
{ std::uint32_t tier2_words[11]{};
|
||||
if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast<std::uint32_t>(60), tier2_words)) {
|
||||
ctx.fpr[20] = std::bit_cast<float>(tier2_words[0]);
|
||||
ctx.gpr[16] = tier2_words[1];
|
||||
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<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(60)));
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(64)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(68)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(72)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(76)));
|
||||
ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(80)));
|
||||
ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(84)));
|
||||
ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(88)));
|
||||
ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(92)));
|
||||
ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(96)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(100)));
|
||||
} }
|
||||
jump_target = ctx.gpr[31];
|
||||
ctx.gpr[29] = (ctx.gpr[29] + static_cast<std::uint32_t>(112));
|
||||
local_pc = jump_target;
|
||||
|
||||
@@ -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<std::uint32_t>(0)));
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast<std::uint32_t>(20)));
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[17] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<3u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); }
|
||||
{ float vfpu_value[4]{};
|
||||
ctx.write_vfpu_vector_with_destination_prefix_ct<35u, 3u>(vfpu_value); }
|
||||
@@ -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<std::uint32_t>(32));
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<8u, 4u>(vfpu_value); }
|
||||
{ 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<std::uint32_t>(20)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(16));
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[8] + static_cast<std::uint32_t>(0);
|
||||
std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
||||
float vfpu_value[4]{
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
||||
{ 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<std::uint32_t>(144));
|
||||
{ float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value);
|
||||
const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast<std::uint32_t>(0);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast<std::uint32_t>(0);
|
||||
std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
||||
float vfpu_value[4]{
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); }
|
||||
{ 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<std::uint32_t>(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<std::uint32_t>(0);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
||||
{ float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value);
|
||||
const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast<std::uint32_t>(0);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
||||
ctx.fpr[12] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(152)));
|
||||
ctx.gpr[4] = (ctx.gpr[17] + static_cast<std::uint32_t>(48));
|
||||
ctx.fpr[13] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[4] + static_cast<std::uint32_t>(8)));
|
||||
@@ -1262,39 +1270,44 @@ SB_L_08A6ED20:
|
||||
|
||||
SB_L_08A6ED2C:
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[21] + static_cast<std::uint32_t>(0);
|
||||
std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
||||
float vfpu_value[4]{
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast<std::uint32_t>(0);
|
||||
std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
||||
float vfpu_value[4]{
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast<std::uint32_t>(16);
|
||||
std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
||||
float vfpu_value[4]{
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast<std::uint32_t>(32);
|
||||
std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
||||
float vfpu_value[4]{
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[30] + static_cast<std::uint32_t>(48);
|
||||
std::uint32_t tier2_vfpu_words[4]{}; aot_mem.aot_load32_block(vfpu_address, tier2_vfpu_words);
|
||||
float vfpu_value[4]{
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); }
|
||||
{ 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<std::uint32_t>(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<std::uint32_t>(0);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
||||
ctx.fpr[12] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(168)));
|
||||
ctx.fcr31 = (ctx.fcr31 & ~0x00800000u) | (((ctx.fpr[12] < ctx.fpr[26])) ? 0x00800000u : 0u);
|
||||
// nop
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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<std::uint32_t>(-352));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(296), std::bit_cast<std::uint32_t>(ctx.fpr[20]));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(300), ctx.gpr[16]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(304), ctx.gpr[17]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(308), ctx.gpr[18]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(312), ctx.gpr[19]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(316), ctx.gpr[20]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(320), ctx.gpr[21]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(324), ctx.gpr[22]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(328), ctx.gpr[23]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(332), ctx.gpr[30]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(336), ctx.gpr[31]);
|
||||
{ const std::uint32_t tier2_words[11]{std::bit_cast<std::uint32_t>(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<std::uint32_t>(296), tier2_words); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<2u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<3u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[6] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<36u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[6] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<37u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[6] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<38u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[6] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<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<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<8u, 4u>(vfpu_value); }
|
||||
ctx.gpr[4] = (ctx.gpr[7] + static_cast<std::uint32_t>(16));
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<28u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<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<std::uint32_t>(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<std::uint32_t>(0);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
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<std::uint32_t>(ctx.fpr[13]));
|
||||
ctx.fpr[14] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[5] + static_cast<std::uint32_t>(8)));
|
||||
ctx.gpr[5] = (std::bit_cast<std::uint32_t>(ctx.fpr[14]));
|
||||
aot_mem.aot_store32(ctx.gpr[6] + static_cast<std::uint32_t>(0), ctx.gpr[7]);
|
||||
aot_mem.aot_store32(ctx.gpr[6] + static_cast<std::uint32_t>(4), ctx.gpr[8]);
|
||||
aot_mem.aot_store32(ctx.gpr[6] + static_cast<std::uint32_t>(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<std::uint32_t>(0), tier2_words); }
|
||||
ctx.gpr[5] = (ctx.gpr[19] + static_cast<std::uint32_t>(28));
|
||||
ctx.gpr[6] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast<std::uint32_t>(0)));
|
||||
ctx.gpr[7] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast<std::uint32_t>(1)));
|
||||
@@ -795,9 +794,8 @@ SB_L_088B4AC8:
|
||||
ctx.gpr[6] = (std::bit_cast<std::uint32_t>(ctx.fpr[13]));
|
||||
ctx.fpr[14] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[22] + static_cast<std::uint32_t>(8)));
|
||||
ctx.gpr[7] = (std::bit_cast<std::uint32_t>(ctx.fpr[14]));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(80), ctx.gpr[5]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(84), ctx.gpr[6]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(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<std::uint32_t>(80), tier2_words); }
|
||||
ctx.fpr[15] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[22] + static_cast<std::uint32_t>(12)));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(92), std::bit_cast<std::uint32_t>(ctx.fpr[15]));
|
||||
ctx.gpr[5] = (aot_mem.aot_load8(ctx.gpr[4] + static_cast<std::uint32_t>(0)));
|
||||
@@ -1009,9 +1007,8 @@ SB_L_088B4C7C:
|
||||
ctx.gpr[5] = (std::bit_cast<std::uint32_t>(ctx.fpr[13]));
|
||||
ctx.fpr[14] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(8)));
|
||||
ctx.gpr[6] = (std::bit_cast<std::uint32_t>(ctx.fpr[14]));
|
||||
aot_mem.aot_store32(ctx.gpr[16] + static_cast<std::uint32_t>(0), ctx.gpr[4]);
|
||||
aot_mem.aot_store32(ctx.gpr[16] + static_cast<std::uint32_t>(4), ctx.gpr[5]);
|
||||
aot_mem.aot_store32(ctx.gpr[16] + static_cast<std::uint32_t>(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<std::uint32_t>(0), tier2_words); }
|
||||
ctx.fpr[15] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[16] + static_cast<std::uint32_t>(16)));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(144), std::bit_cast<std::uint32_t>(ctx.fpr[15]));
|
||||
ctx.fpr[15] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[16] + static_cast<std::uint32_t>(20)));
|
||||
@@ -1019,32 +1016,36 @@ SB_L_088B4C7C:
|
||||
ctx.fpr[12] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[16] + static_cast<std::uint32_t>(24)));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(152), std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); }
|
||||
{ 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<std::uint32_t>(0);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
||||
ctx.gpr[4] = (ctx.gpr[16] + static_cast<std::uint32_t>(16));
|
||||
ctx.fpr[12] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(0)));
|
||||
ctx.gpr[5] = (std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
||||
@@ -1081,9 +1080,8 @@ SB_L_088B4C7C:
|
||||
ctx.gpr[6] = (std::bit_cast<std::uint32_t>(ctx.fpr[13]));
|
||||
ctx.fpr[14] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(8)));
|
||||
ctx.gpr[7] = (std::bit_cast<std::uint32_t>(ctx.fpr[14]));
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(4), ctx.gpr[6]);
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(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<std::uint32_t>(0), tier2_words); }
|
||||
ctx.gpr[18] = (ctx.gpr[18] + static_cast<std::uint32_t>(1));
|
||||
ctx.gpr[4] = (static_cast<std::int32_t>(ctx.gpr[18]) < static_cast<std::int32_t>(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<std::uint32_t>(ctx.fpr[13]));
|
||||
ctx.fpr[14] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[18] + static_cast<std::uint32_t>(8)));
|
||||
ctx.gpr[6] = (std::bit_cast<std::uint32_t>(ctx.fpr[14]));
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(0), ctx.gpr[4]);
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(4), ctx.gpr[5]);
|
||||
aot_mem.aot_store32(ctx.gpr[17] + static_cast<std::uint32_t>(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<std::uint32_t>(0), tier2_words); }
|
||||
ctx.fpr[15] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(16)));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(176), std::bit_cast<std::uint32_t>(ctx.fpr[15]));
|
||||
ctx.fpr[15] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(20)));
|
||||
@@ -1357,32 +1354,36 @@ SB_L_088B4EE4:
|
||||
ctx.fpr[12] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[17] + static_cast<std::uint32_t>(24)));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(184), std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<4u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<5u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[20] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<6u, 4u>(vfpu_value); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[19] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<7u, 4u>(vfpu_value); }
|
||||
{ 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<std::uint32_t>(0);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
||||
ctx.gpr[4] = (ctx.gpr[17] + static_cast<std::uint32_t>(16));
|
||||
ctx.fpr[12] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[18] + static_cast<std::uint32_t>(0)));
|
||||
ctx.gpr[5] = (std::bit_cast<std::uint32_t>(ctx.fpr[12]));
|
||||
@@ -1419,9 +1418,8 @@ SB_L_088B4EE4:
|
||||
ctx.gpr[6] = (std::bit_cast<std::uint32_t>(ctx.fpr[13]));
|
||||
ctx.fpr[14] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[18] + static_cast<std::uint32_t>(8)));
|
||||
ctx.gpr[7] = (std::bit_cast<std::uint32_t>(ctx.fpr[14]));
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(4), ctx.gpr[6]);
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(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<std::uint32_t>(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<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(296)));
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(300)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(304)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(308)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(312)));
|
||||
ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(316)));
|
||||
ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(320)));
|
||||
ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(324)));
|
||||
ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(328)));
|
||||
ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(332)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(336)));
|
||||
{ std::uint32_t tier2_words[11]{};
|
||||
if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast<std::uint32_t>(296), tier2_words)) {
|
||||
ctx.fpr[20] = std::bit_cast<float>(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<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(296)));
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(300)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(304)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(308)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(312)));
|
||||
ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(316)));
|
||||
ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(320)));
|
||||
ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(324)));
|
||||
ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(328)));
|
||||
ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(332)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(336)));
|
||||
} }
|
||||
jump_target = ctx.gpr[31];
|
||||
ctx.gpr[29] = (ctx.gpr[29] + static_cast<std::uint32_t>(352));
|
||||
local_pc = jump_target;
|
||||
|
||||
@@ -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<std::uint32_t>(29552), ctx.gpr[6]);
|
||||
ctx.gpr[4] = (ctx.gpr[4] | ctx.gpr[8]);
|
||||
aot_mem.aot_store32(ctx.gpr[6] + static_cast<std::uint32_t>(0), ctx.gpr[4]);
|
||||
ctx.gpr[6] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[6] = (ctx.gpr[6] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[7] + static_cast<std::uint32_t>(29552), ctx.gpr[6]);
|
||||
ctx.gpr[6] = aot_mem.aot_advance32(ctx.gpr[7] + static_cast<std::uint32_t>(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<std::uint32_t>(0), ctx.gpr[4]);
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[7] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[7] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[4] = aot_mem.aot_advance32(ctx.gpr[7] + static_cast<std::uint32_t>(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<std::uint32_t>(-16));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(0), ctx.gpr[16]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(4), ctx.gpr[17]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(8), ctx.gpr[18]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(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<std::uint32_t>(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]);
|
||||
|
||||
@@ -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<std::uint32_t>(17440));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(0), ctx.gpr[16]);
|
||||
ctx.gpr[16] = (ctx.gpr[17] + static_cast<std::uint32_t>(16));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(8), ctx.gpr[18]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(12), ctx.gpr[19]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(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<std::uint32_t>(8), tier2_words); }
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[28] + static_cast<std::uint32_t>(10064)));
|
||||
ctx.gpr[19] = (0u | 0u);
|
||||
ctx.gpr[4] = (static_cast<std::int32_t>(ctx.gpr[19]) < static_cast<std::int32_t>(ctx.gpr[4]) ? 1u : 0u);
|
||||
@@ -1188,12 +1187,8 @@ SB_L_08A79F28:
|
||||
|
||||
SB_L_08A79F5C:
|
||||
ctx.gpr[29] = (ctx.gpr[29] + static_cast<std::uint32_t>(-32));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(0), std::bit_cast<std::uint32_t>(ctx.fpr[20]));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(4), ctx.gpr[16]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(8), ctx.gpr[17]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(12), ctx.gpr[18]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(16), ctx.gpr[19]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(20), ctx.gpr[31]);
|
||||
{ const std::uint32_t tier2_words[6]{std::bit_cast<std::uint32_t>(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<std::uint32_t>(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<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(0)));
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(4)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(8)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(12)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(16)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(20)));
|
||||
{ std::uint32_t tier2_words[6]{};
|
||||
if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast<std::uint32_t>(0), tier2_words)) {
|
||||
ctx.fpr[20] = std::bit_cast<float>(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<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(0)));
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(4)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(8)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(12)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(16)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(20)));
|
||||
} }
|
||||
jump_target = ctx.gpr[31];
|
||||
ctx.gpr[29] = (ctx.gpr[29] + static_cast<std::uint32_t>(32));
|
||||
local_pc = jump_target;
|
||||
@@ -1384,13 +1389,8 @@ SB_L_08A7A074:
|
||||
SB_L_08A7A664:
|
||||
ctx.gpr[29] = (ctx.gpr[29] + static_cast<std::uint32_t>(-32));
|
||||
ctx.gpr[5] = (ctx.gpr[5] & 255u);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(0), ctx.gpr[16]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(4), ctx.gpr[17]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(8), ctx.gpr[18]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(12), ctx.gpr[19]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(16), ctx.gpr[20]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(20), ctx.gpr[21]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(0)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(4)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(8)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(12)));
|
||||
ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(16)));
|
||||
ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(20)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(24)));
|
||||
{ std::uint32_t tier2_words[7]{};
|
||||
if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast<std::uint32_t>(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<std::uint32_t>(0)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(4)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(8)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(12)));
|
||||
ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(16)));
|
||||
ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(20)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(24)));
|
||||
} }
|
||||
jump_target = ctx.gpr[31];
|
||||
ctx.gpr[29] = (ctx.gpr[29] + static_cast<std::uint32_t>(32));
|
||||
local_pc = jump_target;
|
||||
@@ -1861,18 +1872,11 @@ SB_L_08A7A94C:
|
||||
aot_mem.aot_store32(ctx.gpr[20] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
ctx.gpr[6] = (ctx.gpr[6] + static_cast<std::uint32_t>(1));
|
||||
aot_mem.aot_store32(ctx.gpr[5] + static_cast<std::uint32_t>(0), ctx.gpr[6]);
|
||||
ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast<std::uint32_t>(0)));
|
||||
ctx.gpr[5] = (ctx.gpr[5] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[20] + static_cast<std::uint32_t>(0), ctx.gpr[5]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(40), ctx.gpr[16]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(44), ctx.gpr[17]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(48), ctx.gpr[18]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(52), ctx.gpr[19]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(60), ctx.gpr[21]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(64), ctx.gpr[22]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(68), ctx.gpr[23]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(72), ctx.gpr[30]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(76), ctx.gpr[31]);
|
||||
ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[20] + static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(60), tier2_words); }
|
||||
ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[20] + static_cast<std::uint32_t>(0)));
|
||||
ctx.gpr[6] = (51200u << 16u);
|
||||
ctx.gpr[6] = (ctx.gpr[6] + static_cast<std::uint32_t>(2));
|
||||
@@ -2256,19 +2260,21 @@ SB_L_08A7ACB0:
|
||||
SB_L_08A7ACB8:
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(36)));
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
||||
ctx.gpr[4] = (ctx.gpr[16] + static_cast<std::uint32_t>(48));
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
||||
{ 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<std::uint32_t>(0);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[29] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
||||
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<std::uint32_t>(-24632), static_cast<std::uint8_t>(ctx.gpr[4]));
|
||||
ctx.gpr[4] = (ctx.gpr[5] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[16] + static_cast<std::uint32_t>(29552), ctx.gpr[4]);
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(40)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(44)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(48)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(52)));
|
||||
ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(56)));
|
||||
ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(60)));
|
||||
ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(64)));
|
||||
ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(68)));
|
||||
ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(72)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(76)));
|
||||
{ std::uint32_t tier2_words[10]{};
|
||||
if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast<std::uint32_t>(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<std::uint32_t>(40)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(44)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(48)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(52)));
|
||||
ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(56)));
|
||||
ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(60)));
|
||||
ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(64)));
|
||||
ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(68)));
|
||||
ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(72)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(76)));
|
||||
} }
|
||||
jump_target = ctx.gpr[31];
|
||||
ctx.gpr[29] = (ctx.gpr[29] + static_cast<std::uint32_t>(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<std::uint32_t>(256));
|
||||
aot_mem.aot_store32(ctx.gpr[5] + static_cast<std::uint32_t>(0), ctx.gpr[6]);
|
||||
ctx.gpr[5] = (aot_mem.aot_load32(ctx.gpr[4] + static_cast<std::uint32_t>(29552)));
|
||||
ctx.gpr[5] = (ctx.gpr[5] + static_cast<std::uint32_t>(4));
|
||||
aot_mem.aot_store32(ctx.gpr[4] + static_cast<std::uint32_t>(29552), ctx.gpr[5]);
|
||||
ctx.gpr[5] = aot_mem.aot_advance32(ctx.gpr[4] + static_cast<std::uint32_t>(29552));
|
||||
ctx.gpr[4] = (aot_mem.aot_load32(ctx.gpr[16] + static_cast<std::uint32_t>(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<std::uint32_t>(48));
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
||||
{ float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value);
|
||||
const std::uint32_t vfpu_address = ctx.gpr[29] + static_cast<std::uint32_t>(0);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
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<std::uint32_t>(7656)));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(116), std::bit_cast<std::uint32_t>(ctx.fpr[20]));
|
||||
ctx.gpr[5] = (static_cast<std::int32_t>(ctx.gpr[4]) < static_cast<std::int32_t>(ctx.gpr[5]) ? 1u : 0u);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(124), ctx.gpr[17]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(128), ctx.gpr[18]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(132), ctx.gpr[19]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(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<std::uint32_t>(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<std::uint32_t>(48));
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
||||
ctx.gpr[4] = (ctx.gpr[28] + static_cast<std::uint32_t>(10048));
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
||||
{ 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<std::uint32_t>(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<std::uint32_t>(0);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
||||
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<std::uint32_t>(48));
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
||||
ctx.gpr[4] = (ctx.gpr[28] + static_cast<std::uint32_t>(10048));
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<1u, 4u>(vfpu_value); }
|
||||
{ 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<std::uint32_t>(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<std::uint32_t>(0);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
||||
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<std::uint32_t>(48));
|
||||
{ const std::uint32_t vfpu_address = ctx.gpr[4] + static_cast<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
||||
{ float vfpu_value[4]{}; ctx.read_vfpu_vector_ct<0u, 4u>(vfpu_value);
|
||||
const std::uint32_t vfpu_address = ctx.gpr[29] + static_cast<std::uint32_t>(0);
|
||||
aot_mem.aot_store32(vfpu_address + 0u, std::bit_cast<std::uint32_t>(vfpu_value[0]));
|
||||
aot_mem.aot_store32(vfpu_address + 4u, std::bit_cast<std::uint32_t>(vfpu_value[1]));
|
||||
aot_mem.aot_store32(vfpu_address + 8u, std::bit_cast<std::uint32_t>(vfpu_value[2]));
|
||||
aot_mem.aot_store32(vfpu_address + 12u, std::bit_cast<std::uint32_t>(vfpu_value[3])); }
|
||||
const std::uint32_t tier2_vfpu_words[4]{std::bit_cast<std::uint32_t>(vfpu_value[0]), std::bit_cast<std::uint32_t>(vfpu_value[1]), std::bit_cast<std::uint32_t>(vfpu_value[2]), std::bit_cast<std::uint32_t>(vfpu_value[3])};
|
||||
aot_mem.aot_store32_block(vfpu_address, tier2_vfpu_words); }
|
||||
ctx.gpr[5] = (ctx.gpr[28] + static_cast<std::uint32_t>(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<std::uint32_t>(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<float>(aot_mem.aot_load32(vfpu_address + 0u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 4u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 8u)),
|
||||
std::bit_cast<float>(aot_mem.aot_load32(vfpu_address + 12u))};
|
||||
std::bit_cast<float>(tier2_vfpu_words[0]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[1]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[2]),
|
||||
std::bit_cast<float>(tier2_vfpu_words[3])};
|
||||
ctx.write_vfpu_vector_ct<0u, 4u>(vfpu_value); }
|
||||
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<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(116)));
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(120)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(124)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(128)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(132)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(136)));
|
||||
{ std::uint32_t tier2_words[6]{};
|
||||
if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast<std::uint32_t>(116), tier2_words)) {
|
||||
ctx.fpr[20] = std::bit_cast<float>(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<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(116)));
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(120)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(124)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(128)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(132)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(136)));
|
||||
} }
|
||||
jump_target = ctx.gpr[31];
|
||||
ctx.gpr[29] = (ctx.gpr[29] + static_cast<std::uint32_t>(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<std::uint32_t>(-7080)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(8));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(16), ctx.gpr[5]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(20), std::bit_cast<std::uint32_t>(ctx.fpr[20]));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(24), std::bit_cast<std::uint32_t>(ctx.fpr[22]));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(28), ctx.gpr[16]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(32), ctx.gpr[17]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(36), ctx.gpr[18]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(40), ctx.gpr[19]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(44), ctx.gpr[20]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(48), ctx.gpr[21]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(52), ctx.gpr[22]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(56), ctx.gpr[23]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(60), ctx.gpr[30]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(64), ctx.gpr[31]);
|
||||
{ const std::uint32_t tier2_words[13]{ctx.gpr[5], std::bit_cast<std::uint32_t>(ctx.fpr[20]), std::bit_cast<std::uint32_t>(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<std::uint32_t>(16), tier2_words); }
|
||||
{ const bool branch_taken = ctx.gpr[6] == 0u;
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(12), ctx.gpr[4]);
|
||||
if (branch_taken) {
|
||||
@@ -4938,18 +4953,34 @@ SB_L_08A7F030:
|
||||
}
|
||||
|
||||
SB_L_08A7F048:
|
||||
ctx.fpr[20] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(20)));
|
||||
ctx.fpr[22] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(24)));
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(28)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(32)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(36)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(40)));
|
||||
ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(44)));
|
||||
ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(48)));
|
||||
ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(52)));
|
||||
ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(56)));
|
||||
ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(60)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(64)));
|
||||
{ std::uint32_t tier2_words[12]{};
|
||||
if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast<std::uint32_t>(20), tier2_words)) {
|
||||
ctx.fpr[20] = std::bit_cast<float>(tier2_words[0]);
|
||||
ctx.fpr[22] = std::bit_cast<float>(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<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(20)));
|
||||
ctx.fpr[22] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(24)));
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(28)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(32)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(36)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(40)));
|
||||
ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(44)));
|
||||
ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(48)));
|
||||
ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(52)));
|
||||
ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(56)));
|
||||
ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(60)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(64)));
|
||||
} }
|
||||
jump_target = ctx.gpr[31];
|
||||
ctx.gpr[29] = (ctx.gpr[29] + static_cast<std::uint32_t>(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<std::uint32_t>(-7080)));
|
||||
ctx.gpr[4] = (ctx.gpr[4] + static_cast<std::uint32_t>(8));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(16), ctx.gpr[5]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(20), std::bit_cast<std::uint32_t>(ctx.fpr[20]));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(24), std::bit_cast<std::uint32_t>(ctx.fpr[22]));
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(28), ctx.gpr[16]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(32), ctx.gpr[17]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(36), ctx.gpr[18]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(40), ctx.gpr[19]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(44), ctx.gpr[20]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(48), ctx.gpr[21]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(52), ctx.gpr[22]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(56), ctx.gpr[23]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(60), ctx.gpr[30]);
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(64), ctx.gpr[31]);
|
||||
{ const std::uint32_t tier2_words[13]{ctx.gpr[5], std::bit_cast<std::uint32_t>(ctx.fpr[20]), std::bit_cast<std::uint32_t>(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<std::uint32_t>(16), tier2_words); }
|
||||
{ const bool branch_taken = ctx.gpr[6] == 0u;
|
||||
aot_mem.aot_store32(ctx.gpr[29] + static_cast<std::uint32_t>(12), ctx.gpr[4]);
|
||||
if (branch_taken) {
|
||||
@@ -5075,18 +5095,34 @@ SB_L_08A7F488:
|
||||
}
|
||||
|
||||
SB_L_08A7F4A0:
|
||||
ctx.fpr[20] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(20)));
|
||||
ctx.fpr[22] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(24)));
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(28)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(32)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(36)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(40)));
|
||||
ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(44)));
|
||||
ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(48)));
|
||||
ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(52)));
|
||||
ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(56)));
|
||||
ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(60)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(64)));
|
||||
{ std::uint32_t tier2_words[12]{};
|
||||
if (aot_mem.aot_try_load32_block(ctx.gpr[29] + static_cast<std::uint32_t>(20), tier2_words)) {
|
||||
ctx.fpr[20] = std::bit_cast<float>(tier2_words[0]);
|
||||
ctx.fpr[22] = std::bit_cast<float>(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<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(20)));
|
||||
ctx.fpr[22] = std::bit_cast<float>(aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(24)));
|
||||
ctx.gpr[16] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(28)));
|
||||
ctx.gpr[17] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(32)));
|
||||
ctx.gpr[18] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(36)));
|
||||
ctx.gpr[19] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(40)));
|
||||
ctx.gpr[20] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(44)));
|
||||
ctx.gpr[21] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(48)));
|
||||
ctx.gpr[22] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(52)));
|
||||
ctx.gpr[23] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(56)));
|
||||
ctx.gpr[30] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(60)));
|
||||
ctx.gpr[31] = (aot_mem.aot_load32(ctx.gpr[29] + static_cast<std::uint32_t>(64)));
|
||||
} }
|
||||
jump_target = ctx.gpr[31];
|
||||
ctx.gpr[29] = (ctx.gpr[29] + static_cast<std::uint32_t>(80));
|
||||
local_pc = jump_target;
|
||||
|
||||
@@ -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...
|
||||
|
||||
@@ -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<float>\(aot_mem\.aot_load32\(vfpu_address \+ 0u\)\),\s*'
|
||||
r'std::bit_cast<float>\(aot_mem\.aot_load32\(vfpu_address \+ 4u\)\),\s*'
|
||||
r'std::bit_cast<float>\(aot_mem\.aot_load32\(vfpu_address \+ 8u\)\),\s*'
|
||||
r'std::bit_cast<float>\(aot_mem\.aot_load32\(vfpu_address \+ 12u\)\)\};',
|
||||
re.S)
|
||||
|
||||
QUAD_VFPU_STORE_RE = re.compile(
|
||||
r'aot_mem\.aot_store32\(vfpu_address \+ 0u, (?P<v0>[^;]+)\);\s*'
|
||||
r'aot_mem\.aot_store32\(vfpu_address \+ 4u, (?P<v1>[^;]+)\);\s*'
|
||||
r'aot_mem\.aot_store32\(vfpu_address \+ 8u, (?P<v2>[^;]+)\);\s*'
|
||||
r'aot_mem\.aot_store32\(vfpu_address \+ 12u, (?P<v3>[^;]+)\);')
|
||||
|
||||
_SIMPLE_GPR_LOAD_RE = re.compile(
|
||||
r'^(?P<indent>\s*)ctx\.gpr\[(?P<dst>\d+)\] = \(aot_mem\.aot_load32\('
|
||||
r'ctx\.gpr\[(?P<base>\d+)\] \+ static_cast<std::uint32_t>\((?P<offset>-?\d+)\)\)\);$')
|
||||
_SIMPLE_FPR_LOAD_RE = re.compile(
|
||||
r'^(?P<indent>\s*)ctx\.fpr\[(?P<dst>\d+)\] = std::bit_cast<float>\(aot_mem\.aot_load32\('
|
||||
r'ctx\.gpr\[(?P<base>\d+)\] \+ static_cast<std::uint32_t>\((?P<offset>-?\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<indent>\s*)ctx\.gpr\[(?P<old>\d+)\] = \(aot_mem\.aot_load32\('
|
||||
r'ctx\.gpr\[(?P<base>\d+)\] \+ static_cast<std::uint32_t>\((?P<off>-?\d+)\)\)\);\n'
|
||||
r'(?P=indent)aot_mem\.aot_store32\(ctx\.gpr\[(?P=old)\] \+ static_cast<std::uint32_t>\(0\), '
|
||||
r'(?P<value>ctx\.gpr\[(?P<value_reg>\d+)\])\);\n'
|
||||
r'(?P=indent)ctx\.gpr\[(?P<new>\d+)\] = \(aot_mem\.aot_load32\('
|
||||
r'ctx\.gpr\[(?P=base)\] \+ static_cast<std::uint32_t>\((?P=off)\)\)\);\n'
|
||||
r'(?P=indent)ctx\.gpr\[(?P=new)\] = \(ctx\.gpr\[(?P=new)\] \+ static_cast<std::uint32_t>\(4\)\);\n'
|
||||
r'(?P=indent)aot_mem\.aot_store32\(ctx\.gpr\[(?P=base)\] \+ static_cast<std::uint32_t>\((?P=off)\), '
|
||||
r'ctx\.gpr\[(?P=new)\]\);')
|
||||
|
||||
ADVANCE32_RE = re.compile(
|
||||
r'(?P<indent>\s*)ctx\.gpr\[(?P<reg>\d+)\] = \(aot_mem\.aot_load32\('
|
||||
r'ctx\.gpr\[(?P<base>\d+)\] \+ static_cast<std::uint32_t>\((?P<off>-?\d+)\)\)\);\n'
|
||||
r'(?P=indent)ctx\.gpr\[(?P=reg)\] = \(ctx\.gpr\[(?P=reg)\] \+ static_cast<std::uint32_t>\(4\)\);\n'
|
||||
r'(?P=indent)aot_mem\.aot_store32\(ctx\.gpr\[(?P=base)\] \+ static_cast<std::uint32_t>\((?P=off)\), '
|
||||
r'ctx\.gpr\[(?P=reg)\]\);')
|
||||
|
||||
_SIMPLE_STORE_RE = re.compile(
|
||||
r'^(?P<indent>\s*)aot_mem\.aot_store32\('
|
||||
r'ctx\.gpr\[(?P<base>\d+)\] \+ static_cast<std::uint32_t>\((?P<offset>-?\d+)\), '
|
||||
r'(?P<value>.+)\);$')
|
||||
|
||||
_SAFE_STORE_VALUE_RE = re.compile(
|
||||
r'^(?:ctx\.gpr\[\d+\]|std::bit_cast<std::uint32_t>\(ctx\.fpr\[\d+\]\)|'
|
||||
r'static_cast<std::uint32_t>\([^;]+\)|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<std::uint32_t>({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<float>(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<std::uint32_t>({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<float>(tier2_vfpu_words[0]),\n'
|
||||
' std::bit_cast<float>(tier2_vfpu_words[1]),\n'
|
||||
' std::bit_cast<float>(tier2_vfpu_words[2]),\n'
|
||||
' std::bit_cast<float>(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<std::uint32_t>({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<std::uint32_t>({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"]}',
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user