mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 14:19:46 -06:00
PowerPC: Remove separate macros for paired singles
Previously, PowerPC.h had four macros in it like so: \#define rPS0(i) (*(double*)(&PowerPC::ppcState.ps[i][0])) \#define rPS1(i) (*(double*)(&PowerPC::ppcState.ps[i][1])) \#define riPS0(i) (*(u64*)(&PowerPC::ppcState.ps[i][0])) \#define riPS1(i) (*(u64*)(&PowerPC::ppcState.ps[i][1])) Casting between object representations like this is undefined behavior. Given this is used heavily with the interpreter (that is, the most accurate, but slowest CPU backend), we don't exactly want to allow undefined behavior to creep into it. Instead, this adds a helper struct for operating with the paired singles, and replaces the four macros with a single macro for accessing the paired-singles/floating-point registers. This way, it's left up to the caller to explicitly decide how it wants to interpret the data (and makes it more obvious where different interpretations of the same data are occurring at, as there'll be a call to one of the [x]AsDouble() functions).
This commit is contained in:
@ -227,11 +227,11 @@ void RegisterWidget::PopulateTable()
|
||||
[i](u64 value) { GPR(i) = value; });
|
||||
|
||||
// Floating point registers (double)
|
||||
AddRegister(i, 2, RegisterType::fpr, "f" + std::to_string(i), [i] { return riPS0(i); },
|
||||
[i](u64 value) { riPS0(i) = value; });
|
||||
AddRegister(i, 2, RegisterType::fpr, "f" + std::to_string(i), [i] { return rPS(i).PS0AsU64(); },
|
||||
[i](u64 value) { rPS(i).SetPS0(value); });
|
||||
|
||||
AddRegister(i, 4, RegisterType::fpr, "", [i] { return riPS1(i); },
|
||||
[i](u64 value) { riPS1(i) = value; });
|
||||
AddRegister(i, 4, RegisterType::fpr, "", [i] { return rPS(i).PS1AsU64(); },
|
||||
[i](u64 value) { rPS(i).SetPS1(value); });
|
||||
}
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
|
Reference in New Issue
Block a user