mirror of
https://github.com/jpd002/Play-.git
synced 2025-04-28 13:47:57 +03:00
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
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:
parent
f7f955ff4b
commit
31e7176215
2 changed files with 46 additions and 7 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue