mirror of
https://github.com/ARMSX2/ARMSX3.git
synced 2026-08-24 16:58:52 -07:00
Saint Seiya: Sanctuary Battle (BLES01421) stalled partway through PPU compilation and booted to a black screen. The failure was in LLVM, not here: on AArch64 the register scavenger ran out of registers under the GHC calling convention, which pins most of the GPRs to guest state, and AArch64FrameLowering::determineCalleeSaves returns early for GHC before it can create the emergency spill slot the scavenger falls back on. The scavenger then aborts, and because that takes down the whole MODULE rather than one function, every function in it drops to the interpreter -- the boot never finishes, or the game runs at interpreter speed with nothing in the log to explain it. Fix creates the spill slot for GHC frames that actually need stack. 231/231 modules compile for Saint Seiya, and Sonic Unleashed's FMVs work for the same reason. Because it is a codegen fix rather than a per-game workaround, any title that hit this benefits. The change itself lives in the LLVM submodule, whose remote is upstream llvm/llvm-project, so it cannot travel in this repository. It is preserved here as 3rdparty/llvm/armsx3-aarch64-ghc-emergency-spill.patch, applied against the pinned submodule commit; a build without it applied will exhibit the original stall. Also bumps the ARM64 codegen cache version so caches produced before the fix are not reused, and carries the PPUTranslator changes the same work needed.