mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-14 14:00:42 +02:00
OpcodeDispatcher: Defer second XOR for AF
AF is calculated as: ((Src1 ^ Src2) ^ Res)[4] Due to the extract, this is equivalent to ((Src1 ^ Src2) ^ (Res ^ 1))[4] We already store (Res ^ 1) as the PF byte. So, it suffices to store AF Byte = Src1 ^ Src2 and then we can recover the flag value AF = (AF Byte ^ PF Byte)[4] This saves an instruction from the AF calculation. It does couple PF/AF writes. In practice, most instructions fall into one of these categories: * Both PF and AF written together, the coupling is correct. * PF written but AF invalidated, irrelevant. * Both invalidated, irrelevant. None of these require special handling. Where we do need special handling is when we want to write them separately, in which case we can fix-up the value of AF as appropriate. Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
This commit is contained in:
1 parent
80ac824dd9
commit
02c864d837
4 files changed
+56
-22
No files matched your search
@@ -3485,6 +3485,7 @@ void OpDispatchBuilder::DAAOp(OpcodeArgs) {
|
||||
SetRFLAG<FEXCore::X86State::RFLAG_SF_LOC>(_Select(FEXCore::IR::COND_UGE, _And(OpSize::i64Bit, AL, _Constant(0x80)), _Constant(0), _Constant(1), _Constant(0)));
|
||||
SetRFLAG<FEXCore::X86State::RFLAG_ZF_LOC>(_Select(FEXCore::IR::COND_EQ, _And(OpSize::i64Bit, AL, _Constant(0xFF)), _Constant(0), _Constant(1), _Constant(0)));
|
||||
CalculatePFUncheckedABI(AL);
|
||||
FixupAF();
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::DASOp(OpcodeArgs) {
|
||||
@@ -3557,6 +3558,7 @@ void OpDispatchBuilder::DASOp(OpcodeArgs) {
|
||||
SetRFLAG<FEXCore::X86State::RFLAG_SF_LOC>(_Select(FEXCore::IR::COND_UGE, _And(OpSize::i64Bit, AL, _Constant(0x80)), _Constant(0), _Constant(1), _Constant(0)));
|
||||
SetRFLAG<FEXCore::X86State::RFLAG_ZF_LOC>(_Select(FEXCore::IR::COND_EQ, _And(OpSize::i64Bit, AL, _Constant(0xFF)), _Constant(0), _Constant(1), _Constant(0)));
|
||||
CalculatePFUncheckedABI(AL);
|
||||
FixupAF();
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::AAAOp(OpcodeArgs) {
|
||||
@@ -3653,6 +3655,7 @@ void OpDispatchBuilder::AAMOp(OpcodeArgs) {
|
||||
SetRFLAG<FEXCore::X86State::RFLAG_SF_LOC>(_Select(FEXCore::IR::COND_UGE, _And(OpSize::i64Bit, AL, _Constant(0x80)), _Constant(0), _Constant(1), _Constant(0)));
|
||||
SetRFLAG<FEXCore::X86State::RFLAG_ZF_LOC>(_Select(FEXCore::IR::COND_EQ, _And(OpSize::i64Bit, AL, _Constant(0xFF)), _Constant(0), _Constant(1), _Constant(0)));
|
||||
CalculatePFUncheckedABI(AL);
|
||||
_InvalidateFlags(1u << X86State::RFLAG_AF_LOC);
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::AADOp(OpcodeArgs) {
|
||||
@@ -3670,6 +3673,7 @@ void OpDispatchBuilder::AADOp(OpcodeArgs) {
|
||||
SetRFLAG<FEXCore::X86State::RFLAG_SF_LOC>(_Select(FEXCore::IR::COND_UGE, _And(OpSize::i64Bit, AL, _Constant(0x80)), _Constant(0), _Constant(1), _Constant(0)));
|
||||
SetRFLAG<FEXCore::X86State::RFLAG_ZF_LOC>(_Select(FEXCore::IR::COND_EQ, _And(OpSize::i64Bit, AL, _Constant(0xFF)), _Constant(0), _Constant(1), _Constant(0)));
|
||||
CalculatePFUncheckedABI(AL);
|
||||
_InvalidateFlags(1u << X86State::RFLAG_AF_LOC);
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::XLATOp(OpcodeArgs) {
|
||||
|
||||
Reference in new issue
Block a user