mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-14 10:00:42 +02:00
OpcodeDispatcher: factor out CalculateAFForDecimal
Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
This commit is contained in:
1 parent
3ca2c4377f
commit
583d4f8f94
2 files changed
+11
-12
No files matched your search
@@ -3117,16 +3117,19 @@ void OpDispatchBuilder::PopcountOp(OpcodeArgs) {
|
||||
GenerateFlags_POPCOUNT(Op, Src);
|
||||
}
|
||||
|
||||
OrderedNode *OpDispatchBuilder::CalculateAFForDecimal(OrderedNode *A) {
|
||||
auto Nibble = _And(OpSize::i64Bit, A, _Constant(0xF));
|
||||
auto Greater = _Select(FEXCore::IR::COND_UGT, Nibble, _Constant(9),
|
||||
_Constant(1), _Constant(0));
|
||||
|
||||
return _Or(OpSize::i64Bit, LoadAF(), Greater);
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::DAAOp(OpcodeArgs) {
|
||||
CalculateDeferredFlags();
|
||||
auto AL = LoadGPRRegister(X86State::REG_RAX, 1);
|
||||
auto CF = GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC);
|
||||
auto AF = LoadAF();
|
||||
|
||||
// AF |= ((AL & 0x0F) > 9);
|
||||
AF = _Or(OpSize::i64Bit, AF,
|
||||
_Select(FEXCore::IR::COND_UGT, _And(OpSize::i64Bit, AL, _Constant(0xF)), _Constant(9),
|
||||
_Constant(1), _Constant(0)));
|
||||
auto AF = CalculateAFForDecimal(AL);
|
||||
|
||||
// CF |= (AL > 0x99);
|
||||
CF = _Or(OpSize::i64Bit, CF, _Select(FEXCore::IR::COND_UGT, AL, _Constant(0x99), _Constant(1), _Constant(0)));
|
||||
@@ -3223,13 +3226,8 @@ void OpDispatchBuilder::DASOp(OpcodeArgs) {
|
||||
void OpDispatchBuilder::AAAOp(OpcodeArgs) {
|
||||
InvalidateDeferredFlags();
|
||||
|
||||
auto AF = LoadAF();
|
||||
auto A = LoadGPRRegister(X86State::REG_RAX);
|
||||
|
||||
// AF |= ((AL & 0x0F) > 9);
|
||||
AF = _Or(OpSize::i32Bit, AF,
|
||||
_Select(FEXCore::IR::COND_UGT, _And(OpSize::i32Bit, A, _Constant(0xF)), _Constant(9),
|
||||
_Constant(1), _Constant(0)));
|
||||
auto AF = CalculateAFForDecimal(A);
|
||||
|
||||
// CF = AF, OF/SF/ZF/PF undefined
|
||||
ZeroNZCV();
|
||||
|
||||
Reference in new issue
Block a user