| 2840 | } |
| 2841 | |
| 2842 | void OpDispatchBuilder::DASOp(OpcodeArgs) { |
| 2843 | CalculateDeferredFlags(); |
| 2844 | auto AL = LoadGPRRegister(X86State::REG_RAX, OpSize::i8Bit); |
| 2845 | auto CF = GetRFLAG(FEXCore::X86State::RFLAG_CF_RAW_LOC); |
| 2846 | auto AF = CalculateAFForDecimal(AL); |
| 2847 | |
| 2848 | // CF |= (AL > 0x99); |
| 2849 | CF = _Or(OpSize::i64Bit, CF, Select01(OpSize::i64Bit, CondClassType {COND_UGT}, AL, Constant(0x99))); |
| 2850 | |
| 2851 | // NewCF = CF | (AF && (Borrow from AL - 6)) |
| 2852 | auto NewCF = _Or(OpSize::i32Bit, CF, _Select(FEXCore::IR::COND_ULT, AL, Constant(6), AF, CF)); |
| 2853 | |
| 2854 | // AL = AF ? (AL - 0x6) : AL; |
| 2855 | AL = _Select(FEXCore::IR::COND_NEQ, AF, Constant(0), Sub(OpSize::i64Bit, AL, 0x6), AL); |
| 2856 | |
| 2857 | // AL = CF ? (AL - 0x60) : AL; |
| 2858 | AL = _Select(FEXCore::IR::COND_NEQ, CF, Constant(0), Sub(OpSize::i64Bit, AL, 0x60), AL); |
| 2859 | |
| 2860 | // SF, ZF, PF set according to result. CF set per above. OF undefined. |
| 2861 | StoreGPRRegister(X86State::REG_RAX, AL, OpSize::i8Bit); |
| 2862 | SetNZ_ZeroCV(OpSize::i8Bit, AL); |
| 2863 | SetCFDirect(NewCF); |
| 2864 | CalculatePF(AL); |
| 2865 | SetAFAndFixup(AF); |
| 2866 | } |
| 2867 | |
| 2868 | void OpDispatchBuilder::AAAOp(OpcodeArgs) { |
| 2869 | auto A = LoadGPRRegister(X86State::REG_RAX); |
nothing calls this directly
no outgoing calls
no test coverage detected