Files
AnyPS5/docs/TechnicalDebt.md
T
boykopovar a6bb98d4d5 Merge pull request #54 from oneandonlydean/feat/extrq-register-form
feat(relinker): lower register-form EXTRQ and relocate following instructions for short sites
- **Lowering:** register-form EXTRQ is emitted out of line with SSE2 only. Two scratch XMM registers (distinct from both operands) are spilled; one gets the index (`src >> 8 & 63`), the other `(64 - length) & 63` (`length` masked to 6 bits, so 0 means 64). The destination is shifted right by the index, then left and right by the complement, which keeps the low `length` bits. INSERTQ register form is still reported as unsupported.
- **Short sites:** when a site is shorter than a `jmp rel32`, the converter extends it over the instructions that follow it until it's 5 bytes long:
  - following EXTRQ/INSERTQ instructions (before any other instruction) are lowered into the same stub, via a new `MatchSequence`;
  - other instructions are copied after the lowered body (`LowerOutOfLine`'s new `trailing` bytes), but only if they're sequential, have no RIP-relative operand and no branch target;
  - anything else (a return, a branch, RIP-relative code, the segment ending) still fails the relink, as does a branch target inside the extended site.
- `docs/TechnicalDebt.md` now lists only the INSERTQ register form, MONITORX/MWAITX/CLZERO/RDPRU/MCOMMIT and SHA-NI.
2026-09-28 09:35:28 +03:00

4.0 KiB

Project technical debt

Build

  • Building on Windows requires a specific version of mingw - MinGW-w64 GCC 15.2.0 (winlibs-gcc15, x86_64-ucrt-posix-seh)
  • Even compiled prx libraries on Windows require nearby (static linking of these dependencies causes conflicts):
    • libgcc_s_seh-1.dll
    • libstdc++-6.dll
    • libwinpthread-1.dll

Silent stubs

Throughout the project, every function at every stage either does exactly what it's supposed to or throws an exception. Everywhere... except:

Unknown function info

Functional

  • Shader recompilation currently occurs right before it was transferred to Vulkan with caching, but should be moved to the relinker stage. For this purpose, shader/recompiler was written completely independently from libs/prx.
  • The executable file that relinker generates opens the console when launched, which is inconvenient for playability.
  • Relinker doesn't add an icon to the generated executable. This should be done without adding dependencies (only standard).
  • --to-intel does not lower the register form of INSERTQ (F2 0F 79) nor MONITORX/MWAITX/CLZERO/RDPRU/MCOMMIT; the lowering fails the relink instead. SHA-NI is not substituted.
  • The length-changing path of the instruction rewriter is not used by the converter: it does not adjust VEX/0F38/0F3A RIP-relative operands, data-to-code references (relocations, FDEs, jump tables) or segment sizes, so every substitution keeps the instruction length.
  • The Linux placement of the --to-intel stubs in the ELF patcher is covered only by a synthetic test.
  • The libc SSE4a trap emulation on Windows is superseded by --to-intel and remains only until the relinked title has been verified without it.
  • --to-intel lowerings that need a stub section are rejected for sce_module guest modules: the guest module builder does not pass stub sites to the guest module writer.
  • The game can expect its modified prx from the sce_module/sce_modules folder - this support is not implemented.