mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-26 07:35:41 +00:00
CPU/PGXP: Purge psx_value completely
This commit is contained in:
parent
588a63080f
commit
e5c241b9f5
|
@ -23,7 +23,6 @@ Log_SetChannel(CPU::PGXP);
|
||||||
// TODO: Don't update flags on Validate(), instead return it.
|
// TODO: Don't update flags on Validate(), instead return it.
|
||||||
|
|
||||||
namespace CPU::PGXP {
|
namespace CPU::PGXP {
|
||||||
namespace {
|
|
||||||
|
|
||||||
enum : u32
|
enum : u32
|
||||||
{
|
{
|
||||||
|
@ -62,21 +61,6 @@ enum : u32
|
||||||
#define SET_LOWORD(val, loword) ((static_cast<u32>(val) & 0xFFFF0000u) | static_cast<u32>(static_cast<u16>(loword)))
|
#define SET_LOWORD(val, loword) ((static_cast<u32>(val) & 0xFFFF0000u) | static_cast<u32>(static_cast<u16>(loword)))
|
||||||
#define SET_HIWORD(val, hiword) ((static_cast<u32>(val) & 0x0000FFFFu) | (static_cast<u32>(hiword) << 16))
|
#define SET_HIWORD(val, hiword) ((static_cast<u32>(val) & 0x0000FFFFu) | (static_cast<u32>(hiword) << 16))
|
||||||
|
|
||||||
union psx_value
|
|
||||||
{
|
|
||||||
u32 d;
|
|
||||||
s32 sd;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
u16 l, h;
|
|
||||||
} w;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
s16 l, h;
|
|
||||||
} sw;
|
|
||||||
};
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
static void CacheVertex(u32 value, const PGXP_value& vertex);
|
static void CacheVertex(u32 value, const PGXP_value& vertex);
|
||||||
static PGXP_value* GetCachedVertex(u32 value);
|
static PGXP_value* GetCachedVertex(u32 value);
|
||||||
|
|
||||||
|
@ -86,7 +70,6 @@ static bool IsWithinTolerance(float precise_x, float precise_y, int int_x, int i
|
||||||
static void MakeValid(PGXP_value* pV, u32 psxV);
|
static void MakeValid(PGXP_value* pV, u32 psxV);
|
||||||
|
|
||||||
static void Validate(PGXP_value* pV, u32 psxV);
|
static void Validate(PGXP_value* pV, u32 psxV);
|
||||||
static void MaskValidate(PGXP_value* pV, u32 psxV, u32 mask, u32 validMask);
|
|
||||||
|
|
||||||
static double f16Sign(double in);
|
static double f16Sign(double in);
|
||||||
static double f16Unsign(double in);
|
static double f16Unsign(double in);
|
||||||
|
@ -233,11 +216,6 @@ ALWAYS_INLINE_RELEASE void CPU::PGXP::Validate(PGXP_value* pV, u32 psxV)
|
||||||
pV->flags = (pV->value == psxV) ? pV->flags : 0;
|
pV->flags = (pV->value == psxV) ? pV->flags : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ALWAYS_INLINE_RELEASE void CPU::PGXP::MaskValidate(PGXP_value* pV, u32 psxV, u32 mask, u32 validMask)
|
|
||||||
{
|
|
||||||
pV->flags = ((pV->value & mask) == (psxV & mask)) ? pV->flags : (pV->flags & ~validMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
ALWAYS_INLINE_RELEASE double CPU::PGXP::f16Sign(double in)
|
ALWAYS_INLINE_RELEASE double CPU::PGXP::f16Sign(double in)
|
||||||
{
|
{
|
||||||
const s32 s = static_cast<s32>(static_cast<s64>(in * (USHRT_MAX + 1)));
|
const s32 s = static_cast<s32>(static_cast<s64>(in * (USHRT_MAX + 1)));
|
||||||
|
@ -322,32 +300,21 @@ ALWAYS_INLINE_RELEASE const CPU::PGXP_value& CPU::PGXP::ValidateAndLoadMem(u32 a
|
||||||
ALWAYS_INLINE_RELEASE void CPU::PGXP::ValidateAndLoadMem16(PGXP_value* dest, u32 addr, u32 value, bool sign)
|
ALWAYS_INLINE_RELEASE void CPU::PGXP::ValidateAndLoadMem16(PGXP_value* dest, u32 addr, u32 value, bool sign)
|
||||||
{
|
{
|
||||||
PGXP_value* pMem = GetPtr(addr);
|
PGXP_value* pMem = GetPtr(addr);
|
||||||
if (!pMem)
|
if (!pMem) [[unlikely]]
|
||||||
{
|
{
|
||||||
*dest = PGXP_value_invalid;
|
*dest = PGXP_value_invalid;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
psx_value val{0}, mask{0};
|
|
||||||
u32 valid_mask = 0;
|
|
||||||
|
|
||||||
// determine if high or low word
|
// determine if high or low word
|
||||||
const bool hiword = ((addr & 2) != 0);
|
const bool hiword = ((addr & 2) != 0);
|
||||||
if (hiword)
|
|
||||||
{
|
|
||||||
val.w.h = static_cast<u16>(value);
|
|
||||||
mask.w.h = 0xFFFF;
|
|
||||||
valid_mask = VALID_Y;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
val.w.l = static_cast<u16>(value);
|
|
||||||
mask.w.l = 0xFFFF;
|
|
||||||
valid_mask = VALID_X;
|
|
||||||
}
|
|
||||||
|
|
||||||
// validate and copy whole value
|
// only validate the component we're interested in
|
||||||
MaskValidate(pMem, val.d, mask.d, valid_mask);
|
pMem->flags = hiword ?
|
||||||
|
((Truncate16(pMem->value >> 16) == Truncate16(value)) ? pMem->flags : (pMem->flags & ~VALID_Y)) :
|
||||||
|
((Truncate16(pMem->value) == Truncate16(value)) ? pMem->flags : (pMem->flags & ~VALID_X));
|
||||||
|
|
||||||
|
// copy whole value
|
||||||
*dest = *pMem;
|
*dest = *pMem;
|
||||||
|
|
||||||
// if high word then shift
|
// if high word then shift
|
||||||
|
|
Loading…
Reference in a new issue