MCPcopy Create free account
hub / github.com/FEX-Emu/FEX / DASOp

Method DASOp

FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp:2842–2866  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2840}
2841
2842void 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
2868void OpDispatchBuilder::AAAOp(OpcodeArgs) {
2869 auto A = LoadGPRRegister(X86State::REG_RAX);

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected