v60: fix issue with CVTSW overflow flag after rounding

This commit is contained in:
hap 2025-03-30 20:39:21 +02:00
parent 27c2236773
commit 15dd6ba403

View File

@ -69,16 +69,19 @@ uint32_t v60_device::opCVTSW()
F2DecodeFirstOperand(&v60_device::ReadAM, 2);
// Convert to uint32_t
// Apply RDI rounding control
val = u2f(m_op1);
switch (TKCW & 7)
{
case 0: m_modwritevalw = (uint32_t)llroundf(val); break;
case 1: m_modwritevalw = (uint32_t)(int64_t)floorf(val); break;
case 2: m_modwritevalw = (uint32_t)(int64_t)ceilf(val); break;
default: m_modwritevalw = (uint32_t)(int64_t)truncf(val); break;
case 0: val = roundf(val); break;
case 1: val = floorf(val); break;
case 2: val = ceilf(val); break;
default: val = truncf(val); break;
}
// Convert to uint32_t
m_modwritevalw = (uint32_t)(int64_t)val;
_S = ((m_modwritevalw & 0x80000000) != 0);
_OV = (_S && val >= 0.0f) || (!_S && val <= -1.0f);
_Z = (m_modwritevalw == 0);
@ -122,7 +125,7 @@ uint32_t v60_device::opABSFS()
appf = u2f(m_op1);
if(appf < 0)
if (appf < 0)
appf = -appf;
_OV = 0;