mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-11-06 13:30:00 +00:00
XSAVEOPT raises an illegal instruction under Rosetta on an M5 running macOS 27.0.1, as XSAVEC does, while XSAVE and XRSTOR save and restore x87, SSE and AVX state in the standard format. The PS5's Zen 2 has XSAVEOPT, so code built for it can use the instruction without a CPUID check. XSAVEOPT differs from XSAVE only in the init and modified optimizations: it may skip writing state that is in its initial configuration or unchanged since the last XRSTOR from the same area. XRSTOR restores the same state from the area XSAVE writes, so --to-rosetta rewrites XSAVEOPT (NP 0F AE /6, memory operand) to XSAVE (/4) in place, keeping the prefixes and the operand, as RDSEED becomes RDRAND. CLWB (66 0F AE /6), MFENCE, UMONITOR, UMWAIT and the Intel target are left alone. XSAVEC is not converted: it writes the compacted format. The converter tests check the rewrite for the plain, REX.W, RSP-relative, extended-base, RIP-relative and FS-relative forms, check that the neighbouring 0F AE encodings are not taken, and execute the rewritten XSAVEOPT64 followed by XRSTOR on YMM3 in the x86-64 build. The --to-rosetta integration test now covers XSAVEOPT as well.