You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.5 KiB
51 lines
1.5 KiB
#include "Flags.h"
|
|
|
|
|
|
|
|
PNATIVE_CODE_LINK FlgEmitPushfqInst()
|
|
{
|
|
UCHAR RawData[] = { 0x9C };
|
|
PNATIVE_CODE_LINK Link = new NATIVE_CODE_LINK(CODE_FLAG_IS_INST, RawData, 1);
|
|
XedDecode(&Link->XedInstruction, Link->RawData, 1);
|
|
return Link;
|
|
}
|
|
|
|
PNATIVE_CODE_LINK FlgEmitPopfqInst()
|
|
{
|
|
UCHAR RawData[] = { 0x9D };
|
|
PNATIVE_CODE_LINK Link = new NATIVE_CODE_LINK(CODE_FLAG_IS_INST, RawData, 1);
|
|
XedDecode(&Link->XedInstruction, Link->RawData, 1);
|
|
return Link;
|
|
}
|
|
|
|
|
|
BOOL FlgAreFlagsClobbered(PNATIVE_CODE_LINK Inst, PNATIVE_CODE_LINK Stop)
|
|
{
|
|
XED_FLAG_SET Ledger;
|
|
CONST XED_SIMPLE_FLAG* SimpleFlags = XedDecodedInstGetRflagsInfo(&Inst->XedInstruction);
|
|
CONST XED_FLAG_SET* _Ledger1 = XedSimpleFlagGetWrittenFlagSet(SimpleFlags);
|
|
CONST XED_FLAG_SET* _Ledger2 = XedSimpleFlagGetUndefinedFlagSet(SimpleFlags);
|
|
Ledger.flat = (_Ledger1->flat | _Ledger2->flat);
|
|
|
|
for (PNATIVE_CODE_LINK T = Inst->Next; T && T != Stop; T = T->Next)
|
|
{
|
|
if (!XedDecodedInstUsesRflags(&T->XedInstruction) || T->Flags & CODE_FLAG_IS_LABEL)
|
|
continue;
|
|
|
|
CONST XED_SIMPLE_FLAG* InstFlags = XedDecodedInstGetRflagsInfo(&T->XedInstruction);
|
|
|
|
if (!(T->Flags & CODE_FLAG_DOESNT_READ_FLAGS))
|
|
{
|
|
CONST XED_FLAG_SET* FlagsRead = XedSimpleFlagGetReadFlagSet(InstFlags);
|
|
|
|
if (FlagsRead->flat & Ledger.flat)
|
|
return FALSE;
|
|
}
|
|
|
|
CONST XED_FLAG_SET* FlagsWritten = XedSimpleFlagGetWrittenFlagSet(InstFlags);
|
|
CONST XED_FLAG_SET* FlagsUndefined = XedSimpleFlagGetUndefinedFlagSet(InstFlags);
|
|
|
|
Ledger.flat &= ~(FlagsWritten->flat | FlagsUndefined->flat);
|
|
}
|
|
return TRUE;
|
|
} |