Use integer comparisons in MAX/MINI to avoid issues with denormals.
Some checks failed
Build macOS / build_macos (push) Has been cancelled
Build Windows / build_windows (x86_32, Visual Studio 16 2019, installer32.nsi, win32_msvc2019, Win32) (push) Has been cancelled
Build Windows / build_windows (x86_64, Visual Studio 16 2019, installer64.nsi, win64_msvc2019_64, x64) (push) Has been cancelled
Build Linux / build_linux (push) Has been cancelled
Build Linux ARM32 / build_linux_arm32 (push) Has been cancelled
Build Linux ARM64 / build_linux_arm64 (push) Has been cancelled
Build Android / build_android (apk) (push) Has been cancelled
Build Android / build_android (libretro) (push) Has been cancelled
Build iOS / build_ios (push) Has been cancelled
Build JavaScript / build_js (push) Has been cancelled
Build Windows Psf / build_windows_psf (off, x86_64, Visual Studio 16 2019, installer64.nsi, x64) (push) Has been cancelled
Build Windows Psf / build_windows_psf (on, x86_64, Visual Studio 16 2019, installer64.nsi, x64) (push) Has been cancelled
Check Format / run_clangformat (push) Has been cancelled

This commit is contained in:
Jean-Philip Desjardins 2025-03-08 17:46:19 -05:00
parent f7f955ff4b
commit 31e7176215
2 changed files with 46 additions and 7 deletions

View file

@ -223,6 +223,43 @@ void VUShared::PullIntegerRegister(CMipsJitter* codeGen, unsigned int regIdx)
codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[regIdx])); codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[regIdx]));
} }
void VUShared::MakeComparableFromFloat(CMipsJitter* codeGen)
{
uint32 valueCursor = codeGen->GetTopCursor();
//Compute mask
codeGen->PushCursor(valueCursor);
codeGen->MD_SraW(31);
uint32 maskCursor = codeGen->GetTopCursor();
//Make neg
codeGen->MD_PushCstExpand(0xFFFFFFFFU);
codeGen->PushCursor(valueCursor);
codeGen->MD_SubW();
codeGen->PushCursor(maskCursor);
codeGen->MD_And();
//Make pos
codeGen->MD_PushCstExpand(0x7FFFFFFFU);
codeGen->PushCursor(valueCursor);
codeGen->MD_AddW();
codeGen->PushCursor(maskCursor);
codeGen->MD_Not();
codeGen->MD_And();
codeGen->MD_Or();
//Make it signed comparable
codeGen->MD_PushCstExpand(0x80000000U);
codeGen->MD_SubW();
codeGen->Swap();
codeGen->PullTop();
codeGen->Swap();
codeGen->PullTop();
}
void VUShared::TestSZFlags(CMipsJitter* codeGen, uint8 dest, size_t regOffset, uint32 relativePipeTime, uint32 compileHints) void VUShared::TestSZFlags(CMipsJitter* codeGen, uint8 dest, size_t regOffset, uint32 relativePipeTime, uint32 compileHints)
{ {
codeGen->MD_PushRel(regOffset); codeGen->MD_PushRel(regOffset);
@ -579,12 +616,13 @@ void VUShared::MINI_base(CMipsJitter* codeGen, uint8 dest, size_t fd, size_t fs,
} }
}; };
codeGen->MD_PushRel(fs);
codeGen->MD_ClampS();
pushFt(); pushFt();
codeGen->MD_ClampS(); MakeComparableFromFloat(codeGen);
codeGen->MD_PushRel(fs);
MakeComparableFromFloat(codeGen);
codeGen->MD_CmpLtS(); //Since we don't have a less-than operator, operands are reversed (ft > fs instead of fs < ft)
codeGen->MD_CmpGtW();
auto cmp = codeGen->GetTopCursor(); auto cmp = codeGen->GetTopCursor();
//Mask FT //Mask FT
@ -618,11 +656,11 @@ void VUShared::MAX_base(CMipsJitter* codeGen, uint8 dest, size_t fd, size_t fs,
}; };
codeGen->MD_PushRel(fs); codeGen->MD_PushRel(fs);
codeGen->MD_ClampS(); MakeComparableFromFloat(codeGen);
pushFt(); pushFt();
codeGen->MD_ClampS(); MakeComparableFromFloat(codeGen);
codeGen->MD_CmpGtS(); codeGen->MD_CmpGtW();
auto cmp = codeGen->GetTopCursor(); auto cmp = codeGen->GetTopCursor();
//Mask FT //Mask FT

View file

@ -118,6 +118,7 @@ namespace VUShared
void PushIntegerRegister(CMipsJitter*, unsigned int); void PushIntegerRegister(CMipsJitter*, unsigned int);
void PullIntegerRegister(CMipsJitter*, unsigned int); void PullIntegerRegister(CMipsJitter*, unsigned int);
void MakeComparableFromFloat(CMipsJitter*);
void TestSZFlags(CMipsJitter*, uint8, size_t, uint32, uint32); void TestSZFlags(CMipsJitter*, uint8, size_t, uint32, uint32);
void GetStatus(CMipsJitter*, size_t, uint32); void GetStatus(CMipsJitter*, size_t, uint32);