cha0shacker
Member
We don't know where VU0 is emulated actually, we know the EEs main core (R5900) is emulated on the PPU and VU1 on an SPU (at least in gxemu and softemu). Netemu we don't know. Also the article stated that "PS3 models without Emotion Engine unit use "SPE-compatible SIMD graphics-rounding mode for VMX/Altivec Instructions" for FPU, and VU0 emulated floats calculations. This is set on emulator init by HV call 97 with param 1. VU1 actually run at SPE core so no compatibility mode need (or can) to be set. SPE compatible mode for PPE mean that rounding mode is set as round to zero, denormals are treated as zero, and there are no infinities or NaNs. So theoretically what PS2 FPU/VU was originally. Although SPE and PPE SPE compatibility mode is still inaccurate comparing to PS2, because Sony decided to cut off 2 guard bits from calculations on PS2. Probably because there was no need for round and sticky bits (no Nan/Inf, one round mode, etc.). Additionally float divide algorithm is custom and not fully understood up to this day. Good example here are TriAce games, or Castlevania COD where SPE calculation is wrong by 1 bit making games unplayable without patch. This are PS2 math algo specific inaccuracies in FPU/VU implementation that are not present on any other hardware."EE and VU0 are emulated on the PPE not SPE. Therefore, a special SPE float rounding mode for VMX/AltiVec is activated through the HV call for the PS2 emulation purposes. Everything is written on the wiki page, especially there.
So basically floats always run an SPU but it's still not accurate to real PS2 hardware because the real EE is missing 2 guard bits for rounding.