From 474105b7bd5e1ff95e466ba37554ff57e1308ea4 Mon Sep 17 00:00:00 2001 From: clc5q <clc5q@git.zephyr-software.com> Date: Thu, 30 Apr 2015 06:41:05 +0000 Subject: [PATCH] Reduce SMPStaticAnalyzer module to an IDA Pro driver; reduce use of IDA Pro types in common modules. Former-commit-id: d78319e21cb81dc6c03e956074ea12fb25ccc5e2 --- .gitattributes | 4 + include/base/ProfilerInformation.h | 42 +- include/base/SMPBasicBlock.h | 110 +- include/base/SMPDataFlowAnalysis.h | 198 +- include/base/SMPFunction.h | 136 +- include/base/SMPInstr.h | 28 +- include/base/SMPProgram.h | 4 +- include/base/SMPStaticAnalyzer.h | 218 +- include/interfaces/SMPDBInterface.h | 105 +- include/interfaces/STARSTypes.h | 1457 ++++- include/interfaces/abstract/STARSInterface.h | 24 +- include/interfaces/abstract/STARSOp.h | 18 +- include/interfaces/abstract/STARSProgram.h | 185 + include/interfaces/abstract/all.h | 4 +- include/interfaces/idapro/STARSInstruction.h | 2 + include/interfaces/idapro/STARSOp.h | 9 +- include/interfaces/idapro/STARSProgram.h | 48 + include/interfaces/idapro/all.h | 1 + src/base/ProfilerInformation.cpp | 108 +- src/base/SMPBasicBlock.cpp | 379 +- src/base/SMPDBInterface.cpp | 94 +- src/base/SMPDataFlowAnalysis.cpp | 5788 ++++------------- src/base/SMPFunction.cpp | 571 +- src/base/SMPInstr.cpp | 3857 +++++------ src/base/SMPProgram.cpp | 61 +- src/base/SMPStaticAnalyzer.cpp | 2466 +------ src/interfaces/abstract/Makefile.in | 2 +- src/interfaces/abstract/STARSProgram.cpp | 5276 +++++++++++++++ src/interfaces/idapro/Makefile.in | 2 +- src/interfaces/idapro/STARSFunction.cpp | 5 +- src/interfaces/idapro/STARSIDAInstruction.cpp | 57 +- src/interfaces/idapro/STARSIDAOp.cpp | 30 +- src/interfaces/idapro/STARSIDAProgram.cpp | 136 + src/interfaces/idapro/STARSInterface.cpp | 9 +- 34 files changed, 11484 insertions(+), 9950 deletions(-) create mode 100644 include/interfaces/abstract/STARSProgram.h create mode 100644 include/interfaces/idapro/STARSProgram.h create mode 100644 src/interfaces/abstract/STARSProgram.cpp create mode 100644 src/interfaces/idapro/STARSIDAProgram.cpp diff --git a/.gitattributes b/.gitattributes index 946e40eb..0b79954b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -21,12 +21,14 @@ include/interfaces/abstract/STARSInstruction.h -text include/interfaces/abstract/STARSInstructionID.h -text include/interfaces/abstract/STARSInterface.h -text include/interfaces/abstract/STARSOp.h -text +include/interfaces/abstract/STARSProgram.h -text include/interfaces/abstract/STARSSegment.h -text include/interfaces/abstract/all.h -text include/interfaces/idapro/STARSFunction.h -text include/interfaces/idapro/STARSInstruction.h -text include/interfaces/idapro/STARSInterface.h -text include/interfaces/idapro/STARSOp.h -text +include/interfaces/idapro/STARSProgram.h -text include/interfaces/idapro/STARSSegment.h -text include/interfaces/idapro/all.h -text /install-sh -text @@ -49,10 +51,12 @@ src/base/SMPStaticAnalyzer.cpp -text src/interfaces/Makefile.in -text src/interfaces/abstract/Makefile.in -text src/interfaces/abstract/STARSInstruction.cpp -text +src/interfaces/abstract/STARSProgram.cpp -text src/interfaces/idapro/Makefile.in -text src/interfaces/idapro/STARSFunction.cpp -text src/interfaces/idapro/STARSIDAInstruction.cpp -text src/interfaces/idapro/STARSIDAOp.cpp -text +src/interfaces/idapro/STARSIDAProgram.cpp -text src/interfaces/idapro/STARSInterface.cpp -text src/interfaces/irdb/Makefile.in -text tests/commit/busybox.psexe -text diff --git a/include/base/ProfilerInformation.h b/include/base/ProfilerInformation.h index 5d583563..4a532a06 100644 --- a/include/base/ProfilerInformation.h +++ b/include/base/ProfilerInformation.h @@ -37,7 +37,7 @@ #include <cstddef> -// #include "interfaces/STARSTypes.h" +#include "interfaces/STARSTypes.h" #include "interfaces/SMPDBInterface.h" class SMPProgram; // forward declaration so we can declare a pointer to an SMPProgram @@ -70,33 +70,33 @@ class ProfilerInformation ProfilerInformation(const char *, SMPProgram *); virtual ~ProfilerInformation(); - inline InstructionInformation* GetInfo(ea_t addr) { return the_map[addr]; }; + inline InstructionInformation* GetInfo(STARS_ea_t addr) { return the_map[addr]; }; - std::set<ea_t> GetIndirectCallTargets(ea_t addr) { return indirect_call_map[addr]; }; + std::set<STARS_ea_t> GetIndirectCallTargets(STARS_ea_t addr) { return indirect_call_map[addr]; }; inline MemoryAccessInfo *GetMemoryAccessInfo(void) { return MemProfileInfo; }; inline long GetProfilerAnnotationCount(void) const { return ProfilerAnnotsRead; }; protected: // add type information from profiler about loads - void addProfileInformation(ea_t addr, long long nc, long long pc, long long oc); + void addProfileInformation(STARS_ea_t addr, long long nc, long long pc, long long oc); // add pre-dec info from profiler - void profileAddressingInformation ( ea_t addr, int size, char *type, - char *scope, ea_t the_const, char* field, ea_t real_const); + void profileAddressingInformation ( STARS_ea_t addr, int size, char *type, + char *scope, STARS_ea_t the_const, char* field, STARS_ea_t real_const); - inline void SetInfo(ea_t addr, InstructionInformation* ii) { the_map[addr] = ii; } + inline void SetInfo(STARS_ea_t addr, InstructionInformation* ii) { the_map[addr] = ii; } private: // annotations that are used for numeric type propagation. - std::map<ea_t,InstructionInformation*> the_map; + std::map<STARS_ea_t,InstructionInformation*> the_map; // annotations to spew back out verbatim. std::list<std::string> constant_info; std::string filename; - std::map<ea_t, std::set<ea_t> > indirect_call_map; + std::map<STARS_ea_t, std::set<STARS_ea_t> > indirect_call_map; MemoryAccessInfo *MemProfileInfo; SMPProgram *MyProg; @@ -123,10 +123,10 @@ enum SMPAccessType { class SMPMemoryAccesses { public: // Constructors and destructors. - SMPMemoryAccesses(ea_t addr); + SMPMemoryAccesses(STARS_ea_t addr); // Get functions. - inline ea_t GetAddr(void) const { return address; }; + inline STARS_ea_t GetAddr(void) const { return address; }; inline size_t GetLimit(void) const { return ByteLimit; }; inline SMPAccessType GetAccessType(size_t index) const { return ProfTypes.at(index); @@ -152,7 +152,7 @@ public: void MeetAccessType(size_t index, SMPAccessType TypeSeen); private: - ea_t address; + STARS_ea_t address; size_t ByteLimit; // number of bytes in data object int region; std::vector<SMPAccessType> ProfTypes; // access types seen by profiler, @@ -171,7 +171,7 @@ public: // Analysis methods. void ProcessMemoryAccessAnnotation(FILE *fin, int addr); void InferDataGranularity(void); - bool ComputeNonDirectAccessRegion(ea_t InstAddr, int &ChildOffset, + bool ComputeNonDirectAccessRegion(STARS_ea_t InstAddr, int &ChildOffset, int &RegionSize); // If true is returned, InstAddr makes non-direct // accesses to child object from ChildOffset to // ChildOffset + RegionSize - 1 within parent object. @@ -183,27 +183,27 @@ private: // which implies that the instructions access multiple types (e.g. the // copying or initializing instructions in memset(), memcpy(), and the // customized routines that perform similar functions in an application). - std::set<ea_t> MultipleAccessTypeSet; + std::set<STARS_ea_t> MultipleAccessTypeSet; // Map of instruction addresses to the accesses performed by them. - std::map<ea_t, SMPMemoryAccesses *> InstrAccessMap; + std::map<STARS_ea_t, SMPMemoryAccesses *> InstrAccessMap; // Map of instruction addresses to the object allocation addresses for // all objects accessed by that instruction. // NOTE: For static data, the "allocation address" is the data address. // For heap and stack data, the allocation address is truly the code // address at which the data is allocated. - std::map<ea_t, std::set<ea_t> > InstrObjectMap; + std::map<STARS_ea_t, std::set<STARS_ea_t> > InstrObjectMap; // Inverse mapping: From object allocation addresses to all instruction // addresses that access the object. - std::map<ea_t, std::set<ea_t> > ObjectInstrMap; + std::map<STARS_ea_t, std::set<STARS_ea_t> > ObjectInstrMap; // Map of memory access instruction addresses to the data type number // for the data objects accessed by that code address. - std::map<ea_t, size_t> InstrTypeMap; + std::map<STARS_ea_t, size_t> InstrTypeMap; // Ditto for mapping object allocation addresses to data type ID #. - std::map<ea_t, size_t> ObjectTypeMap; + std::map<STARS_ea_t, size_t> ObjectTypeMap; // Meet of access types for each data object type, with outer index // being the type number from InstrTypeMap and inner index being @@ -212,8 +212,8 @@ private: // Method to recursively associate a data type ID with all instruction // addresses that access objects of that data type. - void AssociateInstrWithType(ea_t InstAddr, size_t TypeID, - std::map<ea_t, std::set<ea_t> >::iterator InstObjIter); + void AssociateInstrWithType(STARS_ea_t InstAddr, size_t TypeID, + std::map<STARS_ea_t, std::set<STARS_ea_t> >::iterator InstObjIter); }; // end of class MemoryAccessInfo #endif diff --git a/include/base/SMPBasicBlock.h b/include/base/SMPBasicBlock.h index de17171e..58197d55 100644 --- a/include/base/SMPBasicBlock.h +++ b/include/base/SMPBasicBlock.h @@ -101,8 +101,8 @@ public: int operator==(const SMPBasicBlock &rhs) const; // Get methods - ea_t GetFirstAddr(void) const; - ea_t GetLastAddr(void); + STARS_ea_t GetFirstAddr(void) const; + STARS_ea_t GetLastAddr(void); inline int GetNumber(void) const { return BlockNum; }; inline SMPBasicBlock *GetThisBlock(void) { return this; }; inline SMPFunction *GetFunc(void) { return MyFunc; }; @@ -145,12 +145,12 @@ public: std::set<STARSOpndTypePtr, LessOp>::iterator GetFirstUpExposed(void); // UpExposedSet.begin() std::set<STARSOpndTypePtr, LessOp>::iterator GetLastUpExposed(void); // UpExposedSet.end() inline size_t GetUpExposedSetSize(void) const { return UpExposedSet.size(); }; - inline std::set<std::pair<STARSOpndTypePtr, ea_t>, LessDefinition>::iterator GetFirstReachesIn(void) { return ReachesInSet.begin(); }; - inline std::set<std::pair<STARSOpndTypePtr, ea_t>, LessDefinition>::iterator GetLastReachesIn(void) { return ReachesInSet.end(); }; - inline std::set<std::pair<STARSOpndTypePtr, ea_t>, LessDefinition>::iterator GetFirstReachesOut(void) { return ReachesOutSet.begin(); }; - inline std::set<std::pair<STARSOpndTypePtr, ea_t>, LessDefinition>::iterator GetLastReachesOut(void) { return ReachesOutSet.end(); }; - inline std::set<std::pair<STARSOpndTypePtr, ea_t>, LessDefinition>::iterator GetFirstDownExposedDefn(void) { return DownExposedDefnSet.begin(); }; - inline std::set<std::pair<STARSOpndTypePtr, ea_t>, LessDefinition>::iterator GetLastDownExposedDefn(void) { return DownExposedDefnSet.end(); }; + inline std::set<std::pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition>::iterator GetFirstReachesIn(void) { return ReachesInSet.begin(); }; + inline std::set<std::pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition>::iterator GetLastReachesIn(void) { return ReachesInSet.end(); }; + inline std::set<std::pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition>::iterator GetFirstReachesOut(void) { return ReachesOutSet.begin(); }; + inline std::set<std::pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition>::iterator GetLastReachesOut(void) { return ReachesOutSet.end(); }; + inline std::set<std::pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition>::iterator GetFirstDownExposedDefn(void) { return DownExposedDefnSet.begin(); }; + inline std::set<std::pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition>::iterator GetLastDownExposedDefn(void) { return DownExposedDefnSet.end(); }; std::set<STARSOpndTypePtr, LessOp>::iterator GetFirstLocalName(void); // LocalNames.begin() std::set<STARSOpndTypePtr, LessOp>::iterator GetLastLocalName(void); // LocalNames.end() std::set<int>::iterator GetFirstDomFrontier(void); // DomFrontier.begin() @@ -164,16 +164,16 @@ public: inline std::map<int, struct STARS_SCCP_Const_Struct>::iterator GetLastLocalConstValueIter(void) { return ConstantLocalDefs.end(); }; #if 0 // Given a USE operand and the address of its instr, return DEF from DU chains or Phi func. - std::set<DefOrUse, LessDefUse>::iterator GetDefFromOpAddr(STARSOpndTypePtr UseOp, ea_t InstAddr, int SSANum); + std::set<DefOrUse, LessDefUse>::iterator GetDefFromOpAddr(STARSOpndTypePtr UseOp, STARS_ea_t InstAddr, int SSANum); #endif - std::set<DefOrUse, LessDefUse>::iterator GetGlobalDefIterFromDefAddr(STARSOpndTypePtr DefOp, ea_t DefAddr); - ea_t GetDefAddrFromUseAddr(STARSOpndTypePtr UseOp, ea_t InstAddr, int SSANum, bool LocalName); // return DefAddr, block # for Phi Defs, or UpExposed address. - ea_t GetUltimateDefAddr(STARSOpndTypePtr UseOp, ea_t InstAddr, int SSANum, bool LocalName); // trace into predecessors if necessary + std::set<DefOrUse, LessDefUse>::iterator GetGlobalDefIterFromDefAddr(STARSOpndTypePtr DefOp, STARS_ea_t DefAddr); + STARS_ea_t GetDefAddrFromUseAddr(STARSOpndTypePtr UseOp, STARS_ea_t InstAddr, int SSANum, bool LocalName); // return DefAddr, block # for Phi Defs, or UpExposed address. + STARS_ea_t GetUltimateDefAddr(STARSOpndTypePtr UseOp, STARS_ea_t InstAddr, int SSANum, bool LocalName); // trace into predecessors if necessary - SMPInstr *FindInstr(ea_t InstAddr); - std::vector<SMPInstr *>::iterator GetInstIterFromAddr(ea_t InstAddr); + SMPInstr *FindInstr(STARS_ea_t InstAddr); + std::vector<SMPInstr *>::iterator GetInstIterFromAddr(STARS_ea_t InstAddr); inline SMPInstr *GetInstFromIndex(size_t VecIndex) const { return InstVec.at(VecIndex); }; - size_t GetIndexFromInstAddr(ea_t InstAddr) const; // Get the InstVec index for the instruction at InstAddr. Assert if not found. + size_t GetIndexFromInstAddr(STARS_ea_t InstAddr) const; // Get the InstVec index for the instruction at InstAddr. Assert if not found. inline sval_t GetOutgoingStackDelta(void) const { return OutgoingStackDelta; }; // Six methods to get values from the maps of local reg/SSA to FG info. @@ -213,13 +213,13 @@ public: inline void AddLiveOut(STARSOpndTypePtr LiveOp) { LiveOutSet.insert(LiveOp); }; inline void AddVarKill(STARSOpndTypePtr KillOp) { KillSet.insert(KillOp); }; inline void AddUpExposed(STARSOpndTypePtr UseOp) { UpExposedSet.insert(UseOp); }; - void AddReachesIn(std::pair<STARSOpndTypePtr, ea_t> ReachInDefn); - void AddReachesOut(std::pair<STARSOpndTypePtr, ea_t> ReachOutDefn); - inline void AddDownExposedDefn(std::pair<STARSOpndTypePtr, ea_t> DEDefn) { DownExposedDefnSet.insert(DEDefn); }; + void AddReachesIn(std::pair<STARSOpndTypePtr, STARS_ea_t> ReachInDefn); + void AddReachesOut(std::pair<STARSOpndTypePtr, STARS_ea_t> ReachOutDefn); + inline void AddDownExposedDefn(std::pair<STARSOpndTypePtr, STARS_ea_t> DEDefn) { DownExposedDefnSet.insert(DEDefn); }; inline void ClearPhiFunctions(void) { PhiFunctions.clear(); }; bool ErasePhi(STARSOpndTypePtr OldOp); // erase() from phi function list - void ErasePred(ea_t FirstBlockAddr); // erase() block starting at FirstBlockAddr from Preds list - void EraseSucc(ea_t FirstBlockAddr); // erase() block starting at FirstBlockAddr from Successors list + void ErasePred(STARS_ea_t FirstBlockAddr); // erase() block starting at FirstBlockAddr from Preds list + void EraseSucc(STARS_ea_t FirstBlockAddr); // erase() block starting at FirstBlockAddr from Successors list bool AddPhi(SMPPhiFunction NewPhi); bool SetPhiDefSSA(STARSOpndTypePtr DefOp, int SSANum); bool SetPhiUseSSA(STARSOpndTypePtr UseOp, size_t index, int SSANum); @@ -271,19 +271,19 @@ public: return (KillSet.end() != KillSet.find(CurrOp)); } bool MDAlreadyKilled(STARSOpndTypePtr Opnd1) const; // Was STARSOpndTypePtr killed by something already in KillSet? - inline bool IsReachesIn(std::pair<STARSOpndTypePtr, ea_t> CurrDefn) const { + inline bool IsReachesIn(std::pair<STARSOpndTypePtr, STARS_ea_t> CurrDefn) const { return (ReachesInSet.end() != ReachesInSet.find(CurrDefn)); } - inline bool IsReachesOut(std::pair<STARSOpndTypePtr, ea_t> CurrDefn) const { + inline bool IsReachesOut(std::pair<STARSOpndTypePtr, STARS_ea_t> CurrDefn) const { return (ReachesOutSet.end() != ReachesOutSet.find(CurrDefn)); } - inline bool IsDownExposedDefn(std::pair<STARSOpndTypePtr, ea_t> CurrDefn) const { + inline bool IsDownExposedDefn(std::pair<STARSOpndTypePtr, STARS_ea_t> CurrDefn) const { return (DownExposedDefnSet.end() != DownExposedDefnSet.find(CurrDefn)); } bool IsLocalName(STARSOpndTypePtr CurrOp) const; bool HasIndirJumpInstruction(void); // true if indirect jump instruction is present bool HasConditionalBranch(void); // true if (last) instruction is conditional branch - bool IsOpDestTruncatedWrite(STARSOpndTypePtr DefOp, int DefSSANum, ea_t DefAddr); // Does DefOp get written out in truncated form (lower bits only)? + bool IsOpDestTruncatedWrite(STARSOpndTypePtr DefOp, int DefSSANum, STARS_ea_t DefAddr); // Does DefOp get written out in truncated form (lower bits only)? // Printing methods void Dump(void); @@ -292,7 +292,7 @@ public: bool AllPredecessorsNumbered(void); bool AllPredecessorsProcessed(void); void DepthFirstMark(void); // Depth-first traversal, mark as processed. - ea_t GetUltimateOperandSource(ea_t UseAddr, STARSOpndTypePtr UseOp, int UseSSANum); // trace through move and Phi defs to some defining operation. + STARS_ea_t GetUltimateOperandSource(STARS_ea_t UseAddr, STARSOpndTypePtr UseOp, int UseSSANum); // trace through move and Phi defs to some defining operation. void Analyze(); void InitKilledExposed(bool UseFP); // Initialize KilledSet and UpExposedSet bool UpdateLiveOut(void); // Iterate once on updating LiveOutSet; return true if changed @@ -301,39 +301,39 @@ public: void SetLocalNames(void); // Fill the LocalNames member set void SSALocalRenumber(void); // Renumber references to local names bool FindLoopHeadsAndTails(void); // Determine if block is loop tail, also set loop header flag for dominating back-edge successor; return false otherwise - bool DoesDefControlLoopFlow(STARSOpndTypePtr DefOp, int DefSSANum, ea_t DefAddr); // Does DefOp/DefSSANum control loop-back or loop-exit branches? + bool DoesDefControlLoopFlow(STARSOpndTypePtr DefOp, int DefSSANum, STARS_ea_t DefAddr); // Does DefOp/DefSSANum control loop-back or loop-exit branches? void FreeReachingDefsMemory(void); // Free memory for reaching defs sets after they are no longer needed void FreeSSAMemory(void); // After SSA #s are in DEFs and USEs, free SSA data structures. void FreeUnusedMemory4(void); // After loop 4 (type inference) in SMPProgram::Analyze(), free memory bool IsGlobalNameUsedLiveIn(STARSOpndTypePtr GlobalOp); // Is GlobalOp used as a LiveIn value anywhere in this block, including as a Phi USE? - bool IsGlobalRegDead(ea_t InstAddr, STARSOpndTypePtr Operand, unsigned int RegIndex); // Is global reg dead at InstAddr? - bool IsRegDead(ea_t InstAddr, uint16 RegNo); // Is local reg dead at InstAddr? + bool IsGlobalRegDead(STARS_ea_t InstAddr, STARSOpndTypePtr Operand, unsigned int RegIndex); // Is global reg dead at InstAddr? + bool IsRegDead(STARS_ea_t InstAddr, uint16 RegNo); // Is local reg dead at InstAddr? void MarkDeadRegs(void); // Find dead registers for each mmStrata-instrumented instruction - bool IsDefDead(ea_t DefAddr, STARSOpndTypePtr DefOp); // Does DefOp at DefAddr never get used? - bool AreFlagsLiveAfterInst(ea_t InstAddr, std::set<int> &LiveFlagRegs); // Return true and produce set if any flags are live out of inst at InstAddr. - bool IsDefInvolvedInAddition(ea_t DefAddr, STARSOpndTypePtr DefOp, ea_t &AdditionAddr); // true if DefOp at DefAddr is used in or redefined by addition; pass back AdditionAddr - bool IsUseCopiedAndShiftedRight(STARSOpndTypePtr UseOp, ea_t UseAddr); // Does a copy of UseOp get shifted right in this block? - bool DoesDefReachBlockEnd(ea_t DefAddr, STARSOpndTypePtr DefOp, int DefSSANum, std::set<int> &NonEscapingRegisterHashes); // Does value of DefOp/DefSSANum reach block end in any DEF at all? - bool IsDefOnlyUsedAsAddressReg(ea_t DefAddr, STARSOpndTypePtr DefOp, size_t LoopNum, size_t &AddrUseCounter, SMPOperandType &MemType); // DefOp/DefSSANum is only used in LoopNum (outside of DefAddr) as address reg or Phi USE - bool IsDefUsedInLoopCompareAndBranch(ea_t DefAddr, STARSOpndTypePtr DefOp, int DefSSANum, bool &Signed); // Is DefOp/DefAddr used in a loop back edge compare-and-branch? - bool PropagateLocalDefType(STARSOpndTypePtr DefOp, SMPOperandType DefType, ea_t DefAddr, int SSANum, bool IsMemOp, bool PointerOverride = false); // to all uses - bool InferLocalDefType(STARSOpndTypePtr DefOp, unsigned int LocIndex, ea_t DefAddr); // Can DEF type be inferred from all USEs? - void InferGlobalDefType(STARSOpndTypePtr DefOp, int SSANum, ea_t DefAddr, bool &FoundNumeric, bool &FoundPointer, + bool IsDefDead(STARS_ea_t DefAddr, STARSOpndTypePtr DefOp); // Does DefOp at DefAddr never get used? + bool AreFlagsLiveAfterInst(STARS_ea_t InstAddr, std::set<int> &LiveFlagRegs); // Return true and produce set if any flags are live out of inst at InstAddr. + bool IsDefInvolvedInAddition(STARS_ea_t DefAddr, STARSOpndTypePtr DefOp, STARS_ea_t &AdditionAddr); // true if DefOp at DefAddr is used in or redefined by addition; pass back AdditionAddr + bool IsUseCopiedAndShiftedRight(STARSOpndTypePtr UseOp, STARS_ea_t UseAddr); // Does a copy of UseOp get shifted right in this block? + bool DoesDefReachBlockEnd(STARS_ea_t DefAddr, STARSOpndTypePtr DefOp, int DefSSANum, std::set<int> &NonEscapingRegisterHashes); // Does value of DefOp/DefSSANum reach block end in any DEF at all? + bool IsDefOnlyUsedAsAddressReg(STARS_ea_t DefAddr, STARSOpndTypePtr DefOp, size_t LoopNum, size_t &AddrUseCounter, SMPOperandType &MemType); // DefOp/DefSSANum is only used in LoopNum (outside of DefAddr) as address reg or Phi USE + bool IsDefUsedInLoopCompareAndBranch(STARS_ea_t DefAddr, STARSOpndTypePtr DefOp, int DefSSANum, bool &Signed); // Is DefOp/DefAddr used in a loop back edge compare-and-branch? + bool PropagateLocalDefType(STARSOpndTypePtr DefOp, SMPOperandType DefType, STARS_ea_t DefAddr, int SSANum, bool IsMemOp, bool PointerOverride = false); // to all uses + bool InferLocalDefType(STARSOpndTypePtr DefOp, unsigned int LocIndex, STARS_ea_t DefAddr); // Can DEF type be inferred from all USEs? + void InferGlobalDefType(STARSOpndTypePtr DefOp, int SSANum, STARS_ea_t DefAddr, bool &FoundNumeric, bool &FoundPointer, bool &FoundUnknown, bool &FoundUninit, SMPOperandType &PtrType); // Can DEF type be inferred from all USEs? Recursive helper for SMPFunction::InferGlobal... bool PropagateGlobalDefType(STARSOpndTypePtr DefOp, SMPOperandType DefType, int SSANum, bool IsMemOp, bool PointerOverride, bool FirstBlock = true); // to all uses bool InferAllPhiDefTypes(void); // infer, propagate to all uses - bool PropagateLocalMetadata(STARSOpndTypePtr UseOp, SMPMetadataType Status, int SSANum, ea_t UseAddr); + bool PropagateLocalMetadata(STARSOpndTypePtr UseOp, SMPMetadataType Status, int SSANum, STARS_ea_t UseAddr); bool FindRedundantLocalMetadata(bool SafeFunc); // consecutive DEFs, same type => redundant bool HasUseAfterIndWrite(STARSOpndTypePtr MemDefOp, std::vector<SMPInstr *>::iterator InstIter, bool &IndWriteSeen, bool &ReDef); // MemDefOp starting at InstIter has DU chain overlapping an indirect mem write void MarkBranchSignedness(void); // If branch at block end is signed/unsigned, propagate to operands that set flags before it. void PropagatePhiFGInfo(void); // Ensure that the Phi DEFs have all the fine grained info from all Phi USEs. - void PropagateBranchSignedness(ea_t DefAddr, STARSOpndTypePtr SearchOp, unsigned short SignMask); + void PropagateBranchSignedness(STARS_ea_t DefAddr, STARSOpndTypePtr SearchOp, unsigned short SignMask); bool PropagateDEFSignedness(void); // propagate DEF signedness to USE if USE has no signedness info. - void MarkUnsignedArgs(ea_t CallAddr, unsigned int ArgPosBits); // backtrack from CallAddr and mark unsigned args based on bitset - void MarkPointerArgs(ea_t CallAddr, unsigned int ArgPosBits); // backtrack from CallAddr and mark POINTER args based on bitset + void MarkUnsignedArgs(STARS_ea_t CallAddr, unsigned int ArgPosBits); // backtrack from CallAddr and mark unsigned args based on bitset + void MarkPointerArgs(STARS_ea_t CallAddr, unsigned int ArgPosBits); // backtrack from CallAddr and mark POINTER args based on bitset bool ComputeReachesInSet(void); // return true if changes were made to the ReachesInSet bool ComputeReachesOutSet(void); // return true if changes were made to the ReachesOutSet - void UpdateDownExposedDefs(STARSOpndTypePtr DefOp, ea_t InstAddr); // Add DefOp, remove previous defs of DefOp that now do not reach the end of the block. + void UpdateDownExposedDefs(STARSOpndTypePtr DefOp, STARS_ea_t InstAddr); // Add DefOp, remove previous defs of DefOp that now do not reach the end of the block. void SCCPEvaluateConstants(enum STARSBranchConst &BranchEval, std::list<std::pair<int, int> > &CFGWorkList, std::list<std::pair<int, int> > &SSAWorkList); // Evaluate constants for all instructions as part of SCCP algorithm at SMPFunction level. void SCCPGlobalPropagationHelper(STARSOpndTypePtr GlobalOp, int DefSSANum, std::vector<STARSBitSet> ExecutedEdgeBitSet, std::list<std::pair<int, int> > &CFGWorkList, std::list<std::pair<int, int> > &SSAWorkList); // Propagate GlobalOp/DefSSANum const value @@ -343,25 +343,25 @@ public: // Find the stack target of a call to memset() and the size in bytes of the memset() region. // If the memset() target is not on the stack, or the size is not a constant, return false. - bool AnalyzeMemSet(ea_t MemSetAddr, STARSOpndTypePtr &MemSetTarget, size_t &MemSetSize, int &SignedOffset, bool &FPRelativeTarget); + bool AnalyzeMemSet(STARS_ea_t MemSetAddr, STARSOpndTypePtr &MemSetTarget, size_t &MemSetSize, int &SignedOffset, bool &FPRelativeTarget); bool IsInfiniteSelfLoop(void); // return true if block loops infinitely to itself bool IsBenignOverflowDEF(STARSOpndTypePtr DefOp, int DefSSANum, size_t DefAddr, bool UnderflowOpcode, int &IdiomCode); // Do we not care if DEF overflowed, due to how it is used? - bool IsDEFWrittenWithTruncation(STARSOpndTypePtr DefOp, int DefSSANum, ea_t DefAddr, ea_t TruncAddr, bool PhiDEF); // Is subword of DefOp written later, before TruncAddr? + bool IsDEFWrittenWithTruncation(STARSOpndTypePtr DefOp, int DefSSANum, STARS_ea_t DefAddr, STARS_ea_t TruncAddr, bool PhiDEF); // Is subword of DefOp written later, before TruncAddr? bool IsBenignTruncationDEF(STARSOpndTypePtr DefOp, int DefSSANum, size_t DefAddr, int &IdiomCode); // Do we not care if DEF overflowed, due to how it is used? - bool IsDefMaskedOrShiftedRight(STARSOpndTypePtr DefOp, int DefSSANum, ea_t DefAddr); // Does DefOp+DefSSANum get subreg masked or right shifted before it gets re-DEFined? + bool IsDefMaskedOrShiftedRight(STARSOpndTypePtr DefOp, int DefSSANum, STARS_ea_t DefAddr); // Does DefOp+DefSSANum get subreg masked or right shifted before it gets re-DEFined? bool IsCriticalSink(STARSOpndTypePtr DefOp, int DefSSANum, std::string &SinkString, bool &FoundAnyCall); // What is ultimate use of DEF that might have integer error? - bool IsStackOpNextUsedWithSignedness(STARSOpndTypePtr StackDefOp, ea_t DefAddr, int SSANum); // Is next use of stack DEF a sign- or zero-extended load? + bool IsStackOpNextUsedWithSignedness(STARSOpndTypePtr StackDefOp, STARS_ea_t DefAddr, int SSANum); // Is next use of stack DEF a sign- or zero-extended load? void SuppressAnnotOnSignChangingAddition(STARSOpndTypePtr DefOp, int DefSSANum, size_t DefAddr); // Find inc/add that makes small negative back into positive void AnalyzePrepForNumericAnnotations(void); // Last-minute prep before emitting numeric annotations // Is DefOp+DefSSANum (from WorkList head) at DefAddr used as address reg or as source operand in memory write? - bool IsDefUsedInMemWrite(std::list<std::pair<std::pair<STARSOpndTypePtr, int>, ea_t> > &WorkList, STARSOpndTypePtr DefOp, int DefSSANum, ea_t DefAddr); + bool IsDefUsedInMemWrite(std::list<std::pair<std::pair<STARSOpndTypePtr, int>, STARS_ea_t> > &WorkList, STARSOpndTypePtr DefOp, int DefSSANum, STARS_ea_t DefAddr); - sval_t ComputeStackAdjustmentAfterCall(ea_t CallAddr); // find stack pointer adjustment code after call, return stack delta or zero + sval_t ComputeStackAdjustmentAfterCall(STARS_ea_t CallAddr); // find stack pointer adjustment code after call, return stack delta or zero private: // Data - ea_t FirstAddr; + STARS_ea_t FirstAddr; int BlockNum; // Number for block ordering algorithms int LoopHeaderNumber; // Number of block that is loop header for this block SMPFunction *MyFunc; // function containing this block @@ -389,7 +389,7 @@ private: #endif std::vector<SMPInstr *> InstVec; //NOTE: Copies of pointers from SMPFunction::Instrs. - std::map<ea_t, size_t> AddrInstMap; // map InstAddr to InstVec index. + std::map<STARS_ea_t, size_t> AddrInstMap; // map InstAddr to InstVec index. std::list<SMPBasicBlock *> Predecessors; std::list<SMPBasicBlock *> Successors; // Four sets used in live variable analysis @@ -398,9 +398,9 @@ private: std::set<STARSOpndTypePtr, LessOp> LiveOutSet; // Live-Out variables in this block std::set<STARSOpndTypePtr, LessOp> LiveInSet; // contribution to predecessor's live-out iteration // Three sets used in reaching definitions analysis - std::set<std::pair<STARSOpndTypePtr, ea_t>, LessDefinition> ReachesInSet; // definitions live on entry to block - std::set<std::pair<STARSOpndTypePtr, ea_t>, LessDefinition> ReachesOutSet; // definitions live on exit from block, either passing through or DEFed inside block - std::set<std::pair<STARSOpndTypePtr, ea_t>, LessDefinition> DownExposedDefnSet; // definitions within block that are live on exit + std::set<std::pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition> ReachesInSet; // definitions live on entry to block + std::set<std::pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition> ReachesOutSet; // definitions live on exit from block, either passing through or DEFed inside block + std::set<std::pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition> DownExposedDefnSet; // definitions within block that are live on exit // SSA data structures std::set<int> DomFrontier; // Dominance frontier for block, as set of RPO block numbers std::set<SMPPhiFunction, LessPhi> PhiFunctions; // SSA incoming edge phi functions @@ -428,7 +428,7 @@ private: std::set<SMPPhiFunction, LessPhi>::iterator InferPhiDefType(std::set<SMPPhiFunction, LessPhi>::iterator DefPhi, bool &changed); // infer, propagate to all uses #if STARS_BUILD_DEF_USE_CHAINS unsigned int GetLocalDUIndex(STARSOpndTypePtr DefOp, int SSANum); - unsigned int GetGlobalDUIndex(STARSOpndTypePtr DefOp, ea_t DefAddr); + unsigned int GetGlobalDUIndex(STARSOpndTypePtr DefOp, STARS_ea_t DefAddr); #endif bool UseHasCriticalSink(STARSOpndTypePtr DefOp, int DefSSANum, STARSOpndTypePtr DefOp2, int DefSSANum2, std::string &SinkString, bool &FoundAnyCall); // DefOp or DefOp2 is passed as arg to critical system or lib call bool IsBranchSignednessUnreliable(void); // Is branch signedness misleading due to odd code generation idiom or hand coding? diff --git a/include/base/SMPDataFlowAnalysis.h b/include/base/SMPDataFlowAnalysis.h index 883ed7e9..cdd60b73 100644 --- a/include/base/SMPDataFlowAnalysis.h +++ b/include/base/SMPDataFlowAnalysis.h @@ -19,7 +19,7 @@ * e-mail: jwd@virginia.com * URL : http://www.cs.virginia.edu/ * - * Additional copyrights 2010, 2011 by Zephyr Software LLC + * Additional copyrights 2010, 2011, 2012, 2013, 2014, 2015 by Zephyr Software LLC * e-mail: {clc,jwd}@zephyr-software.com * URL : http://www.zephyr-software.com/ * @@ -43,9 +43,9 @@ #include <cstddef> #include <cstdint> -#include <pro.h> -#include <ua.hpp> -#include "intel.hpp" +// #include <pro.h> +// #include <ua.hpp> +// #include <intel.hpp> #include "interfaces/SMPDBInterface.h" #include "interfaces/abstract/all.h" @@ -73,9 +73,6 @@ class STARSBitSet; // an indirect memory access or other potential alias in the DEF-USE chain? #define SMP_PROPAGATE_MEM_TYPES 1 -// A maximum string length for use when SMP needs to use less space than -// the IDA Pro MAXSTR, which is 1024 at present. -#define MAXSMPSTR 256 // Instruction disassembly text. #define MAXSMPDISASMSTR 192 // Global var names @@ -88,6 +85,9 @@ class STARSBitSet; // Value for an SSA subscript number before it is initialized by SSA renaming. #define SMP_SSA_UNINIT (-1) +// Bit masks for extracting bits from a STARSBitSet unsigned char. +extern const unsigned char STARSBitMasks[8]; + // Map register number to a string for printing or annotations. extern const char *RegNames[]; const char *MDGetRegName(STARSOpndTypePtr RegOp); // Distinguishes subword regs from their parent regs @@ -99,50 +99,50 @@ unsigned char GetRegSize(uint16_t RegNum); // Define a machine-dependent constant for the EFLAGS register in the x86 architecture. // IDA Pro distinguishes among four different flag bits; we aggregate them for most purposes, // but separate them for SCCP (Sparse Conditional Constant Propagation). -#define X86_FLAGS_REG R_efl +#define X86_FLAGS_REG STARS_x86_R_efl #define MD_FLAGS_REG X86_FLAGS_REG // Define various important registers for machine-dependent use. -#define X86_CARRY_FLAG R_cf +#define X86_CARRY_FLAG STARS_x86_R_cf #define MD_CARRY_FLAG X86_CARRY_FLAG -#define X86_ZERO_FLAG R_zf +#define X86_ZERO_FLAG STARS_x86_R_zf #define MD_ZERO_FLAG X86_ZERO_FLAG -#define X86_SIGN_FLAG R_sf +#define X86_SIGN_FLAG STARS_x86_R_sf #define MD_SIGN_FLAG X86_SIGN_FLAG -#define X86_OVERFLOW_FLAG R_of +#define X86_OVERFLOW_FLAG STARS_x86_R_of #define MD_OVERFLOW_FLAG X86_OVERFLOW_FLAG -#define X86_INSTRUCTION_POINTER_REG R_ip +#define X86_INSTRUCTION_POINTER_REG STARS_x86_R_ip #define MD_INSTRUCTION_POINTER_REG X86_INSTRUCTION_POINTER_REG -#define X86_STACK_POINTER_REG R_sp +#define X86_STACK_POINTER_REG STARS_x86_R_sp #define MD_STACK_POINTER_REG X86_STACK_POINTER_REG -#define X86_FRAME_POINTER_REG R_bp +#define X86_FRAME_POINTER_REG STARS_x86_R_bp #define MD_FRAME_POINTER_REG X86_FRAME_POINTER_REG -#define X86_RETURN_VALUE_REG R_ax +#define X86_RETURN_VALUE_REG STARS_x86_R_ax #define MD_RETURN_VALUE_REG X86_RETURN_VALUE_REG -#define FIRST_X86_SUBWORD_REG R_al -#define LAST_X86_SUBWORD_REG R_dil +#define FIRST_X86_SUBWORD_REG STARS_x86_R_al +#define LAST_X86_SUBWORD_REG STARS_x86_R_dil -#define X86_FIRST_FP_STACK_REG R_st0 +#define X86_FIRST_FP_STACK_REG STARS_x86_R_st0 #define MD_FIRST_FP_STACK_REG X86_FIRST_FP_STACK_REG -#define X86_LAST_REG_NO R_last +#define X86_LAST_REG_NO STARS_x86_R_last #define MD_LAST_REG_NO X86_LAST_REG_NO -#define X86_CALL_INSTRUCTION NN_call +#define X86_CALL_INSTRUCTION STARS_NN_call #define MD_CALL_INSTRUCTION X86_CALL_INSTRUCTION -#define X86_MOVE_INSTRUCTION NN_mov +#define X86_MOVE_INSTRUCTION STARS_NN_mov #define MD_MOVE_INSTRUCTION X86_MOVE_INSTRUCTION -#define X86_DEFAULT_RETURN_ADDRESS_SIZE STARS_ISA_Bytewidth +#define X86_DEFAULT_RETURN_ADDRESS_SIZE global_STARS_program->GetSTARS_ISA_Bytewidth() #define MD_DEFAULT_RETURN_ADDRESS_SIZE X86_DEFAULT_RETURN_ADDRESS_SIZE #define X86_BINARY_NOP_INSTRUCTION 0x90 @@ -159,6 +159,15 @@ unsigned char GetRegSize(uint16_t RegNum); const int STARS_VEXPR = 0x40; // IDA Pro vexpr() was true on inst containing current op_t const int STARS_VSIB = 0x20; // IDA Pro is_vsib() was true on inst containing current op_t +// Clone operands that will be changed (e.g. normalized) later. Subword regs will be normalized to full-word regs +// in DEF and USE and dataflow analysis sets, and stack accesses will be normalized in these same sets to be relative +// to the incoming stack pointer value. These normalizations are needed for proper SSA form, e.g. we need to know that +// changes to a subword reg also change the full-word reg, and [stack_ptr+0] and [stack_ptr+8] could be the same stack +// location in a procedure if stack_ptr changes value. The deep-copied clone can be changed without affecting the +// original operand. If we are only canonicalizing subword regs to prepare for a USE or DEF search, we use +// CloneIfSubwordReg(). If we are placing operands in dataflow sets and would also later need to normalize stack accesses +// in addition to normalizing subword regs, we call CloneIfNecessary(). + // If CurrOp would change when reg is canonicalized, then return CurrOp->clone(), else return CurrOp; STARSOpndTypePtr CloneIfSubwordReg(STARSOpndTypePtr CurrOp); @@ -169,7 +178,7 @@ STARSOpndTypePtr CloneIfNecessary(STARSOpndTypePtr CurrOp, bool UseFP); void PrintDefUse(ulong feature, int OpNum); void PrintSIB(STARSOpndTypePtr Opnd); void AnnotPrintSIB(STARSOpndTypePtr Opnd, bool HasOffset, FILE *OutFile); -void SPARKAnnotPrintSIB(STARSOpndTypePtr Opnd, bool HasOffset, FILE *OutFile, uint16 SegReg, bool UseFP); +void SPARKAnnotPrintSIB(STARSOpndTypePtr Opnd, bool HasOffset, FILE *OutFile, uint16_t SegReg, bool UseFP); void PrintOneOperand(STARSOpndTypePtr Opnd, uint32_t features, int OpNum); void PrintListOperand(STARSOpndTypePtr Opnd, int SSANum = SMP_SSA_UNINIT); void PrintOperand(STARSOpndTypePtr Opnd); @@ -178,7 +187,7 @@ void PrintOperand(STARSOpndTypePtr Opnd); void AnnotPrintOperand(STARSOpndTypePtr Opnd, FILE *OutFile); // Print opcode string. -void PrintOpcode(uint16 opcode, FILE *OutFile); +void PrintOpcode(uint16_t opcode, FILE *OutFile); // MACHINE DEPENDENT: Could operand be an indirect memory access? bool MDIsIndirectMemoryOpnd(STARSOpndTypePtr CurrOp, bool UseFP); @@ -187,7 +196,7 @@ bool MDIsIndirectMemoryOpnd(STARSOpndTypePtr CurrOp, bool UseFP); int MD_STARS_sib_base(const STARSOpndTypePtr &x); // MACHINE DEPENDENT: Extract index reg from SIB byte of operand. -regnum_t MD_STARS_sib_index(const STARSOpndTypePtr &x); +short MD_STARS_sib_index(const STARSOpndTypePtr &x); // Is CurrOp a memory operand? bool IsMemOperand(STARSOpndTypePtr CurrOp); @@ -211,7 +220,7 @@ bool MDIsStackPtrReg(int RegNumber, bool UseFP); bool MDIsCallerSavedReg(STARSOpndTypePtr CurrOp); // MACHINE DEPENDENT: Get base and index registers and displacement/addr from operand. -void MDExtractAddressFields(STARSOpndTypePtr MemOp, int &BaseReg, int &IndexReg, uint16_t &Scale, ea_t &Offset); +void MDExtractAddressFields(STARSOpndTypePtr MemOp, int &BaseReg, int &IndexReg, uint16_t &Scale, STARS_ea_t &Offset); // MACHINE DEPENDENT: Is operand type a known type that we want to analyze? bool MDKnownOperandType(STARSOpndTypePtr TempOp); @@ -249,7 +258,7 @@ bool IsEqOpIgnoreBitwidth(STARSOpndTypePtr Opnd1, STARSOpndTypePtr Opnd2); // Comparison class to use in sorted containers of IDA Pro addresses (type ea_t). class LessAddr { public: - bool operator()(const ea_t &Addr1, const ea_t &Addr2) const { + bool operator()(const STARS_ea_t &Addr1, const STARS_ea_t &Addr2) const { return (Addr1 < Addr2); } }; @@ -260,7 +269,7 @@ public: // the HashGlobalNameAndSSA() function. class LessSearchOperand { public: - bool operator()(const std::pair<ea_t, int> &SearchPair1, const std::pair<ea_t, int> &SearchPair2) const { + bool operator()(const std::pair<STARS_ea_t, int> &SearchPair1, const std::pair<STARS_ea_t, int> &SearchPair2) const { return ((SearchPair1.first < SearchPair2.first) || ((SearchPair1.first == SearchPair2.first) && (SearchPair1.second < SearchPair2.second))); } @@ -319,10 +328,10 @@ public: typedef std::set<STARSOpndTypePtr, STARSLessOp> STARSOpndSet; -// MACHINE DEPENDENT: comparison class to permit sorting of definitions, each of which is a std::pair<STARSOpndTypePtr, ea_t>. +// MACHINE DEPENDENT: comparison class to permit sorting of definitions, each of which is a std::pair<STARSOpndTypePtr, STARS_ea_t>. class LessDefinition { public: - bool operator()(const std::pair<STARSOpndTypePtr, ea_t> &Defn1, const std::pair<STARSOpndTypePtr, ea_t> &Defn2) const { + bool operator()(const std::pair<STARSOpndTypePtr, STARS_ea_t> &Defn1, const std::pair<STARSOpndTypePtr, STARS_ea_t> &Defn2) const { STARSOpndTypePtr Opnd1 = Defn1.first; STARSOpndTypePtr Opnd2 = Defn2.first; if (IsEqOp(Opnd1, Opnd2)) { @@ -371,10 +380,10 @@ public: } // end operator }; // end class LessDefinition -// MACHINE DEPENDENT: comparison class to permit sorting of stack delta definitions, each of which is a std::pair<STARSOpndTypePtr, std::pair<ea_t, sval_t> >. +// MACHINE DEPENDENT: comparison class to permit sorting of stack delta definitions, each of which is a std::pair<STARSOpndTypePtr, std::pair<STARS_ea_t, sval_t> >. class LessStackDeltaCopy { public: - bool operator()(const std::pair<STARSOpndTypePtr, std::pair<ea_t, sval_t> > &DeltaCopy1, const std::pair<STARSOpndTypePtr, std::pair<ea_t, sval_t> > &DeltaCopy2) const { + bool operator()(const std::pair<STARSOpndTypePtr, std::pair<STARS_ea_t, STARS_sval_t> > &DeltaCopy1, const std::pair<STARSOpndTypePtr, std::pair<STARS_ea_t, sval_t> > &DeltaCopy2) const { STARSOpndTypePtr Opnd1 = DeltaCopy1.first; STARSOpndTypePtr Opnd2 = DeltaCopy2.first; if (IsEqOp(Opnd1, Opnd2)) { @@ -426,7 +435,7 @@ public: std::size_t GetOpDataSize(STARSOpndTypePtr DataOp); // Get the IDA Pro register size (dtyp) field -char GetRegDtyp(uint16 RegNum, bool Has64BitOpnds); +char GetRegDtyp(uint16_t RegNum, bool Has64BitOpnds); // SMP will operate on a doubly linked list of instructions, which // will be grouped into basic blocks. We will include info about each @@ -582,10 +591,10 @@ struct FineGrainedInfo { #define MD_NORMAL_BITWIDTH_MASK FG_MASK_BITWIDTH_32 // Return one of the bit width masks above for the current operand. -unsigned short ComputeOperandBitWidthMask(STARSOpndTypePtr CurrOp, size_t DataSize); +unsigned short ComputeOperandBitWidthMask(STARSOpndTypePtr CurrOp, std::size_t DataSize); // Compute largest bit width from a SignMiscInfo bit mask. -size_t LargestBitWidthFromMask(unsigned short WidthTypeInfo); +std::size_t LargestBitWidthFromMask(unsigned short WidthTypeInfo); // Map the two sign bits above into four strings for annotation output. extern const char *SignednessStrings[4]; @@ -593,32 +602,20 @@ extern const char *SignednessStrings[4]; // that can overflow silently without setting any flags. extern const char *LeaSignednessStrings[4]; -// We maintain a list of the caller-saved regs for the current binary's ABI. -// This differs from 32-bit to 64-bit x86 binaries, as well as across other ISAs. -void MDInitializeCallerSavedRegs(void); -std::list<uint16>::iterator GetFirstCallerSavedReg(void); -std::list<uint16>::iterator GetLastCallerSavedReg(void); - -// We maintain a list of the argument-passing regs for the current binary's ABI. -// This differs from 32-bit to 64-bit x86 binaries, as well as across other ISAs. -// The list is in order of argument position number. For x86-64, this means EDI, -// ESI, EDX, ECX, R8, R9. -void MDInitializeArgumentRegs(void); -std::list<uint16>::iterator GetFirstArgumentReg(void); -std::list<uint16>::iterator GetLastArgumentReg(void); - class DisAsmString { public: DisAsmString(void); - char *GetDisAsm(ea_t InstAddr, bool MarkerInst = false); - void SetMarkerInstText(ea_t InstAddr); + char *GetDisAsm(STARS_ea_t InstAddr, bool MarkerInst = false); + void SetMarkerInstText(STARS_ea_t InstAddr); private: - ea_t CurrAddr; // cached string corresponds to this instruction address + STARS_ea_t CurrAddr; // cached string corresponds to this instruction address STARS_ssize_t StringLen; // string length returned by IDA Pro char CachedDisAsm[MAXSMPDISASMSTR]; }; +extern DisAsmString DisAsmText; + // Masks to set bits to use as booleans1 in DefOrUse. #define DEFORUSE_SET_INDIRECT_WRITE 0x01 #define DEFORUSE_SET_NO_TRUNCATION 0x02 @@ -705,7 +702,7 @@ public: ~DefOrUseSet(); // Get methods - inline size_t GetSize(void) const { return (size_t) Refs.size(); }; + inline std::size_t GetSize(void) const { return (std::size_t) Refs.size(); }; inline std::set<DefOrUse, LessDefUse>::iterator GetFirstRef(void) { return Refs.begin(); }; inline std::set<DefOrUse, LessDefUse>::iterator GetLastRef(void) { return Refs.end(); }; std::set<DefOrUse, LessDefUse>::iterator FindRef(STARSOpndTypePtr SearchOp); @@ -746,18 +743,18 @@ public: DefOrUseList(void); // Get methods - DefOrUse GetRef(size_t index) const; - inline size_t GetSize(void) const { return (size_t) Refs.size(); }; - inline DefOrUse *GetRefNum(size_t index) { return &Refs[index]; }; + DefOrUse GetRef(std::size_t index) const; + inline std::size_t GetSize(void) const { return (std::size_t) Refs.size(); }; + inline DefOrUse *GetRefNum(std::size_t index) { return &Refs[index]; }; inline std::vector<DefOrUse>::iterator GetFirstRef(void) { return Refs.begin(); }; inline std::vector<DefOrUse>::iterator GetLastRef(void) { return Refs.end(); }; - inline int GetRefSSANum(size_t index) const { return Refs.at(index).GetSSANum(); }; - inline SMPOperandType GetRefType(size_t index) const { return Refs.at(index).GetType(); }; + inline int GetRefSSANum(std::size_t index) const { return Refs.at(index).GetSSANum(); }; + inline SMPOperandType GetRefType(std::size_t index) const { return Refs.at(index).GetType(); }; // Set methods void SetRef(STARSOpndTypePtr Ref, SMPOperandType Type = UNINIT, int SSASub = SMP_SSA_UNINIT); - void SetSSANum(size_t index, int NewSSASub); - void SetType(size_t index, SMPOperandType Type, const SMPInstr* Instr); + void SetSSANum(std::size_t index, int NewSSASub); + void SetType(std::size_t index, SMPOperandType Type, const SMPInstr* Instr); inline void clear(void) { Refs.clear(); return; }; // Printing methods void Dump(void) const; @@ -775,25 +772,25 @@ public: // Get methods inline int GetIndex(void) const { return index; }; - inline size_t GetPhiListSize(void) const { return this->SubscriptedOps.GetSize(); }; + inline std::size_t GetPhiListSize(void) const { return this->SubscriptedOps.GetSize(); }; DefOrUse GetDefCopy(void) const; - inline DefOrUse GetPhiRef(size_t i) const { return this->SubscriptedOps.GetRef(i); }; - inline DefOrUse *GetRefNum(size_t index) { return SubscriptedOps.GetRefNum(index); }; + inline DefOrUse GetPhiRef(std::size_t i) const { return this->SubscriptedOps.GetRef(i); }; + inline DefOrUse *GetRefNum(std::size_t index) { return SubscriptedOps.GetRefNum(index); }; inline std::vector<DefOrUse>::iterator GetFirstOp(void) { return SubscriptedOps.GetFirstRef(); }; inline std::vector<DefOrUse>::iterator GetLastOp(void) { return SubscriptedOps.GetLastRef(); }; inline STARSOpndTypePtr GetAnyOp(void) const { return DefName.GetOp(); }; inline int GetDefSSANum(void) const { return DefName.GetSSANum(); }; - inline int GetUseSSANum(size_t index) const { return SubscriptedOps.GetRefSSANum(index); }; + inline int GetUseSSANum(std::size_t index) const { return SubscriptedOps.GetRefSSANum(index); }; inline SMPOperandType GetDefType(void) const { return DefName.GetType(); }; - inline SMPOperandType GetUseType(size_t index) const { return SubscriptedOps.GetRefType(index); }; + inline SMPOperandType GetUseType(std::size_t index) const { return SubscriptedOps.GetRefType(index); }; inline SMPMetadataType GetDefMetadata(void) const { return DefName.GetMetadataStatus(); }; // Set methods void PushBack(DefOrUse Ref); // add inputs to phi function void SetSSADef(int NewSSASub); - void SetSSARef(size_t index, int NewSSASub); + void SetSSARef(std::size_t index, int NewSSASub); void SetDefType(SMPOperandType Type, const SMPInstr* instr); - void SetRefType(size_t index, SMPOperandType Type, const SMPInstr* instr); + void SetRefType(std::size_t index, SMPOperandType Type, const SMPInstr* instr); void SetDefMetadata(SMPMetadataType Status); // Query methods @@ -823,32 +820,32 @@ public: // n, offb, and offo. This function extracts an unsigned int from these three 8-bit // fields. unsigned int ExtractGlobalIndex(STARSOpndTypePtr GlobalOp); -void SetGlobalIndex(STARSOpndTypePtr TempOp, size_t index); +void SetGlobalIndex(STARSOpndTypePtr TempOp, std::size_t index); class SMPDefUseChain { public: // Constructors SMPDefUseChain(void); - SMPDefUseChain(STARSOpndTypePtr Name, ea_t Def = BADADDR); + SMPDefUseChain(STARSOpndTypePtr Name, STARS_ea_t Def = BADADDR); // Get methods inline STARSOpndTypePtr GetName(void) const { return SSAName; }; - inline ea_t GetDef(void) const { return (ea_t) RefInstrs.at(0); }; - inline ea_t GetUse(size_t index) const { return (ea_t) RefInstrs.at(index + 1); }; - inline ea_t GetLastUse(void) const { + inline STARS_ea_t GetDef(void) const { return (STARS_ea_t) RefInstrs.at(0); }; + inline STARS_ea_t GetUse(std::size_t index) const { return (STARS_ea_t) RefInstrs.at(index + 1); }; + inline STARS_ea_t GetLastUse(void) const { if (RefInstrs.size() > 1) - return (ea_t) RefInstrs.back(); + return (STARS_ea_t) RefInstrs.back(); else - return (ea_t) BADADDR; + return (STARS_ea_t) BADADDR; }; - inline size_t GetNumUses(void) const { return RefInstrs.size() - 1; }; + inline std::size_t GetNumUses(void) const { return RefInstrs.size() - 1; }; // Query methods. inline bool HasIndirectWrite(void) const { return IndWrite; }; // Set methods void SetName(STARSOpndTypePtr Name); - void SetDef(ea_t Def); - void PushUse(ea_t Use); + void SetDef(STARS_ea_t Def); + void PushUse(STARS_ea_t Use); void SetIndWrite(bool IndMemWrite); // Printing methods void Dump(int SSANum = (-1)) const; @@ -868,17 +865,17 @@ class SMPDUChainArray { public: // Constructor SMPDUChainArray(void); - SMPDUChainArray(STARSOpndTypePtr Name, ea_t FirstAddrMinusOne); + SMPDUChainArray(STARSOpndTypePtr Name, STARS_ea_t FirstAddrMinusOne); // Get methods. inline STARSOpndTypePtr GetName(void) const { return SSAName; }; - inline ea_t GetDef(int SSANum) const { return BaseAddr + DUChains.at(SSANum).GetDef(); }; - inline ea_t GetUse(int SSANum, size_t index) const { return BaseAddr + DUChains.at(SSANum).GetUse(index); }; - ea_t GetLastUse(int SSANum) const; - inline size_t GetNumUses(int SSANum) const { return DUChains.at(SSANum).GetNumUses(); }; - inline size_t GetSize(void) const { return DUChains.size(); }; + inline STARS_ea_t GetDef(int SSANum) const { return BaseAddr + DUChains.at(SSANum).GetDef(); }; + inline STARS_ea_t GetUse(int SSANum, std::size_t index) const { return BaseAddr + DUChains.at(SSANum).GetUse(index); }; + STARS_ea_t GetLastUse(int SSANum) const; + inline std::size_t GetNumUses(int SSANum) const { return DUChains.at(SSANum).GetNumUses(); }; + inline std::size_t GetSize(void) const { return DUChains.size(); }; // Set methods. - void SetName(STARSOpndTypePtr Name, ea_t FirstAddrMinusOne); - inline void PushUse(int SSANum, ea_t UseAddr) { DUChains.at(SSANum).PushUse(UseAddr - BaseAddr); }; + void SetName(STARSOpndTypePtr Name, STARS_ea_t FirstAddrMinusOne); + inline void PushUse(int SSANum, STARS_ea_t UseAddr) { DUChains.at(SSANum).PushUse(UseAddr - BaseAddr); }; inline void PushChain(SMPDefUseChain NewChain) { DUChains.push_back(NewChain); }; inline void SetIndWrite(int SSANum, bool NewFlag) { DUChains.at(SSANum).SetIndWrite(NewFlag); }; // Query methods @@ -889,7 +886,7 @@ private: // Data std::vector<SMPDefUseChain> DUChains; // indexed by SSA number for local chains, by chain # for global chains STARSOpndTypePtr SSAName; // What variable is used in all chains in the array? - ea_t BaseAddr; // one less than first addr in basic block + STARS_ea_t BaseAddr; // one less than first addr in basic block }; // end class SMPDUChainArray class SMPCompleteDUChains { @@ -907,43 +904,38 @@ public: // Constructors STARSBitSet(); // Get methods - bool GetBit(size_t BitIndex) const; + bool GetBit(std::size_t BitIndex) const; // Set methods - void AllocateBits(size_t Size); // allocate Size bits, initialized to zero. - void SetBit(size_t BitIndex); - void ResetBit(size_t BitIndex); + void AllocateBits(std::size_t Size); // allocate Size bits, initialized to zero. + void SetBit(std::size_t BitIndex); + void ResetBit(std::size_t BitIndex); // Query methods bool IsAnyBitSet(void) const; // Returns false if all bits are zero, true otherwise. private: // Data members. - size_t BitLimit; // number of bits + std::size_t BitLimit; // number of bits std::vector<unsigned char> STARSBits; // Methods }; // end class STARSBitSet // Initialization routine for DFA category. -extern SMPitype DFACategory[]; -void InitDFACategory(void); +extern SMPitype DFACategory[STARS_NN_last + 1]; // Initialization routine for Type category. -extern int SMPTypeCategory[]; -void InitTypeCategory(void); +extern int SMPTypeCategory[STARS_NN_last + 1]; // Initializations for CPU flags DEF/USE. -extern bool SMPDefsFlags[]; -extern bool SMPUsesFlags[]; -void InitSMPDefsFlags(void); -void InitSMPUsesFlags(void); +extern bool SMPDefsFlags[STARS_NN_last + 1]; +extern bool SMPUsesFlags[STARS_NN_last + 1]; // Initialize the FG info for the return register from any library function // whose name implies that we know certain return values (e.g. atoi() returns // a signed integer, while strtoul() returns an unsigned long). void GetLibFuncFGInfo(std::string FuncName, struct FineGrainedInfo &InitFGInfo); -// Initialize the lookup maps that are used to define the FG info that can -// be inferred from a library function name. -void InitLibFuncFGInfoMaps(void); +// Map system or library call name to FG info about its return value. +extern std::map<std::string, struct FineGrainedInfo> ReturnRegisterTypeMap; // Init map of system or library call name to the annotation substring that // guides saturating arithmetic or other continuation policies in diff --git a/include/base/SMPFunction.h b/include/base/SMPFunction.h index 25eda502..1e6daed9 100644 --- a/include/base/SMPFunction.h +++ b/include/base/SMPFunction.h @@ -56,12 +56,12 @@ class STARS_IDA_Function_t; // NOTE: When we start handling different calling conventions beyond // the gcc model, we will have to make this a variable that gets // initialized. -#define CALLING_CONVENTION_DEFAULT_FUNCTION_STACK_DELTA STARS_ISA_Bytewidth +#define CALLING_CONVENTION_DEFAULT_FUNCTION_STACK_DELTA global_STARS_program->GetSTARS_ISA_Bytewidth() // What is the default stack delta from function entry to stack frame allocation? // This would only be used in resolving phase-ordering problems, and should be // eliminated if possible. -#define CALLING_CONVENTION_DEFAULT_PREFRAMEALLOC_STACK_DELTA (-STARS_ISA_Bytewidth) +#define CALLING_CONVENTION_DEFAULT_PREFRAMEALLOC_STACK_DELTA (-(global_STARS_program->GetSTARS_ISA_Bytewidth())) // What default value should we assign to alloca stack frame allocations? #define STARS_DEFAULT_ALLOCA_SIZE -32 @@ -164,8 +164,8 @@ public: inline SMPProgram *GetProg(void) const { return Program; }; inline const char *GetFuncName(void) const { SMP_get_func_name(GetFirstFuncAddr(), StaticFuncName, MAXSMPSTR-1); return StaticFuncName; }; STARS_Function_t *GetFuncInfo(void) const; - inline ea_t GetFirstFuncAddr(void) const { return FirstEA; }; - uint16_t GetJumpToFollowNodeCounter(ea_t InstAddr) const; + inline STARS_ea_t GetFirstFuncAddr(void) const { return FirstEA; }; + uint16_t GetJumpToFollowNodeCounter(STARS_ea_t InstAddr) const; inline long GetTypedDefs(void) const { return TypedDefs; }; inline long GetUntypedDefs(void) const { return UntypedDefs; }; inline long GetTypedPhiDefs(void) const { return TypedPhiDefs; }; @@ -178,7 +178,7 @@ public: inline sval_t GetPreAllocationStackPtrDelta(void) const { return PreAllocStackDelta; }; inline sval_t GetFramePtrStackDelta(void) const { return FramePointerStackDelta; }; inline sval_t GetMaxDirectStackAccessDelta(void) const { return MaxDirectStackAccessDelta; }; - inline ea_t GetFirstFrameAllocInstAddr(void) const { return LocalVarsAllocInstr; }; + inline STARS_ea_t GetFirstFrameAllocInstAddr(void) const { return LocalVarsAllocInstr; }; inline STARS_asize_t GetLocalVarsSize(void) const { return LocalVarsSize; }; inline std::set<STARSOpndTypePtr, LessOp>::iterator GetFirstGlobalName(void) { return GlobalNames.begin(); }; inline std::set<STARSOpndTypePtr, LessOp>::iterator GetLastGlobalName(void) { return GlobalNames.end(); }; @@ -195,31 +195,31 @@ public: inline unsigned short GetFastReturnStatus(void) const { return FastReturnStatus; }; // exposing the start address of the function. Used in RecurseAndMark - inline const ea_t GetStartAddr(void) const { return FuncInfo->get_startEA(); }; + inline const STARS_ea_t GetStartAddr(void) const { return FuncInfo->get_startEA(); }; - inline const std::vector<ea_t> GetCallTargets(void) const { return AllCallTargets; }; + inline const std::vector<STARS_ea_t> GetCallTargets(void) const { return AllCallTargets; }; inline std::size_t GetNumCallTargets(void) const { return AllCallTargets.size(); }; - inline ea_t GetCallTargetAddr(std::size_t index) const { return AllCallTargets.at(index); }; + inline STARS_ea_t GetCallTargetAddr(std::size_t index) const { return AllCallTargets.at(index); }; bool GetIsSpeculative() { return IsSpeculative; } inline std::size_t GetNumCallers(void) const { return AllCallSources.size(); }; - bool MDGetFGStackLocInfo(ea_t InstAddr, STARSOpndTypePtr TempOp, struct FineGrainedInfo &FGEntry); + bool MDGetFGStackLocInfo(STARS_ea_t InstAddr, STARSOpndTypePtr TempOp, struct FineGrainedInfo &FGEntry); // Return fine grained stack entry for stack op TempOp from instruction at InstAddr - ea_t GetGlobalDefAddr(STARSOpndTypePtr DefOp, int SSANum); // retrieve from GlobalDefAddrBySSA or return BADADDR + STARS_ea_t GetGlobalDefAddr(STARSOpndTypePtr DefOp, int SSANum); // retrieve from GlobalDefAddrBySSA or return BADADDR int GetBlockNumForPhiDef(STARSOpndTypePtr DefOp, int SSANum); - SMPBasicBlock *GetBlockFromInstAddr(ea_t InstAddr); // retrieve from InstBlockMap or assert + SMPBasicBlock *GetBlockFromInstAddr(STARS_ea_t InstAddr); // retrieve from InstBlockMap or assert std::list<SMPBasicBlock *>::iterator GetBlockIter(SMPBasicBlock *FindBlock); // Find FindBlock in Blocks, return iterator. inline SMPBasicBlock *GetBlockByNum(std::size_t BlockIndex) const { return RPOBlocks.at(BlockIndex); }; inline std::list<SMPBasicBlock *>::iterator GetLastBlock(void) { return Blocks.end(); }; - SMPInstr *GetInstFromAddr(ea_t InstAddr); - ea_t GetFirstUnprocessedCallee(void); // first addr of first callee in AllCallTargets with Processed == false + SMPInstr *GetInstFromAddr(STARS_ea_t InstAddr); + STARS_ea_t GetFirstUnprocessedCallee(void); // first addr of first callee in AllCallTargets with Processed == false inline std::size_t GetNumBlocks(void) const { return Blocks.size(); }; - STARSOpndTypePtr GetNormalizedOperand(ea_t InstAddr, STARSOpndTypePtr RTLop); // Return RTLop if not stack opnd; return normalized RTLop otherwise. + STARSOpndTypePtr GetNormalizedOperand(STARS_ea_t InstAddr, STARSOpndTypePtr RTLop); // Return RTLop if not stack opnd; return normalized RTLop otherwise. inline int GetReturnRegType(uint16 RegNum) const { return ((RegNum < ReturnRegTypes.size()) ? (int) ReturnRegTypes[RegNum] : 0); }; inline struct FineGrainedInfo GetReturnRegFGInfo(uint16 RegNum) const { return ReturnRegFGInfo.at(RegNum); }; inline std::size_t GetReturnRegFGInfoSize(void) const { return ReturnRegFGInfo.size(); }; SMPOperandType GetIncomingRegType(uint16 RegNum); // Get reg type from all call sites. - inline std::map<ea_t, STARSOpndTypePtr>::iterator FindLeaOperand(ea_t addr) { return LeaInstOpMap.find(addr); }; - inline std::map<ea_t, STARSOpndTypePtr>::iterator GetLastLeaOperand(void) { return LeaInstOpMap.end(); }; + inline std::map<STARS_ea_t, STARSOpndTypePtr>::iterator FindLeaOperand(STARS_ea_t addr) { return LeaInstOpMap.find(addr); }; + inline std::map<STARS_ea_t, STARSOpndTypePtr>::iterator GetLastLeaOperand(void) { return LeaInstOpMap.end(); }; inline std::map<int, struct STARS_SCCP_Const_Struct>::iterator FindConstValue(int DefHashValue) { return ConstantDefs.find(DefHashValue); }; inline std::map<int, struct STARS_SCCP_Const_Struct>::iterator GetLastConstValueIter(void) { return ConstantDefs.end(); }; inline int GetLoopType(std::size_t LoopNumber) const { return LoopTypesByLoopNum.at(LoopNumber); }; @@ -230,18 +230,18 @@ public: // Eight methods to get values from the maps of global reg/SSA to FG info. // For local names, see corresponding methods in SMPBasicBlock. unsigned short GetDefSignMiscInfo(int DefHashValue); - unsigned short GetStackDefSignMiscInfo(ea_t InstAddr); + unsigned short GetStackDefSignMiscInfo(STARS_ea_t InstAddr); unsigned short GetUseSignMiscInfo(int UseHashValue); - unsigned short GetStackUseSignMiscInfo(ea_t InstAddr); + unsigned short GetStackUseSignMiscInfo(STARS_ea_t InstAddr); unsigned short GetDefWidthTypeInfo(int DefHashValue); unsigned short GetUseWidthTypeInfo(int UseHashValue); struct FineGrainedInfo GetDefFGInfo(int DefHashValue); struct FineGrainedInfo GetUseFGInfo(int UseHashValue); - ControlFlowType GetControlFlowType(ea_t InstAddr); + ControlFlowType GetControlFlowType(STARS_ea_t InstAddr); // Set methods - void ResetJumpToFollowNodeCounter(ea_t InstAddr); // Set counter to zero, or insert zero counter if none found - void IncrementJumpToFollowNodeCounter(ea_t InstAddr); // Increment counter, or insert count of 1 if none found + void ResetJumpToFollowNodeCounter(STARS_ea_t InstAddr); // Set counter to zero, or insert zero counter if none found + void IncrementJumpToFollowNodeCounter(STARS_ea_t InstAddr); // Increment counter, or insert count of 1 if none found inline void IncTypedPhiDefs(void) { ++TypedPhiDefs; return; }; inline void IncUntypedPhiDefs(void) { ++UntypedPhiDefs; return; }; inline void DecTypedPhiDefs(void) { --TypedPhiDefs; return; }; @@ -257,23 +257,23 @@ public: inline void SetUnsafeForFastReturns(bool Status, UnsafeFastReturnReason Reason) { UnsafeForFastReturns = Status; FastReturnStatus |= (int) Reason; return; }; inline void SetIsSpeculative(bool IsS) { IsSpeculative = IsS; }; inline void SetHasHashingCode(bool Hashes) { HasHashingCode = Hashes; }; - void AddCallSource(ea_t addr); // Add a caller to the list of all callers of this function. - bool AddDirectCallTarget(ea_t addr); // Add a direct call target; return true if new target, false if target already added - bool RemoveDirectCallTarget(ea_t TargetAddr); // Remove TargetAddr from DirectCallTargets and AllCallTargets. - bool RemoveIndirectCallTarget(ea_t TargetAddr); // Remove TargetAddr from IndirectCallTargets and AllCallTargets. - void AddLeaOperand(ea_t addr, STARSOpndTypePtr LeaOperand); // add map entry to LeaInstOpMap - void AddNormalizedStackOperand(STARSOpndTypePtr OldOp, ea_t InstAddr, STARSOpndTypePtr NormalizedOp); // add to map for RTL lookup later + void AddCallSource(STARS_ea_t addr); // Add a caller to the list of all callers of this function. + bool AddDirectCallTarget(STARS_ea_t addr); // Add a direct call target; return true if new target, false if target already added + bool RemoveDirectCallTarget(STARS_ea_t TargetAddr); // Remove TargetAddr from DirectCallTargets and AllCallTargets. + bool RemoveIndirectCallTarget(STARS_ea_t TargetAddr); // Remove TargetAddr from IndirectCallTargets and AllCallTargets. + void AddLeaOperand(STARS_ea_t addr, STARSOpndTypePtr LeaOperand); // add map entry to LeaInstOpMap + void AddNormalizedStackOperand(STARSOpndTypePtr OldOp, STARS_ea_t InstAddr, STARSOpndTypePtr NormalizedOp); // add to map for RTL lookup later void UpdateMaxDirectStackAccessOffset(sval_t NewOffset); // Update MaxDirectStackAccessDelta - void SetControlFlowType(ea_t InstAddr, ControlFlowType JumpTypeCode); // insert into ControlFlowMap + void SetControlFlowType(STARS_ea_t InstAddr, ControlFlowType JumpTypeCode); // insert into ControlFlowMap std::map<int, struct STARS_SCCP_Const_Struct>::iterator InsertGlobalConstValue(int DefHashValue, struct STARS_SCCP_Const_Struct NewConstEntry); // Insert SCCP value for global name; change if already found. // Eight methods to set values into the maps of global reg/stack/SSA to FG info. // For local names, see corresponding methods in SMPBasicBlock. void UpdateDefSignMiscInfo(int DefHashValue, unsigned short NewInfo); - void UpdateStackDefSignMiscInfo(ea_t InstAddr, unsigned short NewInfo); + void UpdateStackDefSignMiscInfo(STARS_ea_t InstAddr, unsigned short NewInfo); void UpdateUseSignMiscInfo(int UseHashValue, unsigned short NewInfo); - void UpdateStackUseSignMiscInfo(ea_t InstAddr, unsigned short NewInfo); + void UpdateStackUseSignMiscInfo(STARS_ea_t InstAddr, unsigned short NewInfo); void UpdateDefWidthTypeInfo(int DefHashValue, unsigned short NewInfo); void UpdateUseWidthTypeInfo(int UseHashValue, unsigned short NewInfo); void UpdateDefFGInfo(int DefHashValue, struct FineGrainedInfo NewFG); @@ -281,7 +281,7 @@ public: void ClearDefSignedness(int DefHashValue); - bool MDUpdateFGStackLocInfo(ea_t InstAddr, STARSOpndTypePtr TempOp, struct FineGrainedInfo NewFG); + bool MDUpdateFGStackLocInfo(STARS_ea_t InstAddr, STARSOpndTypePtr TempOp, struct FineGrainedInfo NewFG); // Return true if we update fine grained stack entry for stack op TempOp from instruction at InstAddr // Query methods @@ -303,7 +303,7 @@ public: inline bool HasGoodSSAForm(void) const { return HasGoodSSA; }; inline bool HasReducibleControlFlow(void) const { return HasReducibleCFG; }; inline bool HasPushAfterFrameAlloc(void) const { return PushAfterLocalVarAlloc; }; - inline bool IsAddrInFunc(ea_t addr) { return ((addr >= FuncInfo->get_startEA()) && (addr <= FuncInfo->get_endEA())); } + inline bool IsAddrInFunc(STARS_ea_t addr) { return ((addr >= FuncInfo->get_startEA()) && (addr <= FuncInfo->get_endEA())); } inline bool IsLibFunc(void) const { return LibFunc; }; inline bool IsLeaf(void) const { return (!IndirectCalls && DirectCallTargets.empty()); }; inline bool IsSafe(void) const { return SafeFunc; }; // safe to follow stack access DEF-USE chains @@ -330,7 +330,7 @@ public: inline bool IsVarKill(STARSOpndTypePtr CurrOp) const { return (KillSet.end() != KillSet.find(CurrOp)); } - inline bool IsJumpFollowBlock(ea_t InstAddr) const { return (JumpFollowNodesSet.find(InstAddr) != JumpFollowNodesSet.end()); } + inline bool IsJumpFollowBlock(STARS_ea_t InstAddr) const { return (JumpFollowNodesSet.find(InstAddr) != JumpFollowNodesSet.end()); } bool IsInStackPtrCopySet(STARSOpndTypePtr CurrOp); inline bool DoesStackFrameExtendPastStackTop(void) const { return StackFrameExtendsPastStackTop; }; inline bool IsRegPreserved(std::size_t RegNum) const { return (PreservedRegsBitmap[RegNum] != 0); }; @@ -348,10 +348,10 @@ public: void AnalyzeFunc(void); // Analyze all instructions in function void AdvancedAnalysis(void); // Analyses that depend on whole program info but not SSA. std::size_t UnprocessedCalleesCount(void); // Count of callees that have FuncProcessed == false - sval_t GetStackAdjustmentForCallee(ea_t CallAddr); // Get stack pointer adjustment in basic block, after CallAddr - sval_t GetStackDeltaForCallee(ea_t CallTargetAddr); // Get stack pointer delta for callee function, which starts at CallTargetAddr + sval_t GetStackAdjustmentForCallee(STARS_ea_t CallAddr); // Get stack pointer adjustment in basic block, after CallAddr + sval_t GetStackDeltaForCallee(STARS_ea_t CallTargetAddr); // Get stack pointer delta for callee function, which starts at CallTargetAddr sval_t ComputeGlobalStackAdjustment(void); // Find consistent or smallest stack adjustment after all calls to this function, program-wide - void ComputeTempReachingDefs(STARSOpndTypePtr TempOp, ea_t UseAddr); // Compute the TempReachingDefs set that reaches UseAddr for TempOp + void ComputeTempReachingDefs(STARSOpndTypePtr TempOp, STARS_ea_t UseAddr); // Compute the TempReachingDefs set that reaches UseAddr for TempOp void ComputeTempStackDeltaReachesList(STARSOpndTypePtr TempOp); // Compute the TempStackDeltaReachesList for TempOp for all DefAddrs in TempReachingDefs bool FindReachingStackDelta(sval_t &StackDelta); // Find maximum stack delta in TempStackDeltaReachesList; return true if one consistent delta is in the list void GatherIncomingArgTypes(void); // Use the SSA marker inst to record incoming arg types in member InArgTypes. @@ -368,19 +368,19 @@ public: void InferTypes(bool FirstIter); // Determine NUMERIC, POINTER, etc. for all operands bool InferInterproceduralTypes(void); // Pass types across procedure bounds, return true if types change. void InferFGInfo(void); // determine signedness and width info for all operands - SMPOperandType InferGlobalDefType(STARSOpndTypePtr DefOp, int SSANum, SMPBasicBlock *DefBlock, bool CallInst, ea_t DefAddr); + SMPOperandType InferGlobalDefType(STARSOpndTypePtr DefOp, int SSANum, SMPBasicBlock *DefBlock, bool CallInst, STARS_ea_t DefAddr); // Can DEF type be inferred from all USEs? void ApplyProfilerInformation(ProfilerInformation *pi); void AnalyzeMetadataLiveness(void); // Is metadata live or dead for each inst - bool PropagateGlobalMetadata(STARSOpndTypePtr UseOp, SMPMetadataType Status, int SSANum, ea_t UseAddr); + bool PropagateGlobalMetadata(STARSOpndTypePtr UseOp, SMPMetadataType Status, int SSANum, STARS_ea_t UseAddr); void FindRedundantMetadata(void); // Do consecutive DEFs have same type? void SparseConditionalConstantPropagation(void); // perform SCCP to find constant values for DEFs, store in this->ConstantDefs void EvaluateAllPhiConstants(int BlockNum, std::vector<STARSBitSet> ExecutedEdgeBitSet, std::list<std::pair<int, int> > &SSAWorkList); // part of SCCP processing; propagate const DEFs into Phi USEs and Phi DEFs bool IsBenignUnderflowDEF(STARSOpndTypePtr DefOp, int DefSSANum, std::size_t DefAddr, int &IdiomCode); // Do we not care if DEF underflowed, due to how it is used? bool HasIntErrorCallSink(STARSOpndTypePtr DefOp, int DefSSANum, std::size_t DefAddr, std::string &SinkString, bool &FoundAnyCall); // DEF is passed to known system/lib call - bool WritesAboveLocalFrame(STARSOpndTypePtr DestOp, bool OpNormalized, ea_t InstAddr); // Is DestOp direct stack access to caller's frame? - bool AccessAboveLocalFrame(STARSOpndTypePtr StackOp, bool OpNormalized, ea_t InstAddr, bool WriteAccess); // Is StackOp direct stack access to caller's frame? - bool IsDefUsedInMemWrite(STARSOpndTypePtr DefOp, int DefSSANum, ea_t DefAddr); // Is Defop+DefSSANum at DefAddr used as address reg or as source operand in memory write? + bool WritesAboveLocalFrame(STARSOpndTypePtr DestOp, bool OpNormalized, STARS_ea_t InstAddr); // Is DestOp direct stack access to caller's frame? + bool AccessAboveLocalFrame(STARSOpndTypePtr StackOp, bool OpNormalized, STARS_ea_t InstAddr, bool WriteAccess); // Is StackOp direct stack access to caller's frame? + bool IsDefUsedInMemWrite(STARSOpndTypePtr DefOp, int DefSSANum, STARS_ea_t DefAddr); // Is Defop+DefSSANum at DefAddr used as address reg or as source operand in memory write? void MarkFunctionSafe(void); // Does analysis to see if the function can be marked safe void FreeUnusedMemory2(void); // After loop 2 in SMPProgram::Analyze(), free memory void FreeUnusedMemory3(void); // After loop 3 in SMPProgram::Analyze(), free memory @@ -390,7 +390,7 @@ private: // Data SMPProgram* Program; // pointer to the program I'm part of STARS_Function_t *FuncInfo; - ea_t FirstEA; // address of first instruction in the function + STARS_ea_t FirstEA; // address of first instruction in the function #if 0 char FuncName[MAXSMPSTR]; #endif @@ -445,8 +445,8 @@ private: STARS_asize_t IncomingArgsSize; // size of incoming args on stack int RetAddrSize; // size of return address on stack (4 for most machines) std::size_t OutgoingArgsSize; // portion of LocalVarsSize that is really outgoing args space - ea_t LocalVarsAllocInstr; // address of instr that allocates stack frame - ea_t LocalVarsDeallocInstr; // address of epilogue instr that deallocs frame + STARS_ea_t LocalVarsAllocInstr; // address of instr that allocates stack frame + STARS_ea_t LocalVarsDeallocInstr; // address of epilogue instr that deallocs frame adiff_t AllocPointDelta; // IDA sp_delta AFTER stack frame allocation instruction sval_t MinStackDelta; // smallest (negative) value that stack pointer reaches, relative // to the value it has at the entry point of the function @@ -471,13 +471,13 @@ private: std::list<SMPInstr *> Instrs; std::list<SMPBasicBlock *> Blocks; - std::set<ea_t> DirectCallTargets; // addresses called directly - std::set<ea_t> IndirectCallTargets; // addresses called by indirect calls - std::vector<ea_t> AllCallTargets; // union of direct and indirect - std::set<ea_t> AllCallSources; // functions that call this one - std::set<ea_t> AllCallSites; // instructions that call this function - std::set<ea_t> JumpFollowNodesSet; // addresses that are jumped to when exiting if-then-elsif-else structures - std::map<ea_t, SMPBasicBlock *> InstBlockMap; + std::set<STARS_ea_t> DirectCallTargets; // addresses called directly + std::set<STARS_ea_t> IndirectCallTargets; // addresses called by indirect calls + std::vector<STARS_ea_t> AllCallTargets; // union of direct and indirect + std::set<STARS_ea_t> AllCallSources; // functions that call this one + std::set<STARS_ea_t> AllCallSites; // instructions that call this function + std::set<STARS_ea_t> JumpFollowNodesSet; // addresses that are jumped to when exiting if-then-elsif-else structures + std::map<STARS_ea_t, SMPBasicBlock *> InstBlockMap; std::vector<SMPBasicBlock *> RPOBlocks; std::vector<unsigned short> InArgTypes; // types of incoming arguments, starting with argument zero. std::vector<int> IDom; // Immediate dominators, indexed and valued by block RPO numbers @@ -497,8 +497,8 @@ private: std::vector<int> LoopTypesByLoopNum; // indexed by loop number: top-testing, bottom-testing, middle-testing or infinite std::vector<int> LoopTestBlocksByLoopNum; // indexed by loop number; block number of header block for top-testing or tail block for bottom-testing, -1 for middle-testing std::vector<int> DFSMarkers; // vector indexed by block number, -1 => unvisited, 0 => visited but not all descendants visited, 1 => completed - std::map<ea_t, uint16_t> JumpToFollowNodeCounterMap; // map addr of follow-block to count of jumps seen to it within if-then-[elsif-else] structure - std::map<int, ea_t> GlobalDefAddrBySSA; // map hash of global name & SSANum to DEF inst addr + std::map<STARS_ea_t, uint16_t> JumpToFollowNodeCounterMap; // map addr of follow-block to count of jumps seen to it within if-then-[elsif-else] structure + std::map<int, STARS_ea_t> GlobalDefAddrBySSA; // map hash of global name & SSANum to DEF inst addr // If global DEF for that SSA is found in a Phi function, we use block number instead of inst addr // Instruction addresses should never overlap block #s, as block #s start at 0 and top out at a few hundred. // NOTE: We are currently limiting this map to registers, not all global names. @@ -509,10 +509,10 @@ private: std::map<int, struct FineGrainedInfo> GlobalUseFGInfoBySSA; // map hash of global name & SSANum to USE FG info. // NOTE: We are currently limiting this map to registers, not all global names. - std::map<ea_t, struct FineGrainedInfo> StackDefFGInfo; // map stack FG info to instruction address of stack def; UNUSED - std::map<ea_t, struct FineGrainedInfo> StackUseFGInfo; // map stack FG info to instruction address of stack use; UNUSED - std::map<ea_t, STARSOpndTypePtr> LeaInstOpMap; // map original Lea instruction pseudo-memory operand to instruction address. - std::map<ea_t, unsigned short> ControlFlowMap; // map InstAddr of each jump or branch to a type suitable for SPARK Ada translation. + std::map<STARS_ea_t, struct FineGrainedInfo> StackDefFGInfo; // map stack FG info to instruction address of stack def; UNUSED + std::map<STARS_ea_t, struct FineGrainedInfo> StackUseFGInfo; // map stack FG info to instruction address of stack use; UNUSED + std::map<STARS_ea_t, STARSOpndTypePtr> LeaInstOpMap; // map original Lea instruction pseudo-memory operand to instruction address. + std::map<STARS_ea_t, unsigned short> ControlFlowMap; // map InstAddr of each jump or branch to a type suitable for SPARK Ada translation. std::map<int, struct STARS_SCCP_Const_Struct> ConstantDefs; // map hash of global name & SSANum to constant value from SCCP. // NOTE: We are currently limiting this map to registers, not all global names. Flags are tracked separately (e.g. // carry flag, zero flag) only in this SCCP data structure, whereas SSA form, DEFs, USEs and LVA sets have the flags @@ -522,26 +522,26 @@ private: std::set<STARSOpndTypePtr, LessOp> KillSet; // registers killed in this function std::set<STARSOpndTypePtr, LessOp> LiveOutSet; // Live-Out registers in this function // Tracking stack pointer and frame pointer saves, copies, and restores - std::set<std::pair<STARSOpndTypePtr, std::pair<ea_t, sval_t> >, LessStackDeltaCopy> StackPtrCopySet; // triple: operand holding copy, InstAddr where copy is made, stack delta for copy - std::list<std::pair<ea_t, sval_t> > TempStackDeltaReachesList; // Used for temporary lookups of particular op_t in StackPtrCopySet. - std::set<ea_t, LessAddr> TempReachingDefs; // Temporary list of InstAddrs with defs of one op_t that reach a particular InstAddr. - std::map<std::pair<STARSOpndTypePtr, ea_t>, STARSOpndTypePtr, LessDefinition> NormalizedStackOpsMap; // normalized stack operands, indexed by instruction address (for lookup from RTLs). - std::map<std::pair<STARSOpndTypePtr, ea_t>, std::map<std::pair<STARSOpndTypePtr, ea_t>, STARSOpndTypePtr, LessDefinition>::iterator, LessDefinition> InverseNormalizedStackOpsMap; // index: normalized op, + std::set<std::pair<STARSOpndTypePtr, std::pair<STARS_ea_t, sval_t> >, LessStackDeltaCopy> StackPtrCopySet; // triple: operand holding copy, InstAddr where copy is made, stack delta for copy + std::list<std::pair<STARS_ea_t, sval_t> > TempStackDeltaReachesList; // Used for temporary lookups of particular op_t in StackPtrCopySet. + std::set<STARS_ea_t, LessAddr> TempReachingDefs; // Temporary list of InstAddrs with defs of one op_t that reach a particular InstAddr. + std::map<std::pair<STARSOpndTypePtr, STARS_ea_t>, STARSOpndTypePtr, LessDefinition> NormalizedStackOpsMap; // normalized stack operands, indexed by instruction address (for lookup from RTLs). + std::map<std::pair<STARSOpndTypePtr, STARS_ea_t>, std::map<std::pair<STARSOpndTypePtr, STARS_ea_t>, STARSOpndTypePtr, LessDefinition>::iterator, LessDefinition> InverseNormalizedStackOpsMap; // index: normalized op, // mapped to: iterator into NormalizedStackOpsMap; only for use in functions that call alloca() and need to re-normalize stack ops repeatedly std::bitset<1 + MD_LAST_REG_NO> PreservedRegsBitmap; // Registers that are saved on entry and restored before return from func, or never used, as a bitmap. // Methods - void EraseInstRange(ea_t FirstAddr, ea_t LastAddr); + void EraseInstRange(STARS_ea_t FirstAddr, STARS_ea_t LastAddr); void SetLinks(void); // Link basic blocks and map instructions to blocks - bool FindDistantCodeFragment(ea_t TargetAddr); // Is TargetAddr the start of a code fragment that belongs to this func, not a separate func? + bool FindDistantCodeFragment(STARS_ea_t TargetAddr); // Is TargetAddr the start of a code fragment that belongs to this func, not a separate func? bool AnalyzeStackPointerDeltas(void); // Analyze changes in stack pointer for all instructions; return AnalyzedSP bool UseIDAStackPointerDeltas(void); // Use IDA Pro values instead of doing our own analysis - bool AddToStackPtrCopySet(STARSOpndTypePtr CopyOp, ea_t InstAddr, sval_t StackDelta); // return true if inserted, false if present already (update delta in that case) + bool AddToStackPtrCopySet(STARSOpndTypePtr CopyOp, STARS_ea_t InstAddr, sval_t StackDelta); // return true if inserted, false if present already (update delta in that case) void FindPreservedRegs(void); // Determined which regs are not killed by func or its callees; set bits in PreservedRegsBitmap void FindAllAllocsAndDeallocs(void); // Find all stack frame allocating and deallocating instructions and stack ptr offsets void FindFramePointerDelta(void); // Compute FramePointerStackDelta void SetStackFrameInfo(void); // Figure out the stack frame regions, and locate the alloc/dealloc frame instructions. - ea_t FindAllocPoint(STARS_asize_t); // Deal with difficult to find stack frame allocations + STARS_ea_t FindAllocPoint(STARS_asize_t); // Deal with difficult to find stack frame allocations bool MDFixFrameInfo(void); // Redefine stack regions for our needs bool MDFixUseFP(void); // Fix IDA errors affecting UseFP void BuildLocalVarTable(void); // Determine local variable boundaries on the stack @@ -551,7 +551,7 @@ private: void FindOutgoingArgsSize(void); // Find portion of local frame that is outgoing args inline void SetStackFrameExtendsPastStackTop(void) { StackFrameExtendsPastStackTop = true; }; bool IndexedWritesAboveLocalFrame(STARSOpndTypePtr DestOp); // Is DestOp direct stack write to caller's frame? - bool MDGetStackOffsetAndSize(SMPInstr *Instr, STARSOpndTypePtr TempOp, sval_t BaseValue, ea_t &offset, std::size_t &DataSize, + bool MDGetStackOffsetAndSize(SMPInstr *Instr, STARSOpndTypePtr TempOp, sval_t BaseValue, STARS_ea_t &offset, std::size_t &DataSize, bool &FP, bool &Indexed, bool &Signed, bool &Unsigned); // Find any stack memory access in TempOp, return offset, size, // whether the Frame Pointer was used and signedness (if sign-extended or zero-extended). bool FindAlloca(void); // true if found evidence of alloca() allocations @@ -580,7 +580,7 @@ private: bool FindChainAliasHelper(std::list<SMPBasicBlock *>::iterator CurrBlock, STARSOpndTypePtr DefOp); // recursive helper for global DefOp with DU-chain that traverses CFG void FindCounterVariables(void); // Mark NUMERIC (and propagate) any DEF that starts at small immed. value and gets only small inc/dec operations. - bool CounterVarHelper(STARSOpndTypePtr DefOp, int DefSSANum, int BlockNum, bool LocalName, std::list<std::pair<int, ea_t> > &CounterSSANums); // recursive helper for FindCounterVariables() + bool CounterVarHelper(STARSOpndTypePtr DefOp, int DefSSANum, int BlockNum, bool LocalName, std::list<std::pair<int, STARS_ea_t> > &CounterSSANums); // recursive helper for FindCounterVariables() bool ConditionalTypePropagation(void); // Apply SCC algorithm to unresolved Phi DEFs bool PropagateSignedness(void); // Propagate signedness FG info from DEFs to USEs whenever there is no USE sign info. void MarkSpecialNumericErrorCases(void); // Detect and mark special cases before emitting numeric error annotations. diff --git a/include/base/SMPInstr.h b/include/base/SMPInstr.h index ca2071a7..10458d69 100644 --- a/include/base/SMPInstr.h +++ b/include/base/SMPInstr.h @@ -32,11 +32,11 @@ // // This header defines the interfaces needed for analyzing instructions. -#include <cstddef> #include <string> #include <bitset> -#include <stdint.h> +#include <cstddef> +#include <cstdint> #include "interfaces/STARSTypes.h" #include "interfaces/SMPDBInterface.h" @@ -482,9 +482,9 @@ public: inline bool IsRecursiveCall(void) const { return (booleans1 & INSTR_SET_DIRECT_RECURSIVE_CALL); }; inline bool MDIsInterruptCall(void) const { return (booleans1 & INSTR_SET_INTERRUPT); }; inline bool IsNop(void) const { return (booleans2 & INSTR_SET_NOP); }; // instruction is simple or complex no-op - inline bool IsFloatNop(void) const { return (GetIDAOpcode() == NN_fnop); }; + inline bool IsFloatNop(void) const { return (GetIDAOpcode() == STARS_NN_fnop); }; bool IsMarkerInst(void) const; - inline bool MDIsDecrement(void) const { return (GetIDAOpcode() == NN_dec); }; + inline bool MDIsDecrement(void) const { return (GetIDAOpcode() == STARS_NN_dec); }; bool IsDecrementRTL(void) const; bool IsSetToZero(void) const; bool MDIsPushInstr(void) const; @@ -495,12 +495,12 @@ public: bool MDIsHaltInstr(void) const; bool MDIsConditionalMoveInstr(void) const; bool MDIsMoveInstr(void) const; - bool MDIsLoadEffectiveAddressInstr(void) const { return ((GetIDAOpcode() == NN_lea) && (!IsNop()) && (!IsRegClearIdiom())); }; + bool MDIsLoadEffectiveAddressInstr(void) const { return ((GetIDAOpcode() == STARS_NN_lea) && (!IsNop()) && (!IsRegClearIdiom())); }; bool MDIsStackPointerCopy(bool UseFP); // copies ESP or EBP to register bool MDIsFrameAllocInstr(void); bool MDIsFrameDeallocInstr(bool UseFP, STARS_asize_t LocSize); bool MDUsesCalleeSavedReg(void); - inline bool MDIsUnsignedArithmetic(void) const { return ((NN_mul == GetIDAOpcode()) || (NN_div == GetIDAOpcode())); }; + inline bool MDIsUnsignedArithmetic(void) const { return ((STARS_NN_mul == GetIDAOpcode()) || (STARS_NN_div == GetIDAOpcode())); }; bool MDIsSignedArithmetic(void) const; bool MDIsUnsignedBranch(void) const; bool MDIsSignedBranch(void) const; @@ -514,18 +514,18 @@ public: bool MDIsCompareOrTest(void) const; // Opcode is compare or test bool IsSubtractionOfConstant(STARSOpndTypePtr &NonConstOperand, STARS_uval_t &ConstValue) const; bool MDIsSubregMaskInst(size_t &BytesMasked); // is AND operation that masks off lower BytesMasked bytes - inline bool MDIsBitwiseNotOpcode(void) const { return (NN_not == GetIDAOpcode()); }; - inline bool MDIsBitwiseAndOpcode(void) const { return (NN_and == GetIDAOpcode()); }; - inline bool MDIsBitwiseOrOpcode(void) const { return (NN_or == GetIDAOpcode()); }; - inline bool MDIsSignBitFill(void) const { return ((NN_sar == GetIDAOpcode()) && ((MD_NORMAL_MACHINE_BITWIDTH - 1) == MDGetShiftCount())); }; + inline bool MDIsBitwiseNotOpcode(void) const { return (STARS_NN_not == GetIDAOpcode()); }; + inline bool MDIsBitwiseAndOpcode(void) const { return (STARS_NN_and == GetIDAOpcode()); }; + inline bool MDIsBitwiseOrOpcode(void) const { return (STARS_NN_or == GetIDAOpcode()); }; + inline bool MDIsSignBitFill(void) const { return ((STARS_NN_sar == GetIDAOpcode()) && ((MD_NORMAL_MACHINE_BITWIDTH - 1) == MDGetShiftCount())); }; inline bool MDDoublesWidth(void) const { - return ((NN_cbw == GetIDAOpcode()) || (NN_cwde == GetIDAOpcode()) || (NN_cdqe == GetIDAOpcode())); + return ((STARS_NN_cbw == GetIDAOpcode()) || (STARS_NN_cwde == GetIDAOpcode()) || (STARS_NN_cdqe == GetIDAOpcode())); } inline bool MDPropagateUseUpFromBranch(void) const { // Do we propagate branch signedness through the register USEs of this opcode to their DEFs? - return ((NN_cmp == GetIDAOpcode()) || (NN_test == GetIDAOpcode()) || (NN_mov == GetIDAOpcode()) + return ((STARS_NN_cmp == GetIDAOpcode()) || (STARS_NN_test == GetIDAOpcode()) || (STARS_NN_mov == GetIDAOpcode()) #if 0 - || ((NN_bt <= GetIDAOpcode()) && (NN_bts >= GetIDAOpcode())) + || ((STARS_NN_bt <= GetIDAOpcode()) && (STARS_NN_bts >= GetIDAOpcode())) #endif ); }; @@ -815,7 +815,7 @@ private: bool MDFindPointerUse(STARSOpndTypePtr MemOp, bool UseFP); // Set base reg to POINTER bool MDFindMallocCall(STARSOpndTypePtr TargetOp); // Set return reg from malloc() call to HEAPPTR bool MDIsNop(void) const; // instruction is simple or complex no-op - inline bool MDIsMultiply(void) const { return ((NN_mul == GetIDAOpcode()) || (NN_imul == GetIDAOpcode())); }; + inline bool MDIsMultiply(void) const { return ((STARS_NN_mul == GetIDAOpcode()) || (STARS_NN_imul == GetIDAOpcode())); }; bool MDAlwaysUnsignedDEF(void) const; // Always produces an UNSIGNED DEF bool MDAlwaysSignedDEF(void) const; // Always produces a SIGNED DEF bool IsBenignTruncation(int &IdiomCode); // Is the instruction such that truncation is not an error? diff --git a/include/base/SMPProgram.h b/include/base/SMPProgram.h index 593dd0d1..118d0d1b 100644 --- a/include/base/SMPProgram.h +++ b/include/base/SMPProgram.h @@ -19,7 +19,7 @@ * e-mail: jwd@virginia.com * URL : http://www.cs.virginia.edu/ * - * Additional copyrights 2010, 2011 by Zephyr Software LLC + * Additional copyrights 2010, 2011, 2012, 2013, 2014, 2015 by Zephyr Software LLC * e-mail: {clc,jwd}@zephyr-software.com * URL : http://www.zephyr-software.com/ * @@ -41,8 +41,6 @@ #include <cstddef> - - #include "interfaces/STARSTypes.h" #include "interfaces/SMPDBInterface.h" #include "base/SMPDataFlowAnalysis.h" diff --git a/include/base/SMPStaticAnalyzer.h b/include/base/SMPStaticAnalyzer.h index e645ae5d..4d60a8dd 100644 --- a/include/base/SMPStaticAnalyzer.h +++ b/include/base/SMPStaticAnalyzer.h @@ -19,7 +19,7 @@ * e-mail: jwd@virginia.com * URL : http://www.cs.virginia.edu/ * - * Additional copyrights 2010, 2011 by Zephyr Software LLC + * Additional copyrights 2010, 2011, 2012, 2013, 2014, 2015 by Zephyr Software LLC * e-mail: {clc,jwd}@zephyr-software.com * URL : http://www.zephyr-software.com/ * @@ -28,220 +28,10 @@ #ifndef SMPSTATICANALYZER_H #define SMPSTATICANALYZER_H 1 -#include <string> +// #include <string> -// #include "allins.hpp" +// #include <cstdio> -#include "base/SMPDataFlowAnalysis.h" - -// Translate RTLs to SPARK-Ada? -#define ZST_EMIT_SPARK_ADA_TRANSLATION 0 - -#define LAST_OPT_CATEGORY 10 -#define LAST_TYPE_CATEGORY 15 - -// Record optimization category by opcode. -extern int OptCategory[NN_last + 1]; - -// Limit on bytes of code for full analysis -#define STARS_CODESIZE_FULL_ANALYSIS_LIMIT 8000000 - -// Flag to force reduced analysis so we don't run out of virtual memory -extern bool STARS_PerformReducedAnalysis; - -// Indentation level when emitting SPARK Ada translation of the RTLs. -extern unsigned short STARS_SPARK_IndentCount; - -// Keep statistics on how many instructions we saw in each optimization -// category, and how many optimizing annotations were emitted for -// each category. -extern int OptCount[LAST_OPT_CATEGORY + 1]; -extern int AnnotationCount[LAST_OPT_CATEGORY + 1]; - -// Record which opcodes change the stack pointer, and by how many -// bytes up (reduction in stack size for stacks that grow downward) -// or down (increase in stack size for stacks that grow downward). -extern sval_t StackAlteration[NN_last + 1]; - -// Unique data referent number to use in data annotations. -extern unsigned long DataReferentID; - -// Counters for analyzing memory use for allocated but unused capacity in vectors. -extern unsigned long UnusedStructCount; // various structs -extern unsigned long UnusedIntCount; // int, ea_t, ptr, other 4-byte objects - -// Counters for dead metadata analysis. -extern unsigned long DeadMetadataCount; -extern unsigned long LiveMetadataCount; - -// Counters for indirect jump resolution. -extern unsigned long ResolvedIndirectJumpCount; -extern unsigned long UnresolvedIndirectJumpCount; - -// Counters for measuring SCCP success in finding constant DEFs. -extern unsigned long ConstantDEFCount; -extern unsigned long AlwaysTakenBranchCount; -extern unsigned long NeverTakenBranchCount; - -// Counters for accessing less than machine register width. -extern unsigned long SubwordRegCount; -extern unsigned long SubwordMemCount; -extern unsigned long SubwordAddressRegCount; -extern unsigned long SPARKOperandCount; // total operands printed - -// Counters for numeric error annotations cases. -#define SMP_MEASURE_NUMERIC_ANNOTATIONS 0 -#if SMP_MEASURE_NUMERIC_ANNOTATIONS -extern unsigned long NumericAnnotationsCount12; // cases 1 and 2 -extern unsigned long NumericAnnotationsCount3; // case 3 -extern unsigned long TruncationAnnotationsCount; // case 4 -extern unsigned long SignednessWithoutTruncationCount; // case 5 -extern unsigned long LeaInstOverflowCount; // case 6 -extern unsigned long WidthDoublingTruncationCount; // case 7 -extern unsigned long BenignOverflowInstCount; -extern unsigned long BenignOverflowDefCount; -extern unsigned long SuppressStackPtrOverflowCount; -extern unsigned long SuppressLiveFlagsOverflowCount; -extern unsigned long LiveMultiplyBitsCount; -extern unsigned long BenignTruncationCount; -extern unsigned long SuppressTruncationRegPiecesAllUsed; -extern unsigned long SuppressSignednessOnTruncation; -#endif - -#define SMP_COUNT_MEMORY_ALLOCATIONS 0 -#if SMP_COUNT_MEMORY_ALLOCATIONS -// Counters for analyzing memory use for allocated and used objects. -extern unsigned long SMPInstCount; -extern unsigned long SMPBlockCount; -extern unsigned long SMPDefUseChainCount; -extern unsigned long SMPFuncCount; -extern unsigned long SMPGlobalVarCount; -extern unsigned long SMPLocalVarCount; -extern unsigned long SMPInstBytes; -extern unsigned long SMPDefUseChainBytes; -#define SMP_DU_ADDR_SIZE sizeof(ea_t) -#endif - -#define STARS_SCCP_GATHER_STATISTICS 1 -#if STARS_SCCP_GATHER_STATISTICS -// Counters for analyzing Sparse Conditional Constant Propagation effectiveness. -extern unsigned long SCCPFuncsWithArgWriteCount; -extern unsigned long SCCPFuncsWithConstantArgWriteCount; -extern unsigned long SCCPOutgoingArgWriteCount; -extern unsigned long SCCPConstantOutgoingArgWriteCount; -#endif - -// Counter for max # of basic blocks seen in one function. -extern unsigned long STARS_MaxBlockCount; - -// Is the binary a 32-bit, 64-bit, etc. instruction set architecture -extern std::size_t STARS_ISA_Bitwidth; -extern std::size_t STARS_ISA_Bytewidth; -extern char STARS_ISA_dtyp; -extern int STARS_MD_LAST_SAVED_REG_NUM; - - -// Use shrink to fit C++ STL idiom to reduce memory wastage? -#define SMP_SHRINK_TO_FIT 1 - -// Should we convert the x86 LOCK prefix byte to a no-op to avoid -// IDA Pro problems with instructions that jump past the LOCK -// prefix and look like they are jumping into the middle of an -// instruction? -#define STARS_REMOVE_LOCK_PREFIX 0 - -// The types of data objects based on their first operand flags. -extern const char *DataTypes[]; - -// Filename (not including path) of executable being analyzed. -extern char RootFileName[MAXSTR]; - -// Initialized operand used to copy-initialize other operands. -extern STARSOpndType InitOp; - -// File to print security alert messages to, e.g. foo.exe.alarms. -extern FILE *ZST_AlarmFile; - -// Security policies for the Zephyr Security Toolkit. -enum ZST_Policy { - ZST_DISALLOW = 0, - ZST_WHITELIST = 1, - ZST_BLACKLIST = 2, - ZST_ALLOWALL = 3 -}; - -// What type of system call, for Zephyr Security Toolkit monitoring. -enum ZST_SysCallType { - ZST_UNMONITORED_CALL, - ZST_HIGHPRIVILEGE_CALL, - ZST_FILE_CALL, - ZST_NETWORK_CALL -}; - -// Function start and end addresses (for function entry chunks only). -// Kept here because IDA Pro 5.1 seems to have a memory overwriting -// problem when iterating through all functions in the program. An existing -// func_t *ChunkInfo data structure was getting overwritten by one of the -// function func_t data structures, causing changes of startEA and endEA among -// other things. -struct SMP_bounds_t { - STARS_ea_t startEA; - STARS_ea_t endEA; -}; - -extern std::vector<SMP_bounds_t> FuncBounds; - -// Code addresses identified by a disassembler, such as objdump on -// Linux. These can be used to improve the code vs. data identification -// of IDA Pro. -extern std::vector<STARS_ea_t> DisasmLocs; -// Code addresses as identified by IDA Pro, to be compared to DisasmLocs. -extern std::vector<STARS_ea_t> IDAProLocs; - - - -// File for code xref targets (helps ILR, makes IRDB more complete) -extern FILE *STARS_XrefsFile; - -// File to provide details on fast returns, safe and unsafe return-address functions, etc. -extern FILE *STARS_CallReturnFile; - -#if ZST_EMIT_SPARK_ADA_TRANSLATION -// Files for SPARK Ada translation of program RTLs -extern FILE *ZST_SPARKSourceFile; -extern FILE *ZST_SPARKHeaderFile; -#endif - -class DisAsmString; - -extern DisAsmString DisAsmText; - -// strings for printing ZST_SysCallType -extern const char *CallTypeNames[4]; - -// Bit masks for extracting bits from a STARSBitSet unsigned char. -extern const unsigned char STARSBitMasks[8]; - -// Given a function name, return its Zephyr Security Toolkit call type. -ZST_SysCallType GetCallTypeFromFuncName(std::string SysCallName); - -// Get the user-specified security policy for the given call type. -ZST_Policy GetPolicyFromCallType(ZST_SysCallType CallType); - -// Given a call type and called function name, is it on the location whitelist -// for that call type? -bool IsLocationWhitelisted(ZST_SysCallType CallType, std::string LocationName); - -// Given a call type and called function name, is it on the location blacklist -// for that call type? -bool IsLocationBlacklisted(ZST_SysCallType CallType, std::string LocationName); - -// Given a called function name, does it produce only benign numeric errors when -// its returned values are used in arithmetic? (i.e. it is a trusted input) -bool IsNumericSafeSystemCall(std::string CallName); - -// Utility functions to print code xrefs to STARS_XrefsFile -void PrintCodeToCodeXref(ea_t FromAddr, ea_t ToAddr, size_t InstrSize); -void PrintDataToCodeXref(ea_t FromDataAddr, ea_t ToCodeAddr, size_t InstrSize); +// #include "interfaces/STARSTypes.h" #endif diff --git a/include/interfaces/SMPDBInterface.h b/include/interfaces/SMPDBInterface.h index b938842d..2cabc164 100644 --- a/include/interfaces/SMPDBInterface.h +++ b/include/interfaces/SMPDBInterface.h @@ -44,14 +44,13 @@ #include <set> #include <cstddef> -#include <stdint.h> +#include <cstdint> -#include <pro.h> +#if 0 #include <ida.hpp> -#include <ua.hpp> #include <funcs.hpp> #include <frame.hpp> -#include <xref.hpp> +#endif #ifndef STARS_IRDB_INTERFACE #ifndef STARS_IDA_INTERFACE @@ -72,6 +71,13 @@ #include "interfaces/STARSTypes.h" +// A maximum string length for use when SMP needs to use less space than +// the IDA Pro MAXSTR, which is 1024 at present. +#define MAXSMPSTR 256 + +// Use shrink to fit C++ STL idiom to reduce memory wastage? +#define SMP_SHRINK_TO_FIT 1 + // Pseudo-addresses that signify special cases in STARS, as opposed to actual addresses. // By using the IDA Pro BADADDR constant, we can automatically adjust for 32/64-bit systems. #define STARS_SSA_MARKER_PSEUDO_ID ((STARS_ea_t) BADADDR - 1) @@ -87,7 +93,79 @@ #define STARS_IsBlockNumPseudoID(addr) ((STARS_PSEUDO_ID_MIN <= ((STARS_ea_t) addr)) && (STARS_PSEUDO_BLOCKNUM_MAX >= ((STARS_ea_t) addr))) #define STARS_GetBlockNumFromPseudoID(addr) (((STARS_ea_t) addr) & STARS_BLOCKNUM_MASK) -bool SMPGetCmd(STARS_ea_t InstAddr, insn_t &SMPcmd, uint32 &SMPfeatures); +// Indentation level when emitting SPARK Ada translation of the RTLs. +extern unsigned short STARS_SPARK_IndentCount; + +// Counters for analyzing memory use for allocated but unused capacity in vectors. +extern unsigned long UnusedStructCount; // various structs +extern unsigned long UnusedIntCount; // int, ea_t, ptr, other 4-byte objects + +// Counters for dead metadata analysis. +extern unsigned long DeadMetadataCount; +extern unsigned long LiveMetadataCount; + +// Counters for indirect jump resolution. +extern unsigned long ResolvedIndirectJumpCount; +extern unsigned long UnresolvedIndirectJumpCount; + +// Counters for measuring SCCP success in finding constant DEFs. +extern unsigned long ConstantDEFCount; +extern unsigned long AlwaysTakenBranchCount; +extern unsigned long NeverTakenBranchCount; + +// Counters for accessing less than machine register width. +extern unsigned long SubwordRegCount; +extern unsigned long SubwordMemCount; +extern unsigned long SubwordAddressRegCount; +extern unsigned long SPARKOperandCount; // total operands printed + +// Counters for numeric error annotations cases. +#define SMP_MEASURE_NUMERIC_ANNOTATIONS 0 +#if SMP_MEASURE_NUMERIC_ANNOTATIONS +extern unsigned long NumericAnnotationsCount12; // cases 1 and 2 +extern unsigned long NumericAnnotationsCount3; // case 3 +extern unsigned long TruncationAnnotationsCount; // case 4 +extern unsigned long SignednessWithoutTruncationCount; // case 5 +extern unsigned long LeaInstOverflowCount; // case 6 +extern unsigned long WidthDoublingTruncationCount; // case 7 +extern unsigned long BenignOverflowInstCount; +extern unsigned long BenignOverflowDefCount; +extern unsigned long SuppressStackPtrOverflowCount; +extern unsigned long SuppressLiveFlagsOverflowCount; +extern unsigned long LiveMultiplyBitsCount; +extern unsigned long BenignTruncationCount; +extern unsigned long SuppressTruncationRegPiecesAllUsed; +extern unsigned long SuppressSignednessOnTruncation; +#endif + +#define SMP_COUNT_MEMORY_ALLOCATIONS 0 +#if SMP_COUNT_MEMORY_ALLOCATIONS +// Counters for analyzing memory use for allocated and used objects. +extern unsigned long SMPInstCount; +extern unsigned long SMPBlockCount; +extern unsigned long SMPDefUseChainCount; +extern unsigned long SMPFuncCount; +extern unsigned long SMPGlobalVarCount; +extern unsigned long SMPLocalVarCount; +extern unsigned long SMPInstBytes; +extern unsigned long SMPDefUseChainBytes; +#define SMP_DU_ADDR_SIZE sizeof(STARS_ea_t) +#endif + +#define STARS_SCCP_GATHER_STATISTICS 1 +#if STARS_SCCP_GATHER_STATISTICS +// Counters for analyzing Sparse Conditional Constant Propagation effectiveness. +extern unsigned long SCCPFuncsWithArgWriteCount; +extern unsigned long SCCPFuncsWithConstantArgWriteCount; +extern unsigned long SCCPOutgoingArgWriteCount; +extern unsigned long SCCPConstantOutgoingArgWriteCount; +#endif + +// Counter for max # of basic blocks seen in one function. +extern unsigned long STARS_MaxBlockCount; + +// strings for printing ZST_SysCallType +extern const char *CallTypeNames[4]; // Need instruction xref info from IRDB @@ -98,11 +176,18 @@ bool SMPGetCmd(STARS_ea_t InstAddr, insn_t &SMPcmd, uint32 &SMPfeatures); #ifdef STARS_IDA_INTERFACE -typedef op_t STARSOpndType; - +#include <pro.h> +#include <ua.hpp> +#include <fpro.h> +#include <xref.hpp> #include <interfaces/abstract/STARSInterface.h> #include <interfaces/idapro/STARSFunction.h> +// Translate RTLs to SPARK-Ada? +#define ZST_EMIT_SPARK_ADA_TRANSLATION 0 + +bool SMPGetCmd(STARS_ea_t InstAddr, insn_t &SMPcmd, uint32_t &SMPfeatures); + // Globals, typedefs and macros for STARS_IDA_INTERFACE only #define SMP_getseg(addr) (global_stars_interface->getseg(addr)) #define SMP_getnseg(index) (global_stars_interface->getnseg(index)) @@ -141,8 +226,6 @@ typedef op_t STARSOpndType; #define SMP_get_frame(ptr_to_func_t) get_frame((func_t*)*dynamic_cast<STARS_IDA_Function_t*>(ptr_to_func_t)) #endif #define SMP_get_member_name(mid, buf, bufsize) get_member_name(mid, buf, bufsize) -#define SMP_get_item_end(addr) get_item_end(addr) -#define SMP_getFlags(addr) getFlags(addr) #define SMP_isHead(flags) isHead(flags) #define SMP_isCode(flags) isCode(flags) #define SMP_add_cref(from, to, type) add_cref(from, to, type) @@ -168,6 +251,10 @@ struct SMP_xref_t { #else // Globals, typedefs and macros for STARS_IRDB_INTERFACE only + +// Translate RTLs to SPARK-Ada? +#define ZST_EMIT_SPARK_ADA_TRANSLATION 0 + #define SMP_strncat(str1, str2, len) strncat(str1, str2, len) #define SMP_strncpy(str1, str2, len) strncpy(str1, str2, len) #define SMP_snprintf(...) snprintf(__VA_ARGS__) diff --git a/include/interfaces/STARSTypes.h b/include/interfaces/STARSTypes.h index cea290da..c0d94c99 100644 --- a/include/interfaces/STARSTypes.h +++ b/include/interfaces/STARSTypes.h @@ -30,8 +30,9 @@ // another disassembler, etc. // -#if 0 #include <memory> + +#if 0 #include <string> #include <utility> #include <list> @@ -43,14 +44,24 @@ #include <cstddef> #include <cstdint> -#if 0 -#include <pro.h> -#include <ida.hpp> -#include <ua.hpp> -#include <funcs.hpp> -#include <frame.hpp> -#include <xref.hpp> -#endif +// Mimic the MAXSTR constant from IDA Pro. +#define STARS_MAXSTR 1024 + +// Security policies for the Zephyr Security Toolkit. +enum ZST_Policy { + ZST_DISALLOW = 0, + ZST_WHITELIST = 1, + ZST_BLACKLIST = 2, + ZST_ALLOWALL = 3 +}; + +// What type of system call, for Zephyr Security Toolkit monitoring. +enum ZST_SysCallType { + ZST_UNMONITORED_CALL, + ZST_HIGHPRIVILEGE_CALL, + ZST_FILE_CALL, + ZST_NETWORK_CALL +}; #ifdef __EA64__ // We imitate IDA Pro typedefs exactly, rather than assuming that unsigned long long is the same as uint64_t, etc. @@ -74,4 +85,1432 @@ typedef ptrdiff_t STARS_ssize_t; class STARS_op_t; typedef std::shared_ptr<class STARS_op_t> STARSOpndTypePtr; +// Function start and end addresses (for function entry chunks only). +// Tracked in STARS_Program_t because IDA Pro 5.1 seemed to have a memory overwriting +// problem when iterating through all functions in the program. An existing +// func_t *ChunkInfo data structure was getting overwritten by one of the +// function func_t data structures, causing changes of startEA and endEA among +// other things. Also helps identify chunked functions. +struct SMP_bounds_t { + STARS_ea_t startEA; + STARS_ea_t endEA; +}; + +// The following enumeration exactly matches the IDA Pro Intel x86 register enumeration "RegNo" +// found in <intel.hpp> with the prefix STARS_x86_ added to each value. +enum STARS_RegNo +{ + STARS_x86_R_none = -1, + STARS_x86_R_ax = 0, + STARS_x86_R_cx = 1, + STARS_x86_R_dx = 2, + STARS_x86_R_bx = 3, + STARS_x86_R_sp = 4, + STARS_x86_R_bp = 5, + STARS_x86_R_si = 6, + STARS_x86_R_di = 7, + STARS_x86_R_r8 = 8, + STARS_x86_R_r9 = 9, + STARS_x86_R_r10 = 10, + STARS_x86_R_r11 = 11, + STARS_x86_R_r12 = 12, + STARS_x86_R_r13 = 13, + STARS_x86_R_r14 = 14, + STARS_x86_R_r15 = 15, + + STARS_x86_R_al = 16, + STARS_x86_R_cl = 17, + STARS_x86_R_dl = 18, + STARS_x86_R_bl = 19, + STARS_x86_R_ah = 20, + STARS_x86_R_ch = 21, + STARS_x86_R_dh = 22, + STARS_x86_R_bh = 23, + + STARS_x86_R_spl = 24, + STARS_x86_R_bpl = 25, + STARS_x86_R_sil = 26, + STARS_x86_R_dil = 27, + + STARS_x86_R_ip = 28, + + STARS_x86_R_es = 29, // 0 + STARS_x86_R_cs = 30, // 1 + STARS_x86_R_ss = 31, // 2 + STARS_x86_R_ds = 32, // 3 + STARS_x86_R_fs = 33, + STARS_x86_R_gs = 34, + + STARS_x86_R_cf = 35, // main cc's + STARS_x86_R_zf = 36, + STARS_x86_R_sf = 37, + STARS_x86_R_of = 38, + + STARS_x86_R_pf = 39, // additional cc's + STARS_x86_R_af = 40, + STARS_x86_R_tf = 41, + STARS_x86_R_if = 42, + STARS_x86_R_df = 43, + + STARS_x86_R_efl = 44, // eflags + + // the following registers will be used in the disassembly + // starting from ida v5.7 + + STARS_x86_R_st0 = 45, // floating point registers (not used in disassembly) + STARS_x86_R_st1 = 46, + STARS_x86_R_st2 = 47, + STARS_x86_R_st3 = 48, + STARS_x86_R_st4 = 49, + STARS_x86_R_st5 = 50, + STARS_x86_R_st6 = 51, + STARS_x86_R_st7 = 52, + STARS_x86_R_fpctrl = 53,// fpu control register + STARS_x86_R_fpstat = 54,// fpu status register + STARS_x86_R_fptags = 55,// fpu tags register + + STARS_x86_R_mm0 = 56, // mmx registers + STARS_x86_R_mm1 = 57, + STARS_x86_R_mm2 = 58, + STARS_x86_R_mm3 = 59, + STARS_x86_R_mm4 = 60, + STARS_x86_R_mm5 = 61, + STARS_x86_R_mm6 = 62, + STARS_x86_R_mm7 = 63, + + STARS_x86_R_xmm0 = 64, // xmm registers + STARS_x86_R_xmm1 = 65, + STARS_x86_R_xmm2 = 66, + STARS_x86_R_xmm3 = 67, + STARS_x86_R_xmm4 = 68, + STARS_x86_R_xmm5 = 69, + STARS_x86_R_xmm6 = 70, + STARS_x86_R_xmm7 = 71, + STARS_x86_R_xmm8 = 72, + STARS_x86_R_xmm9 = 73, + STARS_x86_R_xmm10 = 74, + STARS_x86_R_xmm11 = 75, + STARS_x86_R_xmm12 = 76, + STARS_x86_R_xmm13 = 77, + STARS_x86_R_xmm14 = 78, + STARS_x86_R_xmm15 = 79, + STARS_x86_R_mxcsr = 80, + + STARS_x86_R_ymm0 = 81, // AVX 256-bit registers + STARS_x86_R_ymm1 = 82, + STARS_x86_R_ymm2 = 83, + STARS_x86_R_ymm3 = 84, + STARS_x86_R_ymm4 = 85, + STARS_x86_R_ymm5 = 86, + STARS_x86_R_ymm6 = 87, + STARS_x86_R_ymm7 = 88, + STARS_x86_R_ymm8 = 89, + STARS_x86_R_ymm9 = 90, + STARS_x86_R_ymm10 = 91, + STARS_x86_R_ymm11 = 92, + STARS_x86_R_ymm12 = 93, + STARS_x86_R_ymm13 = 94, + STARS_x86_R_ymm14 = 95, + STARS_x86_R_ymm15 = 96, + + STARS_x86_R_last, +}; + + +// The following enumeration exactly matches the IDA Pro Intel x86 instruction enumeration +// found in <allins.hpp>. The prefix NN_ has been changed to STARS_NN_ for each value. With +// each release of IDA Pro, the <allins.hpp> file must be inspected to see if new opcodes +// have been added by the out-of-control maniacs at Intel. If so, copy, paste, and replace +// the NN_ prefix with STARS_NN_ here. + +enum +{ + STARS_NN_null = 0, // Unknown Operation + STARS_NN_aaa, // ASCII Adjust after Addition + STARS_NN_aad, // ASCII Adjust AX before Division + STARS_NN_aam, // ASCII Adjust AX after Multiply + STARS_NN_aas, // ASCII Adjust AL after Subtraction + STARS_NN_adc, // Add with Carry + STARS_NN_add, // Add + STARS_NN_and, // Logical AND + STARS_NN_arpl, // Adjust RPL Field of Selector + STARS_NN_bound, // Check Array Index Against Bounds + STARS_NN_bsf, // Bit Scan Forward + STARS_NN_bsr, // Bit Scan Reverse + STARS_NN_bt, // Bit Test + STARS_NN_btc, // Bit Test and Complement + STARS_NN_btr, // Bit Test and Reset + STARS_NN_bts, // Bit Test and Set + STARS_NN_call, // Call Procedure + STARS_NN_callfi, // Indirect Call Far Procedure + STARS_NN_callni, // Indirect Call Near Procedure + STARS_NN_cbw, // AL -> AX (with sign) + STARS_NN_cwde, // AX -> EAX (with sign) + STARS_NN_cdqe, // EAX -> RAX (with sign) + STARS_NN_clc, // Clear Carry Flag + STARS_NN_cld, // Clear Direction Flag + STARS_NN_cli, // Clear Interrupt Flag + STARS_NN_clts, // Clear Task-Switched Flag in CR0 + STARS_NN_cmc, // Complement Carry Flag + STARS_NN_cmp, // Compare Two Operands + STARS_NN_cmps, // Compare Strings + STARS_NN_cwd, // AX -> DX:AX (with sign) + STARS_NN_cdq, // EAX -> EDX:EAX (with sign) + STARS_NN_cqo, // RAX -> RDX:RAX (with sign) + STARS_NN_daa, // Decimal Adjust AL after Addition + STARS_NN_das, // Decimal Adjust AL after Subtraction + STARS_NN_dec, // Decrement by 1 + STARS_NN_div, // Unsigned Divide + STARS_NN_enterw, // Make Stack Frame for Procedure Parameters + STARS_NN_enter, // Make Stack Frame for Procedure Parameters + STARS_NN_enterd, // Make Stack Frame for Procedure Parameters + STARS_NN_enterq, // Make Stack Frame for Procedure Parameters + STARS_NN_hlt, // Halt + STARS_NN_idiv, // Signed Divide + STARS_NN_imul, // Signed Multiply + STARS_NN_in, // Input from Port + STARS_NN_inc, // Increment by 1 + STARS_NN_ins, // Input Byte(s) from Port to String + STARS_NN_int, // Call to Interrupt Procedure + STARS_NN_into, // Call to Interrupt Procedure if Overflow Flag = 1 + STARS_NN_int3, // Trap to Debugger + STARS_NN_iretw, // Interrupt Return + STARS_NN_iret, // Interrupt Return + STARS_NN_iretd, // Interrupt Return (use32) + STARS_NN_iretq, // Interrupt Return (use64) + STARS_NN_ja, // Jump if Above (CF=0 & ZF=0) + STARS_NN_jae, // Jump if Above or Equal (CF=0) + STARS_NN_jb, // Jump if Below (CF=1) + STARS_NN_jbe, // Jump if Below or Equal (CF=1 | ZF=1) + STARS_NN_jc, // Jump if Carry (CF=1) + STARS_NN_jcxz, // Jump if CX is 0 + STARS_NN_jecxz, // Jump if ECX is 0 + STARS_NN_jrcxz, // Jump if RCX is 0 + STARS_NN_je, // Jump if Equal (ZF=1) + STARS_NN_jg, // Jump if Greater (ZF=0 & SF=OF) + STARS_NN_jge, // Jump if Greater or Equal (SF=OF) + STARS_NN_jl, // Jump if Less (SF!=OF) + STARS_NN_jle, // Jump if Less or Equal (ZF=1 | SF!=OF) + STARS_NN_jna, // Jump if Not Above (CF=1 | ZF=1) + STARS_NN_jnae, // Jump if Not Above or Equal (CF=1) + STARS_NN_jnb, // Jump if Not Below (CF=0) + STARS_NN_jnbe, // Jump if Not Below or Equal (CF=0 & ZF=0) + STARS_NN_jnc, // Jump if Not Carry (CF=0) + STARS_NN_jne, // Jump if Not Equal (ZF=0) + STARS_NN_jng, // Jump if Not Greater (ZF=1 | SF!=OF) + STARS_NN_jnge, // Jump if Not Greater or Equal (ZF=1) + STARS_NN_jnl, // Jump if Not Less (SF=OF) + STARS_NN_jnle, // Jump if Not Less or Equal (ZF=0 & SF=OF) + STARS_NN_jno, // Jump if Not Overflow (OF=0) + STARS_NN_jnp, // Jump if Not Parity (PF=0) + STARS_NN_jns, // Jump if Not Sign (SF=0) + STARS_NN_jnz, // Jump if Not Zero (ZF=0) + STARS_NN_jo, // Jump if Overflow (OF=1) + STARS_NN_jp, // Jump if Parity (PF=1) + STARS_NN_jpe, // Jump if Parity Even (PF=1) + STARS_NN_jpo, // Jump if Parity Odd (PF=0) + STARS_NN_js, // Jump if Sign (SF=1) + STARS_NN_jz, // Jump if Zero (ZF=1) + STARS_NN_jmp, // Jump + STARS_NN_jmpfi, // Indirect Far Jump + STARS_NN_jmpni, // Indirect Near Jump + STARS_NN_jmpshort, // Jump Short (not used) + STARS_NN_lahf, // Load Flags into AH Register + STARS_NN_lar, // Load Access Right Byte + STARS_NN_lea, // Load Effective Address + STARS_NN_leavew, // High Level Procedure Exit + STARS_NN_leave, // High Level Procedure Exit + STARS_NN_leaved, // High Level Procedure Exit + STARS_NN_leaveq, // High Level Procedure Exit + STARS_NN_lgdt, // Load Global Descriptor Table Register + STARS_NN_lidt, // Load Interrupt Descriptor Table Register + STARS_NN_lgs, // Load Full Pointer to GS:xx + STARS_NN_lss, // Load Full Pointer to SS:xx + STARS_NN_lds, // Load Full Pointer to DS:xx + STARS_NN_les, // Load Full Pointer to ES:xx + STARS_NN_lfs, // Load Full Pointer to FS:xx + STARS_NN_lldt, // Load Local Descriptor Table Register + STARS_NN_lmsw, // Load Machine Status Word + STARS_NN_lock, // Assert LOCK# Signal Prefix + STARS_NN_lods, // Load String + STARS_NN_loopw, // Loop while ECX != 0 + STARS_NN_loop, // Loop while CX != 0 + STARS_NN_loopd, // Loop while ECX != 0 + STARS_NN_loopq, // Loop while RCX != 0 + STARS_NN_loopwe, // Loop while CX != 0 and ZF=1 + STARS_NN_loope, // Loop while rCX != 0 and ZF=1 + STARS_NN_loopde, // Loop while ECX != 0 and ZF=1 + STARS_NN_loopqe, // Loop while RCX != 0 and ZF=1 + STARS_NN_loopwne, // Loop while CX != 0 and ZF=0 + STARS_NN_loopne, // Loop while rCX != 0 and ZF=0 + STARS_NN_loopdne, // Loop while ECX != 0 and ZF=0 + STARS_NN_loopqne, // Loop while RCX != 0 and ZF=0 + STARS_NN_lsl, // Load Segment Limit + STARS_NN_ltr, // Load Task Register + STARS_NN_mov, // Move Data + STARS_NN_movsp, // Move to/from Special Registers + STARS_NN_movs, // Move Byte(s) from String to String + STARS_NN_movsx, // Move with Sign-Extend + STARS_NN_movzx, // Move with Zero-Extend + STARS_NN_mul, // Unsigned Multiplication of AL or AX + STARS_NN_neg, // Two's Complement Negation + STARS_NN_nop, // No Operation + STARS_NN_not, // One's Complement Negation + STARS_NN_or, // Logical Inclusive OR + STARS_NN_out, // Output to Port + STARS_NN_outs, // Output Byte(s) to Port + STARS_NN_pop, // Pop a word from the Stack + STARS_NN_popaw, // Pop all General Registers + STARS_NN_popa, // Pop all General Registers + STARS_NN_popad, // Pop all General Registers (use32) + STARS_NN_popaq, // Pop all General Registers (use64) + STARS_NN_popfw, // Pop Stack into Flags Register + STARS_NN_popf, // Pop Stack into Flags Register + STARS_NN_popfd, // Pop Stack into Eflags Register + STARS_NN_popfq, // Pop Stack into Rflags Register + STARS_NN_push, // Push Operand onto the Stack + STARS_NN_pushaw, // Push all General Registers + STARS_NN_pusha, // Push all General Registers + STARS_NN_pushad, // Push all General Registers (use32) + STARS_NN_pushaq, // Push all General Registers (use64) + STARS_NN_pushfw, // Push Flags Register onto the Stack + STARS_NN_pushf, // Push Flags Register onto the Stack + STARS_NN_pushfd, // Push Flags Register onto the Stack (use32) + STARS_NN_pushfq, // Push Flags Register onto the Stack (use64) + STARS_NN_rcl, // Rotate Through Carry Left + STARS_NN_rcr, // Rotate Through Carry Right + STARS_NN_rol, // Rotate Left + STARS_NN_ror, // Rotate Right + STARS_NN_rep, // Repeat String Operation + STARS_NN_repe, // Repeat String Operation while ZF=1 + STARS_NN_repne, // Repeat String Operation while ZF=0 + STARS_NN_retn, // Return Near from Procedure + STARS_NN_retf, // Return Far from Procedure + STARS_NN_sahf, // Store AH into Flags Register + STARS_NN_sal, // Shift Arithmetic Left + STARS_NN_sar, // Shift Arithmetic Right + STARS_NN_shl, // Shift Logical Left + STARS_NN_shr, // Shift Logical Right + STARS_NN_sbb, // Integer Subtraction with Borrow + STARS_NN_scas, // Compare String + STARS_NN_seta, // Set Byte if Above (CF=0 & ZF=0) + STARS_NN_setae, // Set Byte if Above or Equal (CF=0) + STARS_NN_setb, // Set Byte if Below (CF=1) + STARS_NN_setbe, // Set Byte if Below or Equal (CF=1 | ZF=1) + STARS_NN_setc, // Set Byte if Carry (CF=1) + STARS_NN_sete, // Set Byte if Equal (ZF=1) + STARS_NN_setg, // Set Byte if Greater (ZF=0 & SF=OF) + STARS_NN_setge, // Set Byte if Greater or Equal (SF=OF) + STARS_NN_setl, // Set Byte if Less (SF!=OF) + STARS_NN_setle, // Set Byte if Less or Equal (ZF=1 | SF!=OF) + STARS_NN_setna, // Set Byte if Not Above (CF=1 | ZF=1) + STARS_NN_setnae, // Set Byte if Not Above or Equal (CF=1) + STARS_NN_setnb, // Set Byte if Not Below (CF=0) + STARS_NN_setnbe, // Set Byte if Not Below or Equal (CF=0 & ZF=0) + STARS_NN_setnc, // Set Byte if Not Carry (CF=0) + STARS_NN_setne, // Set Byte if Not Equal (ZF=0) + STARS_NN_setng, // Set Byte if Not Greater (ZF=1 | SF!=OF) + STARS_NN_setnge, // Set Byte if Not Greater or Equal (ZF=1) + STARS_NN_setnl, // Set Byte if Not Less (SF=OF) + STARS_NN_setnle, // Set Byte if Not Less or Equal (ZF=0 & SF=OF) + STARS_NN_setno, // Set Byte if Not Overflow (OF=0) + STARS_NN_setnp, // Set Byte if Not Parity (PF=0) + STARS_NN_setns, // Set Byte if Not Sign (SF=0) + STARS_NN_setnz, // Set Byte if Not Zero (ZF=0) + STARS_NN_seto, // Set Byte if Overflow (OF=1) + STARS_NN_setp, // Set Byte if Parity (PF=1) + STARS_NN_setpe, // Set Byte if Parity Even (PF=1) + STARS_NN_setpo, // Set Byte if Parity Odd (PF=0) + STARS_NN_sets, // Set Byte if Sign (SF=1) + STARS_NN_setz, // Set Byte if Zero (ZF=1) + STARS_NN_sgdt, // Store Global Descriptor Table Register + STARS_NN_sidt, // Store Interrupt Descriptor Table Register + STARS_NN_shld, // Double Precision Shift Left + STARS_NN_shrd, // Double Precision Shift Right + STARS_NN_sldt, // Store Local Descriptor Table Register + STARS_NN_smsw, // Store Machine Status Word + STARS_NN_stc, // Set Carry Flag + STARS_NN_std, // Set Direction Flag + STARS_NN_sti, // Set Interrupt Flag + STARS_NN_stos, // Store String + STARS_NN_str, // Store Task Register + STARS_NN_sub, // Integer Subtraction + STARS_NN_test, // Logical Compare + STARS_NN_verr, // Verify a Segment for Reading + STARS_NN_verw, // Verify a Segment for Writing + STARS_NN_wait, // Wait until BUSY# Pin is Inactive (HIGH) + STARS_NN_xchg, // Exchange Register/Memory with Register + STARS_NN_xlat, // Table Lookup Translation + STARS_NN_xor, // Logical Exclusive OR + + // + // 486 instructions + // + + STARS_NN_cmpxchg, // Compare and Exchange + STARS_NN_bswap, // Swap bits in EAX + STARS_NN_xadd, // t<-dest; dest<-src+dest; src<-t + STARS_NN_invd, // Invalidate Data Cache + STARS_NN_wbinvd, // Invalidate Data Cache (write changes) + STARS_NN_invlpg, // Invalidate TLB entry + + // + // Pentium instructions + // + + STARS_NN_rdmsr, // Read Machine Status Register + STARS_NN_wrmsr, // Write Machine Status Register + STARS_NN_cpuid, // Get CPU ID + STARS_NN_cmpxchg8b, // Compare and Exchange Eight Bytes + STARS_NN_rdtsc, // Read Time Stamp Counter + STARS_NN_rsm, // Resume from System Management Mode + + // + // Pentium Pro instructions + // + + STARS_NN_cmova, // Move if Above (CF=0 & ZF=0) + STARS_NN_cmovb, // Move if Below (CF=1) + STARS_NN_cmovbe, // Move if Below or Equal (CF=1 | ZF=1) + STARS_NN_cmovg, // Move if Greater (ZF=0 & SF=OF) + STARS_NN_cmovge, // Move if Greater or Equal (SF=OF) + STARS_NN_cmovl, // Move if Less (SF!=OF) + STARS_NN_cmovle, // Move if Less or Equal (ZF=1 | SF!=OF) + STARS_NN_cmovnb, // Move if Not Below (CF=0) + STARS_NN_cmovno, // Move if Not Overflow (OF=0) + STARS_NN_cmovnp, // Move if Not Parity (PF=0) + STARS_NN_cmovns, // Move if Not Sign (SF=0) + STARS_NN_cmovnz, // Move if Not Zero (ZF=0) + STARS_NN_cmovo, // Move if Overflow (OF=1) + STARS_NN_cmovp, // Move if Parity (PF=1) + STARS_NN_cmovs, // Move if Sign (SF=1) + STARS_NN_cmovz, // Move if Zero (ZF=1) + STARS_NN_fcmovb, // Floating Move if Below + STARS_NN_fcmove, // Floating Move if Equal + STARS_NN_fcmovbe, // Floating Move if Below or Equal + STARS_NN_fcmovu, // Floating Move if Unordered + STARS_NN_fcmovnb, // Floating Move if Not Below + STARS_NN_fcmovne, // Floating Move if Not Equal + STARS_NN_fcmovnbe, // Floating Move if Not Below or Equal + STARS_NN_fcmovnu, // Floating Move if Not Unordered + STARS_NN_fcomi, // FP Compare, result in EFLAGS + STARS_NN_fucomi, // FP Unordered Compare, result in EFLAGS + STARS_NN_fcomip, // FP Compare, result in EFLAGS, pop stack + STARS_NN_fucomip, // FP Unordered Compare, result in EFLAGS, pop stack + STARS_NN_rdpmc, // Read Performance Monitor Counter + + // + // FPP instructuions + // + + STARS_NN_fld, // Load Real + STARS_NN_fst, // Store Real + STARS_NN_fstp, // Store Real and Pop + STARS_NN_fxch, // Exchange Registers + STARS_NN_fild, // Load Integer + STARS_NN_fist, // Store Integer + STARS_NN_fistp, // Store Integer and Pop + STARS_NN_fbld, // Load BCD + STARS_NN_fbstp, // Store BCD and Pop + STARS_NN_fadd, // Add Real + STARS_NN_faddp, // Add Real and Pop + STARS_NN_fiadd, // Add Integer + STARS_NN_fsub, // Subtract Real + STARS_NN_fsubp, // Subtract Real and Pop + STARS_NN_fisub, // Subtract Integer + STARS_NN_fsubr, // Subtract Real Reversed + STARS_NN_fsubrp, // Subtract Real Reversed and Pop + STARS_NN_fisubr, // Subtract Integer Reversed + STARS_NN_fmul, // Multiply Real + STARS_NN_fmulp, // Multiply Real and Pop + STARS_NN_fimul, // Multiply Integer + STARS_NN_fdiv, // Divide Real + STARS_NN_fdivp, // Divide Real and Pop + STARS_NN_fidiv, // Divide Integer + STARS_NN_fdivr, // Divide Real Reversed + STARS_NN_fdivrp, // Divide Real Reversed and Pop + STARS_NN_fidivr, // Divide Integer Reversed + STARS_NN_fsqrt, // Square Root + STARS_NN_fscale, // Scale: st(0) <- st(0) * 2^st(1) + STARS_NN_fprem, // Partial Remainder + STARS_NN_frndint, // Round to Integer + STARS_NN_fxtract, // Extract exponent and significand + STARS_NN_fabs, // Absolute value + STARS_NN_fchs, // Change Sign + STARS_NN_fcom, // Compare Real + STARS_NN_fcomp, // Compare Real and Pop + STARS_NN_fcompp, // Compare Real and Pop Twice + STARS_NN_ficom, // Compare Integer + STARS_NN_ficomp, // Compare Integer and Pop + STARS_NN_ftst, // Test + STARS_NN_fxam, // Examine + STARS_NN_fptan, // Partial tangent + STARS_NN_fpatan, // Partial arctangent + STARS_NN_f2xm1, // 2^x - 1 + STARS_NN_fyl2x, // Y * lg2(X) + STARS_NN_fyl2xp1, // Y * lg2(X+1) + STARS_NN_fldz, // Load +0.0 + STARS_NN_fld1, // Load +1.0 + STARS_NN_fldpi, // Load PI=3.14... + STARS_NN_fldl2t, // Load lg2(10) + STARS_NN_fldl2e, // Load lg2(e) + STARS_NN_fldlg2, // Load lg10(2) + STARS_NN_fldln2, // Load ln(2) + STARS_NN_finit, // Initialize Processor + STARS_NN_fninit, // Initialize Processor (no wait) + STARS_NN_fsetpm, // Set Protected Mode + STARS_NN_fldcw, // Load Control Word + STARS_NN_fstcw, // Store Control Word + STARS_NN_fnstcw, // Store Control Word (no wait) + STARS_NN_fstsw, // Store Status Word + STARS_NN_fnstsw, // Store Status Word (no wait) + STARS_NN_fclex, // Clear Exceptions + STARS_NN_fnclex, // Clear Exceptions (no wait) + STARS_NN_fstenv, // Store Environment + STARS_NN_fnstenv, // Store Environment (no wait) + STARS_NN_fldenv, // Load Environment + STARS_NN_fsave, // Save State + STARS_NN_fnsave, // Save State (no wait) + STARS_NN_frstor, // Restore State + STARS_NN_fincstp, // Increment Stack Pointer + STARS_NN_fdecstp, // Decrement Stack Pointer + STARS_NN_ffree, // Free Register + STARS_NN_fnop, // No Operation + STARS_NN_feni, // (8087 only) + STARS_NN_fneni, // (no wait) (8087 only) + STARS_NN_fdisi, // (8087 only) + STARS_NN_fndisi, // (no wait) (8087 only) + + // + // 80387 instructions + // + + STARS_NN_fprem1, // Partial Remainder ( < half ) + STARS_NN_fsincos, // t<-cos(st); st<-sin(st); push t + STARS_NN_fsin, // Sine + STARS_NN_fcos, // Cosine + STARS_NN_fucom, // Compare Unordered Real + STARS_NN_fucomp, // Compare Unordered Real and Pop + STARS_NN_fucompp, // Compare Unordered Real and Pop Twice + + // + // Instructions added 28.02.96 + // + + STARS_NN_setalc, // Set AL to Carry Flag + STARS_NN_svdc, // Save Register and Descriptor + STARS_NN_rsdc, // Restore Register and Descriptor + STARS_NN_svldt, // Save LDTR and Descriptor + STARS_NN_rsldt, // Restore LDTR and Descriptor + STARS_NN_svts, // Save TR and Descriptor + STARS_NN_rsts, // Restore TR and Descriptor + STARS_NN_icebp, // ICE Break Point + STARS_NN_loadall, // Load the entire CPU state from ES:EDI + + // + // MMX instructions + // + + STARS_NN_emms, // Empty MMX state + STARS_NN_movd, // Move 32 bits + STARS_NN_movq, // Move 64 bits + STARS_NN_packsswb, // Pack with Signed Saturation (Word->Byte) + STARS_NN_packssdw, // Pack with Signed Saturation (Dword->Word) + STARS_NN_packuswb, // Pack with Unsigned Saturation (Word->Byte) + STARS_NN_paddb, // Packed Add Byte + STARS_NN_paddw, // Packed Add Word + STARS_NN_paddd, // Packed Add Dword + STARS_NN_paddsb, // Packed Add with Saturation (Byte) + STARS_NN_paddsw, // Packed Add with Saturation (Word) + STARS_NN_paddusb, // Packed Add Unsigned with Saturation (Byte) + STARS_NN_paddusw, // Packed Add Unsigned with Saturation (Word) + STARS_NN_pand, // Bitwise Logical And + STARS_NN_pandn, // Bitwise Logical And Not + STARS_NN_pcmpeqb, // Packed Compare for Equal (Byte) + STARS_NN_pcmpeqw, // Packed Compare for Equal (Word) + STARS_NN_pcmpeqd, // Packed Compare for Equal (Dword) + STARS_NN_pcmpgtb, // Packed Compare for Greater Than (Byte) + STARS_NN_pcmpgtw, // Packed Compare for Greater Than (Word) + STARS_NN_pcmpgtd, // Packed Compare for Greater Than (Dword) + STARS_NN_pmaddwd, // Packed Multiply and Add + STARS_NN_pmulhw, // Packed Multiply High + STARS_NN_pmullw, // Packed Multiply Low + STARS_NN_por, // Bitwise Logical Or + STARS_NN_psllw, // Packed Shift Left Logical (Word) + STARS_NN_pslld, // Packed Shift Left Logical (Dword) + STARS_NN_psllq, // Packed Shift Left Logical (Qword) + STARS_NN_psraw, // Packed Shift Right Arithmetic (Word) + STARS_NN_psrad, // Packed Shift Right Arithmetic (Dword) + STARS_NN_psrlw, // Packed Shift Right Logical (Word) + STARS_NN_psrld, // Packed Shift Right Logical (Dword) + STARS_NN_psrlq, // Packed Shift Right Logical (Qword) + STARS_NN_psubb, // Packed Subtract Byte + STARS_NN_psubw, // Packed Subtract Word + STARS_NN_psubd, // Packed Subtract Dword + STARS_NN_psubsb, // Packed Subtract with Saturation (Byte) + STARS_NN_psubsw, // Packed Subtract with Saturation (Word) + STARS_NN_psubusb, // Packed Subtract Unsigned with Saturation (Byte) + STARS_NN_psubusw, // Packed Subtract Unsigned with Saturation (Word) + STARS_NN_punpckhbw, // Unpack High Packed Data (Byte->Word) + STARS_NN_punpckhwd, // Unpack High Packed Data (Word->Dword) + STARS_NN_punpckhdq, // Unpack High Packed Data (Dword->Qword) + STARS_NN_punpcklbw, // Unpack Low Packed Data (Byte->Word) + STARS_NN_punpcklwd, // Unpack Low Packed Data (Word->Dword) + STARS_NN_punpckldq, // Unpack Low Packed Data (Dword->Qword) + STARS_NN_pxor, // Bitwise Logical Exclusive Or + + // + // Undocumented Deschutes processor instructions + // + + STARS_NN_fxsave, // Fast save FP context + STARS_NN_fxrstor, // Fast restore FP context + + // Pentium II instructions + + STARS_NN_sysenter, // Fast Transition to System Call Entry Point + STARS_NN_sysexit, // Fast Transition from System Call Entry Point + + // 3DNow! instructions + + STARS_NN_pavgusb, // Packed 8-bit Unsigned Integer Averaging + STARS_NN_pfadd, // Packed Floating-Point Addition + STARS_NN_pfsub, // Packed Floating-Point Subtraction + STARS_NN_pfsubr, // Packed Floating-Point Reverse Subtraction + STARS_NN_pfacc, // Packed Floating-Point Accumulate + STARS_NN_pfcmpge, // Packed Floating-Point Comparison, Greater or Equal + STARS_NN_pfcmpgt, // Packed Floating-Point Comparison, Greater + STARS_NN_pfcmpeq, // Packed Floating-Point Comparison, Equal + STARS_NN_pfmin, // Packed Floating-Point Minimum + STARS_NN_pfmax, // Packed Floating-Point Maximum + STARS_NN_pi2fd, // Packed 32-bit Integer to Floating-Point + STARS_NN_pf2id, // Packed Floating-Point to 32-bit Integer + STARS_NN_pfrcp, // Packed Floating-Point Reciprocal Approximation + STARS_NN_pfrsqrt, // Packed Floating-Point Reciprocal Square Root Approximation + STARS_NN_pfmul, // Packed Floating-Point Multiplication + STARS_NN_pfrcpit1, // Packed Floating-Point Reciprocal First Iteration Step + STARS_NN_pfrsqit1, // Packed Floating-Point Reciprocal Square Root First Iteration Step + STARS_NN_pfrcpit2, // Packed Floating-Point Reciprocal Second Iteration Step + STARS_NN_pmulhrw, // Packed Floating-Point 16-bit Integer Multiply with rounding + STARS_NN_femms, // Faster entry/exit of the MMX or floating-point state + STARS_NN_prefetch, // Prefetch at least a 32-byte line into L1 data cache + STARS_NN_prefetchw, // Prefetch processor cache line into L1 data cache (mark as modified) + + + // Pentium III instructions + + STARS_NN_addps, // Packed Single-FP Add + STARS_NN_addss, // Scalar Single-FP Add + STARS_NN_andnps, // Bitwise Logical And Not for Single-FP + STARS_NN_andps, // Bitwise Logical And for Single-FP + STARS_NN_cmpps, // Packed Single-FP Compare + STARS_NN_cmpss, // Scalar Single-FP Compare + STARS_NN_comiss, // Scalar Ordered Single-FP Compare and Set EFLAGS + STARS_NN_cvtpi2ps, // Packed signed INT32 to Packed Single-FP conversion + STARS_NN_cvtps2pi, // Packed Single-FP to Packed INT32 conversion + STARS_NN_cvtsi2ss, // Scalar signed INT32 to Single-FP conversion + STARS_NN_cvtss2si, // Scalar Single-FP to signed INT32 conversion + STARS_NN_cvttps2pi, // Packed Single-FP to Packed INT32 conversion (truncate) + STARS_NN_cvttss2si, // Scalar Single-FP to signed INT32 conversion (truncate) + STARS_NN_divps, // Packed Single-FP Divide + STARS_NN_divss, // Scalar Single-FP Divide + STARS_NN_ldmxcsr, // Load Streaming SIMD Extensions Technology Control/Status Register + STARS_NN_maxps, // Packed Single-FP Maximum + STARS_NN_maxss, // Scalar Single-FP Maximum + STARS_NN_minps, // Packed Single-FP Minimum + STARS_NN_minss, // Scalar Single-FP Minimum + STARS_NN_movaps, // Move Aligned Four Packed Single-FP + STARS_NN_movhlps, // Move High to Low Packed Single-FP + STARS_NN_movhps, // Move High Packed Single-FP + STARS_NN_movlhps, // Move Low to High Packed Single-FP + STARS_NN_movlps, // Move Low Packed Single-FP + STARS_NN_movmskps, // Move Mask to Register + STARS_NN_movss, // Move Scalar Single-FP + STARS_NN_movups, // Move Unaligned Four Packed Single-FP + STARS_NN_mulps, // Packed Single-FP Multiply + STARS_NN_mulss, // Scalar Single-FP Multiply + STARS_NN_orps, // Bitwise Logical OR for Single-FP Data + STARS_NN_rcpps, // Packed Single-FP Reciprocal + STARS_NN_rcpss, // Scalar Single-FP Reciprocal + STARS_NN_rsqrtps, // Packed Single-FP Square Root Reciprocal + STARS_NN_rsqrtss, // Scalar Single-FP Square Root Reciprocal + STARS_NN_shufps, // Shuffle Single-FP + STARS_NN_sqrtps, // Packed Single-FP Square Root + STARS_NN_sqrtss, // Scalar Single-FP Square Root + STARS_NN_stmxcsr, // Store Streaming SIMD Extensions Technology Control/Status Register + STARS_NN_subps, // Packed Single-FP Subtract + STARS_NN_subss, // Scalar Single-FP Subtract + STARS_NN_ucomiss, // Scalar Unordered Single-FP Compare and Set EFLAGS + STARS_NN_unpckhps, // Unpack High Packed Single-FP Data + STARS_NN_unpcklps, // Unpack Low Packed Single-FP Data + STARS_NN_xorps, // Bitwise Logical XOR for Single-FP Data + STARS_NN_pavgb, // Packed Average (Byte) + STARS_NN_pavgw, // Packed Average (Word) + STARS_NN_pextrw, // Extract Word + STARS_NN_pinsrw, // Insert Word + STARS_NN_pmaxsw, // Packed Signed Integer Word Maximum + STARS_NN_pmaxub, // Packed Unsigned Integer Byte Maximum + STARS_NN_pminsw, // Packed Signed Integer Word Minimum + STARS_NN_pminub, // Packed Unsigned Integer Byte Minimum + STARS_NN_pmovmskb, // Move Byte Mask to Integer + STARS_NN_pmulhuw, // Packed Multiply High Unsigned + STARS_NN_psadbw, // Packed Sum of Absolute Differences + STARS_NN_pshufw, // Packed Shuffle Word + STARS_NN_maskmovq, // Byte Mask write + STARS_NN_movntps, // Move Aligned Four Packed Single-FP Non Temporal + STARS_NN_movntq, // Move 64 Bits Non Temporal + STARS_NN_prefetcht0, // Prefetch to all cache levels + STARS_NN_prefetcht1, // Prefetch to all cache levels + STARS_NN_prefetcht2, // Prefetch to L2 cache + STARS_NN_prefetchnta, // Prefetch to L1 cache + STARS_NN_sfence, // Store Fence + + // Pentium III Pseudo instructions + + STARS_NN_cmpeqps, // Packed Single-FP Compare EQ + STARS_NN_cmpltps, // Packed Single-FP Compare LT + STARS_NN_cmpleps, // Packed Single-FP Compare LE + STARS_NN_cmpunordps, // Packed Single-FP Compare UNORD + STARS_NN_cmpneqps, // Packed Single-FP Compare NOT EQ + STARS_NN_cmpnltps, // Packed Single-FP Compare NOT LT + STARS_NN_cmpnleps, // Packed Single-FP Compare NOT LE + STARS_NN_cmpordps, // Packed Single-FP Compare ORDERED + STARS_NN_cmpeqss, // Scalar Single-FP Compare EQ + STARS_NN_cmpltss, // Scalar Single-FP Compare LT + STARS_NN_cmpless, // Scalar Single-FP Compare LE + STARS_NN_cmpunordss, // Scalar Single-FP Compare UNORD + STARS_NN_cmpneqss, // Scalar Single-FP Compare NOT EQ + STARS_NN_cmpnltss, // Scalar Single-FP Compare NOT LT + STARS_NN_cmpnless, // Scalar Single-FP Compare NOT LE + STARS_NN_cmpordss, // Scalar Single-FP Compare ORDERED + + // AMD K7 instructions + + STARS_NN_pf2iw, // Packed Floating-Point to Integer with Sign Extend + STARS_NN_pfnacc, // Packed Floating-Point Negative Accumulate + STARS_NN_pfpnacc, // Packed Floating-Point Mixed Positive-Negative Accumulate + STARS_NN_pi2fw, // Packed 16-bit Integer to Floating-Point + STARS_NN_pswapd, // Packed Swap Double Word + + // Undocumented FP instructions (thanks to norbert.juffa@adm.com) + + STARS_NN_fstp1, // Alias of Store Real and Pop + STARS_NN_fcom2, // Alias of Compare Real + STARS_NN_fcomp3, // Alias of Compare Real and Pop + STARS_NN_fxch4, // Alias of Exchange Registers + STARS_NN_fcomp5, // Alias of Compare Real and Pop + STARS_NN_ffreep, // Free Register and Pop + STARS_NN_fxch7, // Alias of Exchange Registers + STARS_NN_fstp8, // Alias of Store Real and Pop + STARS_NN_fstp9, // Alias of Store Real and Pop + + // Pentium 4 instructions + + STARS_NN_addpd, // Add Packed Double-Precision Floating-Point Values + STARS_NN_addsd, // Add Scalar Double-Precision Floating-Point Values + STARS_NN_andnpd, // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values + STARS_NN_andpd, // Bitwise Logical AND of Packed Double-Precision Floating-Point Values + STARS_NN_clflush, // Flush Cache Line + STARS_NN_cmppd, // Compare Packed Double-Precision Floating-Point Values + STARS_NN_cmpsd, // Compare Scalar Double-Precision Floating-Point Values + STARS_NN_comisd, // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + STARS_NN_cvtdq2pd, // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values + STARS_NN_cvtdq2ps, // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + STARS_NN_cvtpd2dq, // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + STARS_NN_cvtpd2pi, // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + STARS_NN_cvtpd2ps, // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values + STARS_NN_cvtpi2pd, // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + STARS_NN_cvtps2dq, // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + STARS_NN_cvtps2pd, // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values + STARS_NN_cvtsd2si, // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer + STARS_NN_cvtsd2ss, // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value + STARS_NN_cvtsi2sd, // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value + STARS_NN_cvtss2sd, // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value + STARS_NN_cvttpd2dq, // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + STARS_NN_cvttpd2pi, // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + STARS_NN_cvttps2dq, // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + STARS_NN_cvttsd2si, // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer + STARS_NN_divpd, // Divide Packed Double-Precision Floating-Point Values + STARS_NN_divsd, // Divide Scalar Double-Precision Floating-Point Values + STARS_NN_lfence, // Load Fence + STARS_NN_maskmovdqu, // Store Selected Bytes of Double Quadword + STARS_NN_maxpd, // Return Maximum Packed Double-Precision Floating-Point Values + STARS_NN_maxsd, // Return Maximum Scalar Double-Precision Floating-Point Value + STARS_NN_mfence, // Memory Fence + STARS_NN_minpd, // Return Minimum Packed Double-Precision Floating-Point Values + STARS_NN_minsd, // Return Minimum Scalar Double-Precision Floating-Point Value + STARS_NN_movapd, // Move Aligned Packed Double-Precision Floating-Point Values + STARS_NN_movdq2q, // Move Quadword from XMM to MMX Register + STARS_NN_movdqa, // Move Aligned Double Quadword + STARS_NN_movdqu, // Move Unaligned Double Quadword + STARS_NN_movhpd, // Move High Packed Double-Precision Floating-Point Values + STARS_NN_movlpd, // Move Low Packed Double-Precision Floating-Point Values + STARS_NN_movmskpd, // Extract Packed Double-Precision Floating-Point Sign Mask + STARS_NN_movntdq, // Store Double Quadword Using Non-Temporal Hint + STARS_NN_movnti, // Store Doubleword Using Non-Temporal Hint + STARS_NN_movntpd, // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint + STARS_NN_movq2dq, // Move Quadword from MMX to XMM Register + STARS_NN_movsd, // Move Scalar Double-Precision Floating-Point Values + STARS_NN_movupd, // Move Unaligned Packed Double-Precision Floating-Point Values + STARS_NN_mulpd, // Multiply Packed Double-Precision Floating-Point Values + STARS_NN_mulsd, // Multiply Scalar Double-Precision Floating-Point Values + STARS_NN_orpd, // Bitwise Logical OR of Double-Precision Floating-Point Values + STARS_NN_paddq, // Add Packed Quadword Integers + STARS_NN_pause, // Spin Loop Hint + STARS_NN_pmuludq, // Multiply Packed Unsigned Doubleword Integers + STARS_NN_pshufd, // Shuffle Packed Doublewords + STARS_NN_pshufhw, // Shuffle Packed High Words + STARS_NN_pshuflw, // Shuffle Packed Low Words + STARS_NN_pslldq, // Shift Double Quadword Left Logical + STARS_NN_psrldq, // Shift Double Quadword Right Logical + STARS_NN_psubq, // Subtract Packed Quadword Integers + STARS_NN_punpckhqdq, // Unpack High Data + STARS_NN_punpcklqdq, // Unpack Low Data + STARS_NN_shufpd, // Shuffle Packed Double-Precision Floating-Point Values + STARS_NN_sqrtpd, // Compute Square Roots of Packed Double-Precision Floating-Point Values + STARS_NN_sqrtsd, // Compute Square Rootof Scalar Double-Precision Floating-Point Value + STARS_NN_subpd, // Subtract Packed Double-Precision Floating-Point Values + STARS_NN_subsd, // Subtract Scalar Double-Precision Floating-Point Values + STARS_NN_ucomisd, // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + STARS_NN_unpckhpd, // Unpack and Interleave High Packed Double-Precision Floating-Point Values + STARS_NN_unpcklpd, // Unpack and Interleave Low Packed Double-Precision Floating-Point Values + STARS_NN_xorpd, // Bitwise Logical OR of Double-Precision Floating-Point Values + + // AMD syscall/sysret instructions + + STARS_NN_syscall, // Low latency system call + STARS_NN_sysret, // Return from system call + + // AMD64 instructions + + STARS_NN_swapgs, // Exchange GS base with KernelGSBase MSR + + // New Pentium instructions (SSE3) + + STARS_NN_movddup, // Move One Double-FP and Duplicate + STARS_NN_movshdup, // Move Packed Single-FP High and Duplicate + STARS_NN_movsldup, // Move Packed Single-FP Low and Duplicate + + // Missing AMD64 instructions + + STARS_NN_movsxd, // Move with Sign-Extend Doubleword + STARS_NN_cmpxchg16b, // Compare and Exchange 16 Bytes + + // SSE3 instructions + + STARS_NN_addsubpd, // Add /Sub packed DP FP numbers + STARS_NN_addsubps, // Add /Sub packed SP FP numbers + STARS_NN_haddpd, // Add horizontally packed DP FP numbers + STARS_NN_haddps, // Add horizontally packed SP FP numbers + STARS_NN_hsubpd, // Sub horizontally packed DP FP numbers + STARS_NN_hsubps, // Sub horizontally packed SP FP numbers + STARS_NN_monitor, // Set up a linear address range to be monitored by hardware + STARS_NN_mwait, // Wait until write-back store performed within the range specified by the MONITOR instruction + STARS_NN_fisttp, // Store ST in intXX (chop) and pop + STARS_NN_lddqu, // Load unaligned integer 128-bit + + // SSSE3 instructions + + STARS_NN_psignb, // Packed SIGN Byte + STARS_NN_psignw, // Packed SIGN Word + STARS_NN_psignd, // Packed SIGN Doubleword + STARS_NN_pshufb, // Packed Shuffle Bytes + STARS_NN_pmulhrsw, // Packed Multiply High with Round and Scale + STARS_NN_pmaddubsw, // Multiply and Add Packed Signed and Unsigned Bytes + STARS_NN_phsubsw, // Packed Horizontal Subtract and Saturate + STARS_NN_phaddsw, // Packed Horizontal Add and Saturate + STARS_NN_phaddw, // Packed Horizontal Add Word + STARS_NN_phaddd, // Packed Horizontal Add Doubleword + STARS_NN_phsubw, // Packed Horizontal Subtract Word + STARS_NN_phsubd, // Packed Horizontal Subtract Doubleword + STARS_NN_palignr, // Packed Align Right + STARS_NN_pabsb, // Packed Absolute Value Byte + STARS_NN_pabsw, // Packed Absolute Value Word + STARS_NN_pabsd, // Packed Absolute Value Doubleword + + // VMX instructions + + STARS_NN_vmcall, // Call to VM Monitor + STARS_NN_vmclear, // Clear Virtual Machine Control Structure + STARS_NN_vmlaunch, // Launch Virtual Machine + STARS_NN_vmresume, // Resume Virtual Machine + STARS_NN_vmptrld, // Load Pointer to Virtual Machine Control Structure + STARS_NN_vmptrst, // Store Pointer to Virtual Machine Control Structure + STARS_NN_vmread, // Read Field from Virtual Machine Control Structure + STARS_NN_vmwrite, // Write Field from Virtual Machine Control Structure + STARS_NN_vmxoff, // Leave VMX Operation + STARS_NN_vmxon, // Enter VMX Operation + + // Undefined Instruction + + STARS_NN_ud2, // Undefined Instruction + + // Added with x86-64 + + STARS_NN_rdtscp, // Read Time-Stamp Counter and Processor ID + + // Geode LX 3DNow! extensions + + STARS_NN_pfrcpv, // Reciprocal Approximation for a Pair of 32-bit Floats + STARS_NN_pfrsqrtv, // Reciprocal Square Root Approximation for a Pair of 32-bit Floats + + // SSE2 pseudoinstructions + + STARS_NN_cmpeqpd, // Packed Double-FP Compare EQ + STARS_NN_cmpltpd, // Packed Double-FP Compare LT + STARS_NN_cmplepd, // Packed Double-FP Compare LE + STARS_NN_cmpunordpd, // Packed Double-FP Compare UNORD + STARS_NN_cmpneqpd, // Packed Double-FP Compare NOT EQ + STARS_NN_cmpnltpd, // Packed Double-FP Compare NOT LT + STARS_NN_cmpnlepd, // Packed Double-FP Compare NOT LE + STARS_NN_cmpordpd, // Packed Double-FP Compare ORDERED + STARS_NN_cmpeqsd, // Scalar Double-FP Compare EQ + STARS_NN_cmpltsd, // Scalar Double-FP Compare LT + STARS_NN_cmplesd, // Scalar Double-FP Compare LE + STARS_NN_cmpunordsd, // Scalar Double-FP Compare UNORD + STARS_NN_cmpneqsd, // Scalar Double-FP Compare NOT EQ + STARS_NN_cmpnltsd, // Scalar Double-FP Compare NOT LT + STARS_NN_cmpnlesd, // Scalar Double-FP Compare NOT LE + STARS_NN_cmpordsd, // Scalar Double-FP Compare ORDERED + + // SSSE4.1 instructions + + STARS_NN_blendpd, // Blend Packed Double Precision Floating-Point Values + STARS_NN_blendps, // Blend Packed Single Precision Floating-Point Values + STARS_NN_blendvpd, // Variable Blend Packed Double Precision Floating-Point Values + STARS_NN_blendvps, // Variable Blend Packed Single Precision Floating-Point Values + STARS_NN_dppd, // Dot Product of Packed Double Precision Floating-Point Values + STARS_NN_dpps, // Dot Product of Packed Single Precision Floating-Point Values + STARS_NN_extractps, // Extract Packed Single Precision Floating-Point Value + STARS_NN_insertps, // Insert Packed Single Precision Floating-Point Value + STARS_NN_movntdqa, // Load Double Quadword Non-Temporal Aligned Hint + STARS_NN_mpsadbw, // Compute Multiple Packed Sums of Absolute Difference + STARS_NN_packusdw, // Pack with Unsigned Saturation + STARS_NN_pblendvb, // Variable Blend Packed Bytes + STARS_NN_pblendw, // Blend Packed Words + STARS_NN_pcmpeqq, // Compare Packed Qword Data for Equal + STARS_NN_pextrb, // Extract Byte + STARS_NN_pextrd, // Extract Dword + STARS_NN_pextrq, // Extract Qword + STARS_NN_phminposuw, // Packed Horizontal Word Minimum + STARS_NN_pinsrb, // Insert Byte + STARS_NN_pinsrd, // Insert Dword + STARS_NN_pinsrq, // Insert Qword + STARS_NN_pmaxsb, // Maximum of Packed Signed Byte Integers + STARS_NN_pmaxsd, // Maximum of Packed Signed Dword Integers + STARS_NN_pmaxud, // Maximum of Packed Unsigned Dword Integers + STARS_NN_pmaxuw, // Maximum of Packed Word Integers + STARS_NN_pminsb, // Minimum of Packed Signed Byte Integers + STARS_NN_pminsd, // Minimum of Packed Signed Dword Integers + STARS_NN_pminud, // Minimum of Packed Unsigned Dword Integers + STARS_NN_pminuw, // Minimum of Packed Word Integers + STARS_NN_pmovsxbw, // Packed Move with Sign Extend + STARS_NN_pmovsxbd, // Packed Move with Sign Extend + STARS_NN_pmovsxbq, // Packed Move with Sign Extend + STARS_NN_pmovsxwd, // Packed Move with Sign Extend + STARS_NN_pmovsxwq, // Packed Move with Sign Extend + STARS_NN_pmovsxdq, // Packed Move with Sign Extend + STARS_NN_pmovzxbw, // Packed Move with Zero Extend + STARS_NN_pmovzxbd, // Packed Move with Zero Extend + STARS_NN_pmovzxbq, // Packed Move with Zero Extend + STARS_NN_pmovzxwd, // Packed Move with Zero Extend + STARS_NN_pmovzxwq, // Packed Move with Zero Extend + STARS_NN_pmovzxdq, // Packed Move with Zero Extend + STARS_NN_pmuldq, // Multiply Packed Signed Dword Integers + STARS_NN_pmulld, // Multiply Packed Signed Dword Integers and Store Low Result + STARS_NN_ptest, // Logical Compare + STARS_NN_roundpd, // Round Packed Double Precision Floating-Point Values + STARS_NN_roundps, // Round Packed Single Precision Floating-Point Values + STARS_NN_roundsd, // Round Scalar Double Precision Floating-Point Values + STARS_NN_roundss, // Round Scalar Single Precision Floating-Point Values + + // SSSE4.2 instructions + + STARS_NN_crc32, // Accumulate CRC32 Value + STARS_NN_pcmpestri, // Packed Compare Explicit Length Strings, Return Index + STARS_NN_pcmpestrm, // Packed Compare Explicit Length Strings, Return Mask + STARS_NN_pcmpistri, // Packed Compare Implicit Length Strings, Return Index + STARS_NN_pcmpistrm, // Packed Compare Implicit Length Strings, Return Mask + STARS_NN_pcmpgtq, // Compare Packed Data for Greater Than + STARS_NN_popcnt, // Return the Count of Number of Bits Set to 1 + + // AMD SSE4a instructions + + STARS_NN_extrq, // Extract Field From Register + STARS_NN_insertq, // Insert Field + STARS_NN_movntsd, // Move Non-Temporal Scalar Double-Precision Floating-Point + STARS_NN_movntss, // Move Non-Temporal Scalar Single-Precision Floating-Point + STARS_NN_lzcnt, // Leading Zero Count + + // xsave/xrstor instructions + + STARS_NN_xgetbv, // Get Value of Extended Control Register + STARS_NN_xrstor, // Restore Processor Extended States + STARS_NN_xsave, // Save Processor Extended States + STARS_NN_xsetbv, // Set Value of Extended Control Register + + // Intel Safer Mode Extensions (SMX) + + STARS_NN_getsec, // Safer Mode Extensions (SMX) Instruction + + // AMD-V Virtualization ISA Extension + + STARS_NN_clgi, // Clear Global Interrupt Flag + STARS_NN_invlpga, // Invalidate TLB Entry in a Specified ASID + STARS_NN_skinit, // Secure Init and Jump with Attestation + STARS_NN_stgi, // Set Global Interrupt Flag + STARS_NN_vmexit, // Stop Executing Guest, Begin Executing Host + STARS_NN_vmload, // Load State from VMCB + STARS_NN_vmmcall, // Call VMM + STARS_NN_vmrun, // Run Virtual Machine + STARS_NN_vmsave, // Save State to VMCB + + // VMX+ instructions + + STARS_NN_invept, // Invalidate Translations Derived from EPT + STARS_NN_invvpid, // Invalidate Translations Based on VPID + + // Intel Atom instructions + + STARS_NN_movbe, // Move Data After Swapping Bytes + + // Intel AES instructions + + STARS_NN_aesenc, // Perform One Round of an AES Encryption Flow + STARS_NN_aesenclast, // Perform the Last Round of an AES Encryption Flow + STARS_NN_aesdec, // Perform One Round of an AES Decryption Flow + STARS_NN_aesdeclast, // Perform the Last Round of an AES Decryption Flow + STARS_NN_aesimc, // Perform the AES InvMixColumn Transformation + STARS_NN_aeskeygenassist, // AES Round Key Generation Assist + + // Carryless multiplication + + STARS_NN_pclmulqdq, // Carry-Less Multiplication Quadword + + // Returns modifies by operand size prefixes + + STARS_NN_retnw, // Return Near from Procedure (use16) + STARS_NN_retnd, // Return Near from Procedure (use32) + STARS_NN_retnq, // Return Near from Procedure (use64) + STARS_NN_retfw, // Return Far from Procedure (use16) + STARS_NN_retfd, // Return Far from Procedure (use32) + STARS_NN_retfq, // Return Far from Procedure (use64) + + // RDRAND support + + STARS_NN_rdrand, // Read Random Number + + // new GPR instructions + + STARS_NN_adcx, // Unsigned Integer Addition of Two Operands with Carry Flag + STARS_NN_adox, // Unsigned Integer Addition of Two Operands with Overflow Flag + STARS_NN_andn, // Logical AND NOT + STARS_NN_bextr, // Bit Field Extract + STARS_NN_blsi, // Extract Lowest Set Isolated Bit + STARS_NN_blsmsk, // Get Mask Up to Lowest Set Bit + STARS_NN_blsr, // Reset Lowest Set Bit + STARS_NN_bzhi, // Zero High Bits Starting with Specified Bit Position + STARS_NN_clac, // Clear AC Flag in EFLAGS Register + STARS_NN_mulx, // Unsigned Multiply Without Affecting Flags + STARS_NN_pdep, // Parallel Bits Deposit + STARS_NN_pext, // Parallel Bits Extract + STARS_NN_rorx, // Rotate Right Logical Without Affecting Flags + STARS_NN_sarx, // Shift Arithmetically Right Without Affecting Flags + STARS_NN_shlx, // Shift Logically Left Without Affecting Flags + STARS_NN_shrx, // Shift Logically Right Without Affecting Flags + STARS_NN_stac, // Set AC Flag in EFLAGS Register + STARS_NN_tzcnt, // Count the Number of Trailing Zero Bits + STARS_NN_xsaveopt, // Save Processor Extended States Optimized + STARS_NN_invpcid, // Invalidate Processor Context ID + STARS_NN_rdseed, // Read Random Seed + STARS_NN_rdfsbase, // Read FS Segment Base + STARS_NN_rdgsbase, // Read GS Segment Base + STARS_NN_wrfsbase, // Write FS Segment Base + STARS_NN_wrgsbase, // Write GS Segment Base + + // new AVX instructions + STARS_NN_vaddpd, // Add Packed Double-Precision Floating-Point Values + STARS_NN_vaddps, // Packed Single-FP Add + STARS_NN_vaddsd, // Add Scalar Double-Precision Floating-Point Values + STARS_NN_vaddss, // Scalar Single-FP Add + STARS_NN_vaddsubpd, // Add /Sub packed DP FP numbers + STARS_NN_vaddsubps, // Add /Sub packed SP FP numbers + STARS_NN_vaesdec, // Perform One Round of an AES Decryption Flow + STARS_NN_vaesdeclast, // Perform the Last Round of an AES Decryption Flow + STARS_NN_vaesenc, // Perform One Round of an AES Encryption Flow + STARS_NN_vaesenclast, // Perform the Last Round of an AES Encryption Flow + STARS_NN_vaesimc, // Perform the AES InvMixColumn Transformation + STARS_NN_vaeskeygenassist, // AES Round Key Generation Assist + STARS_NN_vandnpd, // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values + STARS_NN_vandnps, // Bitwise Logical And Not for Single-FP + STARS_NN_vandpd, // Bitwise Logical AND of Packed Double-Precision Floating-Point Values + STARS_NN_vandps, // Bitwise Logical And for Single-FP + STARS_NN_vblendpd, // Blend Packed Double Precision Floating-Point Values + STARS_NN_vblendps, // Blend Packed Single Precision Floating-Point Values + STARS_NN_vblendvpd, // Variable Blend Packed Double Precision Floating-Point Values + STARS_NN_vblendvps, // Variable Blend Packed Single Precision Floating-Point Values + STARS_NN_vbroadcastf128, // Broadcast 128 Bits of Floating-Point Data + STARS_NN_vbroadcasti128, // Broadcast 128 Bits of Integer Data + STARS_NN_vbroadcastsd, // Broadcast Double-Precision Floating-Point Element + STARS_NN_vbroadcastss, // Broadcast Single-Precision Floating-Point Element + STARS_NN_vcmppd, // Compare Packed Double-Precision Floating-Point Values + STARS_NN_vcmpps, // Packed Single-FP Compare + STARS_NN_vcmpsd, // Compare Scalar Double-Precision Floating-Point Values + STARS_NN_vcmpss, // Scalar Single-FP Compare + STARS_NN_vcomisd, // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + STARS_NN_vcomiss, // Scalar Ordered Single-FP Compare and Set EFLAGS + STARS_NN_vcvtdq2pd, // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values + STARS_NN_vcvtdq2ps, // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + STARS_NN_vcvtpd2dq, // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + STARS_NN_vcvtpd2ps, // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values + STARS_NN_vcvtph2ps, // Convert 16-bit FP Values to Single-Precision FP Values + STARS_NN_vcvtps2dq, // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + STARS_NN_vcvtps2pd, // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values + STARS_NN_vcvtps2ph, // Convert Single-Precision FP value to 16-bit FP value + STARS_NN_vcvtsd2si, // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer + STARS_NN_vcvtsd2ss, // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value + STARS_NN_vcvtsi2sd, // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value + STARS_NN_vcvtsi2ss, // Scalar signed INT32 to Single-FP conversion + STARS_NN_vcvtss2sd, // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value + STARS_NN_vcvtss2si, // Scalar Single-FP to signed INT32 conversion + STARS_NN_vcvttpd2dq, // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + STARS_NN_vcvttps2dq, // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + STARS_NN_vcvttsd2si, // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer + STARS_NN_vcvttss2si, // Scalar Single-FP to signed INT32 conversion (truncate) + STARS_NN_vdivpd, // Divide Packed Double-Precision Floating-Point Values + STARS_NN_vdivps, // Packed Single-FP Divide + STARS_NN_vdivsd, // Divide Scalar Double-Precision Floating-Point Values + STARS_NN_vdivss, // Scalar Single-FP Divide + STARS_NN_vdppd, // Dot Product of Packed Double Precision Floating-Point Values + STARS_NN_vdpps, // Dot Product of Packed Single Precision Floating-Point Values + STARS_NN_vextractf128, // Extract Packed Floating-Point Values + STARS_NN_vextracti128, // Extract Packed Integer Values + STARS_NN_vextractps, // Extract Packed Floating-Point Values + STARS_NN_vfmadd132pd, // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + STARS_NN_vfmadd132ps, // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + STARS_NN_vfmadd132sd, // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + STARS_NN_vfmadd132ss, // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + STARS_NN_vfmadd213pd, // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + STARS_NN_vfmadd213ps, // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + STARS_NN_vfmadd213sd, // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + STARS_NN_vfmadd213ss, // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + STARS_NN_vfmadd231pd, // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + STARS_NN_vfmadd231ps, // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + STARS_NN_vfmadd231sd, // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + STARS_NN_vfmadd231ss, // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + STARS_NN_vfmaddsub132pd, // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + STARS_NN_vfmaddsub132ps, // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + STARS_NN_vfmaddsub213pd, // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + STARS_NN_vfmaddsub213ps, // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + STARS_NN_vfmaddsub231pd, // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + STARS_NN_vfmaddsub231ps, // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + STARS_NN_vfmsub132pd, // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + STARS_NN_vfmsub132ps, // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + STARS_NN_vfmsub132sd, // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + STARS_NN_vfmsub132ss, // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + STARS_NN_vfmsub213pd, // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + STARS_NN_vfmsub213ps, // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + STARS_NN_vfmsub213sd, // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + STARS_NN_vfmsub213ss, // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + STARS_NN_vfmsub231pd, // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + STARS_NN_vfmsub231ps, // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + STARS_NN_vfmsub231sd, // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + STARS_NN_vfmsub231ss, // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + STARS_NN_vfmsubadd132pd, // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + STARS_NN_vfmsubadd132ps, // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + STARS_NN_vfmsubadd213pd, // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + STARS_NN_vfmsubadd213ps, // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + STARS_NN_vfmsubadd231pd, // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + STARS_NN_vfmsubadd231ps, // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + STARS_NN_vfnmadd132pd, // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + STARS_NN_vfnmadd132ps, // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + STARS_NN_vfnmadd132sd, // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + STARS_NN_vfnmadd132ss, // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + STARS_NN_vfnmadd213pd, // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + STARS_NN_vfnmadd213ps, // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + STARS_NN_vfnmadd213sd, // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + STARS_NN_vfnmadd213ss, // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + STARS_NN_vfnmadd231pd, // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + STARS_NN_vfnmadd231ps, // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + STARS_NN_vfnmadd231sd, // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + STARS_NN_vfnmadd231ss, // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + STARS_NN_vfnmsub132pd, // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + STARS_NN_vfnmsub132ps, // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + STARS_NN_vfnmsub132sd, // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + STARS_NN_vfnmsub132ss, // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + STARS_NN_vfnmsub213pd, // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + STARS_NN_vfnmsub213ps, // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + STARS_NN_vfnmsub213sd, // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + STARS_NN_vfnmsub213ss, // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + STARS_NN_vfnmsub231pd, // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + STARS_NN_vfnmsub231ps, // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + STARS_NN_vfnmsub231sd, // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + STARS_NN_vfnmsub231ss, // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + STARS_NN_vgatherdps, // Gather Packed SP FP Values Using Signed Dword Indices + STARS_NN_vgatherdpd, // Gather Packed DP FP Values Using Signed Dword Indices + STARS_NN_vgatherqps, // Gather Packed SP FP Values Using Signed Qword Indices + STARS_NN_vgatherqpd, // Gather Packed DP FP Values Using Signed Qword Indices + STARS_NN_vhaddpd, // Add horizontally packed DP FP numbers + STARS_NN_vhaddps, // Add horizontally packed SP FP numbers + STARS_NN_vhsubpd, // Sub horizontally packed DP FP numbers + STARS_NN_vhsubps, // Sub horizontally packed SP FP numbers + STARS_NN_vinsertf128, // Insert Packed Floating-Point Values + STARS_NN_vinserti128, // Insert Packed Integer Values + STARS_NN_vinsertps, // Insert Packed Single Precision Floating-Point Value + STARS_NN_vlddqu, // Load Unaligned Packed Integer Values + STARS_NN_vldmxcsr, // Load Streaming SIMD Extensions Technology Control/Status Register + STARS_NN_vmaskmovdqu, // Store Selected Bytes of Double Quadword with NT Hint + STARS_NN_vmaskmovpd, // Conditionally Load Packed Double-Precision Floating-Point Values + STARS_NN_vmaskmovps, // Conditionally Load Packed Single-Precision Floating-Point Values + STARS_NN_vmaxpd, // Return Maximum Packed Double-Precision Floating-Point Values + STARS_NN_vmaxps, // Packed Single-FP Maximum + STARS_NN_vmaxsd, // Return Maximum Scalar Double-Precision Floating-Point Value + STARS_NN_vmaxss, // Scalar Single-FP Maximum + STARS_NN_vminpd, // Return Minimum Packed Double-Precision Floating-Point Values + STARS_NN_vminps, // Packed Single-FP Minimum + STARS_NN_vminsd, // Return Minimum Scalar Double-Precision Floating-Point Value + STARS_NN_vminss, // Scalar Single-FP Minimum + STARS_NN_vmovapd, // Move Aligned Packed Double-Precision Floating-Point Values + STARS_NN_vmovaps, // Move Aligned Four Packed Single-FP + STARS_NN_vmovd, // Move 32 bits + STARS_NN_vmovddup, // Move One Double-FP and Duplicate + STARS_NN_vmovdqa, // Move Aligned Double Quadword + STARS_NN_vmovdqu, // Move Unaligned Double Quadword + STARS_NN_vmovhlps, // Move High to Low Packed Single-FP + STARS_NN_vmovhpd, // Move High Packed Double-Precision Floating-Point Values + STARS_NN_vmovhps, // Move High Packed Single-FP + STARS_NN_vmovlhps, // Move Low to High Packed Single-FP + STARS_NN_vmovlpd, // Move Low Packed Double-Precision Floating-Point Values + STARS_NN_vmovlps, // Move Low Packed Single-FP + STARS_NN_vmovmskpd, // Extract Packed Double-Precision Floating-Point Sign Mask + STARS_NN_vmovmskps, // Move Mask to Register + STARS_NN_vmovntdq, // Store Double Quadword Using Non-Temporal Hint + STARS_NN_vmovntdqa, // Load Double Quadword Non-Temporal Aligned Hint + STARS_NN_vmovntpd, // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint + STARS_NN_vmovntps, // Move Aligned Four Packed Single-FP Non Temporal + STARS_NN_vmovntsd, // Move Non-Temporal Scalar Double-Precision Floating-Point + STARS_NN_vmovntss, // Move Non-Temporal Scalar Single-Precision Floating-Point + STARS_NN_vmovq, // Move 64 bits + STARS_NN_vmovsd, // Move Scalar Double-Precision Floating-Point Values + STARS_NN_vmovshdup, // Move Packed Single-FP High and Duplicate + STARS_NN_vmovsldup, // Move Packed Single-FP Low and Duplicate + STARS_NN_vmovss, // Move Scalar Single-FP + STARS_NN_vmovupd, // Move Unaligned Packed Double-Precision Floating-Point Values + STARS_NN_vmovups, // Move Unaligned Four Packed Single-FP + STARS_NN_vmpsadbw, // Compute Multiple Packed Sums of Absolute Difference + STARS_NN_vmulpd, // Multiply Packed Double-Precision Floating-Point Values + STARS_NN_vmulps, // Packed Single-FP Multiply + STARS_NN_vmulsd, // Multiply Scalar Double-Precision Floating-Point Values + STARS_NN_vmulss, // Scalar Single-FP Multiply + STARS_NN_vorpd, // Bitwise Logical OR of Double-Precision Floating-Point Values + STARS_NN_vorps, // Bitwise Logical OR for Single-FP Data + STARS_NN_vpabsb, // Packed Absolute Value Byte + STARS_NN_vpabsd, // Packed Absolute Value Doubleword + STARS_NN_vpabsw, // Packed Absolute Value Word + STARS_NN_vpackssdw, // Pack with Signed Saturation (Dword->Word) + STARS_NN_vpacksswb, // Pack with Signed Saturation (Word->Byte) + STARS_NN_vpackusdw, // Pack with Unsigned Saturation + STARS_NN_vpackuswb, // Pack with Unsigned Saturation (Word->Byte) + STARS_NN_vpaddb, // Packed Add Byte + STARS_NN_vpaddd, // Packed Add Dword + STARS_NN_vpaddq, // Add Packed Quadword Integers + STARS_NN_vpaddsb, // Packed Add with Saturation (Byte) + STARS_NN_vpaddsw, // Packed Add with Saturation (Word) + STARS_NN_vpaddusb, // Packed Add Unsigned with Saturation (Byte) + STARS_NN_vpaddusw, // Packed Add Unsigned with Saturation (Word) + STARS_NN_vpaddw, // Packed Add Word + STARS_NN_vpalignr, // Packed Align Right + STARS_NN_vpand, // Bitwise Logical And + STARS_NN_vpandn, // Bitwise Logical And Not + STARS_NN_vpavgb, // Packed Average (Byte) + STARS_NN_vpavgw, // Packed Average (Word) + STARS_NN_vpblendd, // Blend Packed Dwords + STARS_NN_vpblendvb, // Variable Blend Packed Bytes + STARS_NN_vpblendw, // Blend Packed Words + STARS_NN_vpbroadcastb, // Broadcast a Byte Integer + STARS_NN_vpbroadcastd, // Broadcast a Dword Integer + STARS_NN_vpbroadcastq, // Broadcast a Qword Integer + STARS_NN_vpbroadcastw, // Broadcast a Word Integer + STARS_NN_vpclmulqdq, // Carry-Less Multiplication Quadword + STARS_NN_vpcmpeqb, // Packed Compare for Equal (Byte) + STARS_NN_vpcmpeqd, // Packed Compare for Equal (Dword) + STARS_NN_vpcmpeqq, // Compare Packed Qword Data for Equal + STARS_NN_vpcmpeqw, // Packed Compare for Equal (Word) + STARS_NN_vpcmpestri, // Packed Compare Explicit Length Strings, Return Index + STARS_NN_vpcmpestrm, // Packed Compare Explicit Length Strings, Return Mask + STARS_NN_vpcmpgtb, // Packed Compare for Greater Than (Byte) + STARS_NN_vpcmpgtd, // Packed Compare for Greater Than (Dword) + STARS_NN_vpcmpgtq, // Compare Packed Data for Greater Than + STARS_NN_vpcmpgtw, // Packed Compare for Greater Than (Word) + STARS_NN_vpcmpistri, // Packed Compare Implicit Length Strings, Return Index + STARS_NN_vpcmpistrm, // Packed Compare Implicit Length Strings, Return Mask + STARS_NN_vperm2f128, // Permute Floating-Point Values + STARS_NN_vperm2i128, // Permute Integer Values + STARS_NN_vpermd, // Full Doublewords Element Permutation + STARS_NN_vpermilpd, // Permute Double-Precision Floating-Point Values + STARS_NN_vpermilps, // Permute Single-Precision Floating-Point Values + STARS_NN_vpermpd, // Permute Double-Precision Floating-Point Elements + STARS_NN_vpermps, // Permute Single-Precision Floating-Point Elements + STARS_NN_vpermq, // Qwords Element Permutation + STARS_NN_vpextrb, // Extract Byte + STARS_NN_vpextrd, // Extract Dword + STARS_NN_vpextrq, // Extract Qword + STARS_NN_vpextrw, // Extract Word + STARS_NN_vpgatherdd, // Gather Packed Dword Values Using Signed Dword Indices + STARS_NN_vpgatherdq, // Gather Packed Qword Values Using Signed Dword Indices + STARS_NN_vpgatherqd, // Gather Packed Dword Values Using Signed Qword Indices + STARS_NN_vpgatherqq, // Gather Packed Qword Values Using Signed Qword Indices + STARS_NN_vphaddd, // Packed Horizontal Add Doubleword + STARS_NN_vphaddsw, // Packed Horizontal Add and Saturate + STARS_NN_vphaddw, // Packed Horizontal Add Word + STARS_NN_vphminposuw, // Packed Horizontal Word Minimum + STARS_NN_vphsubd, // Packed Horizontal Subtract Doubleword + STARS_NN_vphsubsw, // Packed Horizontal Subtract and Saturate + STARS_NN_vphsubw, // Packed Horizontal Subtract Word + STARS_NN_vpinsrb, // Insert Byte + STARS_NN_vpinsrd, // Insert Dword + STARS_NN_vpinsrq, // Insert Qword + STARS_NN_vpinsrw, // Insert Word + STARS_NN_vpmaddubsw, // Multiply and Add Packed Signed and Unsigned Bytes + STARS_NN_vpmaddwd, // Packed Multiply and Add + STARS_NN_vpmaskmovd, // Conditionally Store Dword Values Using Mask + STARS_NN_vpmaskmovq, // Conditionally Store Qword Values Using Mask + STARS_NN_vpmaxsb, // Maximum of Packed Signed Byte Integers + STARS_NN_vpmaxsd, // Maximum of Packed Signed Dword Integers + STARS_NN_vpmaxsw, // Packed Signed Integer Word Maximum + STARS_NN_vpmaxub, // Packed Unsigned Integer Byte Maximum + STARS_NN_vpmaxud, // Maximum of Packed Unsigned Dword Integers + STARS_NN_vpmaxuw, // Maximum of Packed Word Integers + STARS_NN_vpminsb, // Minimum of Packed Signed Byte Integers + STARS_NN_vpminsd, // Minimum of Packed Signed Dword Integers + STARS_NN_vpminsw, // Packed Signed Integer Word Minimum + STARS_NN_vpminub, // Packed Unsigned Integer Byte Minimum + STARS_NN_vpminud, // Minimum of Packed Unsigned Dword Integers + STARS_NN_vpminuw, // Minimum of Packed Word Integers + STARS_NN_vpmovmskb, // Move Byte Mask to Integer + STARS_NN_vpmovsxbd, // Packed Move with Sign Extend + STARS_NN_vpmovsxbq, // Packed Move with Sign Extend + STARS_NN_vpmovsxbw, // Packed Move with Sign Extend + STARS_NN_vpmovsxdq, // Packed Move with Sign Extend + STARS_NN_vpmovsxwd, // Packed Move with Sign Extend + STARS_NN_vpmovsxwq, // Packed Move with Sign Extend + STARS_NN_vpmovzxbd, // Packed Move with Zero Extend + STARS_NN_vpmovzxbq, // Packed Move with Zero Extend + STARS_NN_vpmovzxbw, // Packed Move with Zero Extend + STARS_NN_vpmovzxdq, // Packed Move with Zero Extend + STARS_NN_vpmovzxwd, // Packed Move with Zero Extend + STARS_NN_vpmovzxwq, // Packed Move with Zero Extend + STARS_NN_vpmuldq, // Multiply Packed Signed Dword Integers + STARS_NN_vpmulhrsw, // Packed Multiply High with Round and Scale + STARS_NN_vpmulhuw, // Packed Multiply High Unsigned + STARS_NN_vpmulhw, // Packed Multiply High + STARS_NN_vpmulld, // Multiply Packed Signed Dword Integers and Store Low Result + STARS_NN_vpmullw, // Packed Multiply Low + STARS_NN_vpmuludq, // Multiply Packed Unsigned Doubleword Integers + STARS_NN_vpor, // Bitwise Logical Or + STARS_NN_vpsadbw, // Packed Sum of Absolute Differences + STARS_NN_vpshufb, // Packed Shuffle Bytes + STARS_NN_vpshufd, // Shuffle Packed Doublewords + STARS_NN_vpshufhw, // Shuffle Packed High Words + STARS_NN_vpshuflw, // Shuffle Packed Low Words + STARS_NN_vpsignb, // Packed SIGN Byte + STARS_NN_vpsignd, // Packed SIGN Doubleword + STARS_NN_vpsignw, // Packed SIGN Word + STARS_NN_vpslld, // Packed Shift Left Logical (Dword) + STARS_NN_vpslldq, // Shift Double Quadword Left Logical + STARS_NN_vpsllq, // Packed Shift Left Logical (Qword) + STARS_NN_vpsllvd, // Variable Bit Shift Left Logical (Dword) + STARS_NN_vpsllvq, // Variable Bit Shift Left Logical (Qword) + STARS_NN_vpsllw, // Packed Shift Left Logical (Word) + STARS_NN_vpsrad, // Packed Shift Right Arithmetic (Dword) + STARS_NN_vpsravd, // Variable Bit Shift Right Arithmetic + STARS_NN_vpsraw, // Packed Shift Right Arithmetic (Word) + STARS_NN_vpsrld, // Packed Shift Right Logical (Dword) + STARS_NN_vpsrldq, // Shift Double Quadword Right Logical (Qword) + STARS_NN_vpsrlq, // Packed Shift Right Logical (Qword) + STARS_NN_vpsrlvd, // Variable Bit Shift Right Logical (Dword) + STARS_NN_vpsrlvq, // Variable Bit Shift Right Logical (Qword) + STARS_NN_vpsrlw, // Packed Shift Right Logical (Word) + STARS_NN_vpsubb, // Packed Subtract Byte + STARS_NN_vpsubd, // Packed Subtract Dword + STARS_NN_vpsubq, // Subtract Packed Quadword Integers + STARS_NN_vpsubsb, // Packed Subtract with Saturation (Byte) + STARS_NN_vpsubsw, // Packed Subtract with Saturation (Word) + STARS_NN_vpsubusb, // Packed Subtract Unsigned with Saturation (Byte) + STARS_NN_vpsubusw, // Packed Subtract Unsigned with Saturation (Word) + STARS_NN_vpsubw, // Packed Subtract Word + STARS_NN_vptest, // Logical Compare + STARS_NN_vpunpckhbw, // Unpack High Packed Data (Byte->Word) + STARS_NN_vpunpckhdq, // Unpack High Packed Data (Dword->Qword) + STARS_NN_vpunpckhqdq, // Unpack High Packed Data (Qword->Xmmword) + STARS_NN_vpunpckhwd, // Unpack High Packed Data (Word->Dword) + STARS_NN_vpunpcklbw, // Unpack Low Packed Data (Byte->Word) + STARS_NN_vpunpckldq, // Unpack Low Packed Data (Dword->Qword) + STARS_NN_vpunpcklqdq, // Unpack Low Packed Data (Qword->Xmmword) + STARS_NN_vpunpcklwd, // Unpack Low Packed Data (Word->Dword) + STARS_NN_vpxor, // Bitwise Logical Exclusive Or + STARS_NN_vrcpps, // Packed Single-FP Reciprocal + STARS_NN_vrcpss, // Scalar Single-FP Reciprocal + STARS_NN_vroundpd, // Round Packed Double Precision Floating-Point Values + STARS_NN_vroundps, // Round Packed Single Precision Floating-Point Values + STARS_NN_vroundsd, // Round Scalar Double Precision Floating-Point Values + STARS_NN_vroundss, // Round Scalar Single Precision Floating-Point Values + STARS_NN_vrsqrtps, // Packed Single-FP Square Root Reciprocal + STARS_NN_vrsqrtss, // Scalar Single-FP Square Root Reciprocal + STARS_NN_vshufpd, // Shuffle Packed Double-Precision Floating-Point Values + STARS_NN_vshufps, // Shuffle Single-FP + STARS_NN_vsqrtpd, // Compute Square Roots of Packed Double-Precision Floating-Point Values + STARS_NN_vsqrtps, // Packed Single-FP Square Root + STARS_NN_vsqrtsd, // Compute Square Rootof Scalar Double-Precision Floating-Point Value + STARS_NN_vsqrtss, // Scalar Single-FP Square Root + STARS_NN_vstmxcsr, // Store Streaming SIMD Extensions Technology Control/Status Register + STARS_NN_vsubpd, // Subtract Packed Double-Precision Floating-Point Values + STARS_NN_vsubps, // Packed Single-FP Subtract + STARS_NN_vsubsd, // Subtract Scalar Double-Precision Floating-Point Values + STARS_NN_vsubss, // Scalar Single-FP Subtract + STARS_NN_vtestpd, // Packed Double-Precision Floating-Point Bit Test + STARS_NN_vtestps, // Packed Single-Precision Floating-Point Bit Test + STARS_NN_vucomisd, // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + STARS_NN_vucomiss, // Scalar Unordered Single-FP Compare and Set EFLAGS + STARS_NN_vunpckhpd, // Unpack and Interleave High Packed Double-Precision Floating-Point Values + STARS_NN_vunpckhps, // Unpack High Packed Single-FP Data + STARS_NN_vunpcklpd, // Unpack and Interleave Low Packed Double-Precision Floating-Point Values + STARS_NN_vunpcklps, // Unpack Low Packed Single-FP Data + STARS_NN_vxorpd, // Bitwise Logical OR of Double-Precision Floating-Point Values + STARS_NN_vxorps, // Bitwise Logical XOR for Single-FP Data + STARS_NN_vzeroall, // Zero All YMM Registers + STARS_NN_vzeroupper, // Zero Upper Bits of YMM Registers + + // Transactional Synchronization Extensions + + STARS_NN_xabort, // Transaction Abort + STARS_NN_xbegin, // Transaction Begin + STARS_NN_xend, // Transaction End + STARS_NN_xtest, // Test If In Transactional Execution + + // Virtual PC synthetic instructions + + STARS_NN_vmgetinfo, // Virtual PC - Get VM Information + STARS_NN_vmsetinfo, // Virtual PC - Set VM Information + STARS_NN_vmdxdsbl, // Virtual PC - Disable Direct Execution + STARS_NN_vmdxenbl, // Virtual PC - Enable Direct Execution + STARS_NN_vmcpuid, // Virtual PC - Virtualized CPU Information + STARS_NN_vmhlt, // Virtual PC - Halt + STARS_NN_vmsplaf, // Virtual PC - Spin Lock Acquisition Failed + STARS_NN_vmpushfd, // Virtual PC - Push virtualized flags register + STARS_NN_vmpopfd, // Virtual PC - Pop virtualized flags register + STARS_NN_vmcli, // Virtual PC - Clear Interrupt Flag + STARS_NN_vmsti, // Virtual PC - Set Interrupt Flag + STARS_NN_vmiretd, // Virtual PC - Return From Interrupt + STARS_NN_vmsgdt, // Virtual PC - Store Global Descriptor Table + STARS_NN_vmsidt, // Virtual PC - Store Interrupt Descriptor Table + STARS_NN_vmsldt, // Virtual PC - Store Local Descriptor Table + STARS_NN_vmstr, // Virtual PC - Store Task Register + STARS_NN_vmsdte, // Virtual PC - Store to Descriptor Table Entry + STARS_NN_vpcext, // Virtual PC - ISA extension + + STARS_NN_last, + +}; + #endif diff --git a/include/interfaces/abstract/STARSInterface.h b/include/interfaces/abstract/STARSInterface.h index bad5528d..ceaece33 100644 --- a/include/interfaces/abstract/STARSInterface.h +++ b/include/interfaces/abstract/STARSInterface.h @@ -4,6 +4,7 @@ #include "interfaces/STARSTypes.h" #include <interfaces/abstract/STARSSegment.h> #include <interfaces/abstract/STARSFunction.h> +#include <interfaces/abstract/STARSProgram.h> class STARS_Interface_t { @@ -14,44 +15,45 @@ class STARS_Interface_t */ /* return segment for virtual addr */ - virtual STARS_Segment_t *getseg(const STARS_ea_t &addr) =0; + virtual STARS_Segment_t *getseg(const STARS_ea_t &addr) = 0; /* Return segment at index "index" */ - virtual STARS_Segment_t *getnseg(const int &index) =0; + virtual STARS_Segment_t *getnseg(const int &index) = 0; /* return number of segments */ - virtual size_t get_segm_qty() =0; + virtual std::size_t get_segm_qty() = 0; - virtual STARS_Segment_t *get_next_seg(const STARS_ea_t &addr) =0; + virtual STARS_Segment_t *get_next_seg(const STARS_ea_t &addr) = 0; /* * Function methods */ /* find out how many functions there is */ - virtual size_t get_func_qty()=0; + virtual std::size_t get_func_qty() = 0; /* get the index-th function */ - virtual STARS_Function_t *getn_func(int index) =0; + virtual STARS_Function_t *getn_func(int index) = 0; /* get the function at the given address */ - virtual STARS_Function_t *get_func(STARS_ea_t index) =0; + virtual STARS_Function_t *get_func(STARS_ea_t index) = 0; /* get the function's paternal grandmother's maiden name. */ - virtual void get_func_name(const STARS_ea_t &ea, char* name, const size_t &len) =0; + virtual void get_func_name(const STARS_ea_t &ea, char* name, const std::size_t &len) = 0; /* * Misc. Funcs. */ - /* ida-only auditing */ - virtual void AuditTailChunkOwnership(void) =0; - virtual void AuditCodeTargets(void)=0; + /* IDA-only auditing */ + virtual void AuditTailChunkOwnership(void) = 0; + virtual void AuditCodeTargets(void) = 0; }; extern STARS_Interface_t* global_stars_interface; +extern STARS_Program_t *global_STARS_program; #endif diff --git a/include/interfaces/abstract/STARSOp.h b/include/interfaces/abstract/STARSOp.h index d32a03fb..af98c36e 100644 --- a/include/interfaces/abstract/STARSOp.h +++ b/include/interfaces/abstract/STARSOp.h @@ -16,18 +16,6 @@ class STARS_op_t // Clone method (deep copy). virtual STARSOpndTypePtr clone(void) const = 0; - // Clone operands that will be changed (e.g. normalized) later. Subword regs will be normalized to full-word regs - // in DEF and USE and dataflow analysis sets, and stack accesses will be normalized in these same sets to be relative - // to the incoming stack pointer value. These normalizations are needed for proper SSA form, e.g. we need to know that - // changes to a subword reg also change the full-word reg, and [stack_ptr+0] and [stack_ptr+8] could be the same stack - // location in a procedure if stack_ptr changes value. The deep-copied clone can be changed without affecting the - // original operand. If we are only canonicalizing subword regs to prepare for a USE or DEF search, we use - // CloneIfSubwordReg(). If we are placing operands in dataflow sets and would also later need to normalize stack accesses - // in addition to normalizing subword regs, we call CloneIfNecessary(). -#if 0 - virtual STARSOpndTypePtr CloneIfSubwordReg(void) const = 0; - virtual STARSOpndTypePtr CloneIfNecessary(bool UseFP) const = 0; -#endif // Operators virtual bool operator<(const STARS_op_t &rOp) const = 0; // Less-than operator for use in STL ordered containers, e.g. sets. @@ -48,7 +36,7 @@ class STARS_op_t // Set methods virtual void SetByteWidth(uint16_t ByteWidth) = 0; // Change default byte width of opnd virtual void DoubleRegWidth(void) = 0; // Double the width of opnd if it is a subword register - virtual void SetOpGlobalIndex(size_t index) = 0; // Set STARS SSA name index. + virtual void SetOpGlobalIndex(std::size_t index) = 0; // Set STARS SSA name index. virtual void SetReg(uint16_t NewReg) = 0; virtual void SetAddr(STARS_ea_t NewAddr) = 0; virtual void SetSIB(char value) = 0; @@ -66,6 +54,7 @@ class STARS_op_t virtual bool IsStaticMemOp(void) const = 0; virtual bool IsMemNoDisplacementOp(void) const = 0; virtual bool IsMemOp(void) const = 0; // any of the previous three types + virtual bool HasSIBByte(void) const = 0; virtual bool IsFloatingPointRegOp(void) const = 0; virtual bool IsMMXRegOp(void) const = 0; virtual bool IsXMMRegOp(void) const = 0; @@ -73,7 +62,8 @@ class STARS_op_t virtual bool IsTestRegOp(void) const = 0; virtual bool IsDebugRegOp(void) const = 0; virtual bool IsControlRegOp(void) const = 0; - virtual bool HasSIBByte(void) const = 0; + virtual bool MDIsKnownOpType(void) const = 0; + virtual bool MDIsSpecialRegOpType(void) const = 0; // special debug reg, control or task reg, MMX/XMM/YMM registers virtual bool MatchesReg(uint16_t RegNum) const = 0; virtual bool IsNearPointer(void) const = 0; virtual bool IsFarPointer(void) const = 0; diff --git a/include/interfaces/abstract/STARSProgram.h b/include/interfaces/abstract/STARSProgram.h new file mode 100644 index 00000000..9ebcc244 --- /dev/null +++ b/include/interfaces/abstract/STARSProgram.h @@ -0,0 +1,185 @@ +#ifndef STARSProgram_h +#define STARSProgram_h + +#include <list> +#include <map> +#include <set> +#include <string> + +#include <cstdint> +#include <cstdio> + +#include "interfaces/STARSTypes.h" +#include "interfaces/SMPDBInterface.h" + +// Optimizing annotation categories +#define LAST_OPT_CATEGORY 10 + +class STARS_Program_t +{ + public: + // Data initialization + virtual void InitData(void); + virtual void DetermineRootFileName(void) = 0; + virtual bool OpenFiles(void); + virtual void CloseFiles(void); + void ZST_InitPolicies(void); + + // Get (accessor) methods + std::size_t GetSTARS_ISA_Bitwidth(void) const { return STARS_ISA_Bitwidth; }; + std::size_t GetSTARS_ISA_Bytewidth(void) const { return STARS_ISA_Bytewidth; }; + virtual char GetSTARS_ISA_dtyp(void) const = 0; + virtual int GetSTARS_MD_LAST_SAVED_REG_NUM(void) const = 0; + int GetOptCategory(uint16_t IDAOpcodeEnum) const { return OptCategory[IDAOpcodeEnum]; }; + STARS_sval_t GetStackAlteration(uint16_t IDAOpcodeEnum) const { return StackAlteration[IDAOpcodeEnum]; }; + int GetOptCount(std::size_t CategoryIndex) const { return OptCount[CategoryIndex]; }; + int GetAnnotationCount(std::size_t CategoryIndex) const { return AnnotationCount[CategoryIndex]; }; + unsigned long GetDataReferentID(void) const { return DataReferentID; }; // Unique ID for data annotations + std::string GetRootFileName(void) const { return RootFileName; }; // e.g. "foo" when analyzing file "foo.exe" + FILE *GetAlarmFile(void) const { return ZST_AlarmFile; }; + FILE *GetXrefsFile(void) const { return STARS_XrefsFile; }; + FILE *GetCallReturnFile(void) const { return STARS_CallReturnFile; }; + FILE *GetSPARKHeaderFile(void) const { return ZST_SPARKHeaderFile; }; + FILE *GetSPARKSourceFile(void) const { return ZST_SPARKSourceFile; }; + std::list<uint16_t>::iterator GetFirstCallerSavedReg(void) { return STARS_MDCallerSavedRegs.begin(); }; + std::list<uint16_t>::iterator GetLastCallerSavedReg(void) { return STARS_MDCallerSavedRegs.end(); }; + std::list<uint16_t>::iterator GetFirstArgumentReg(void) { return STARS_MDArgumentRegs.begin(); }; + std::list<uint16_t>::iterator GetLastArgumentReg(void) { return STARS_MDArgumentRegs.end(); }; + ZST_SysCallType GetCallTypeFromFuncName(std::string SysCallName) const; + ZST_Policy GetPolicyFromCallType(ZST_SysCallType CallType) const; + SMP_bounds_t GetFuncBounds(std::size_t FuncIndex) const { return FuncBounds.at(FuncIndex); }; + std::size_t GetFuncBoundsSize(void) const { return FuncBounds.size(); }; + + // Set (mutator) methods + virtual void Set32BitBinary(void) = 0; // Set internal state to handle a 32-bit binary + virtual void Set64BitBinary(void) = 0; // Set internal state to handle a 64-bit binary + void IncrementOptCount(std::size_t OptCategory) { ++OptCount[OptCategory]; }; // increment optimizing annotation count + void IncrementAnnotationCount(std::size_t OptCategory) { ++AnnotationCount[OptCategory]; }; // increment total annotation count + void IncrementDataReferentID(void) { ++DataReferentID; }; // increment unique data annotations referent ID + + // Query methods + bool ShouldSTARSPerformReducedAnalysis(void) const { return STARS_PerformReducedAnalysis; }; // Is program too big for full analysis? + bool IsLocationWhitelisted(ZST_SysCallType CallType, std::string LocationName) const; + bool IsLocationBlacklisted(ZST_SysCallType CallType, std::string LocationName) const; + // Given a called function name, does it produce only benign numeric errors when + // its returned values are used in arithmetic? (i.e. it is a trusted input) + bool IsNumericSafeSystemCall(std::string CallName) const; + + // Printing methods + + // Utility functions to print code xrefs to STARS_XrefsFile + void PrintCodeToCodeXref(STARS_ea_t FromAddr, STARS_ea_t ToAddr, std::size_t InstrSize); + void PrintDataToCodeXref(STARS_ea_t FromDataAddr, STARS_ea_t ToCodeAddr, std::size_t InstrSize); + + // Analysis methods + virtual void ReportTotalCodeSize(unsigned long long TotalCodeSize) = 0; // Set flags, take actions based on code size. + + protected: + // We maintain a list of the caller-saved regs for the current binary's ABI. + // This differs from 32-bit to 64-bit x86 binaries, as well as across other ISAs. + std::list<uint16_t> STARS_MDCallerSavedRegs; + + // We maintain a list of the argument-passing regs for the current binary's ABI. + // This differs from 32-bit to 64-bit x86 binaries, as well as across other ISAs. + // The list is in order of argument position number. For x86-64, this means EDI, + // ESI, EDX, ECX, R8, R9. + std::list<uint16_t> STARS_MDArgumentRegs; + + // Function address bounds for each func, by IDA Pro index. + std::vector<SMP_bounds_t> FuncBounds; + + // Mutators + void SetBitwidth32(void) { STARS_ISA_Bytewidth = 4; STARS_ISA_Bitwidth = 32; }; + void SetBitwidth64(void) { STARS_ISA_Bytewidth = 8; STARS_ISA_Bitwidth = 64; }; + void SetTotalCodeSize(unsigned long long TotalSize) { STARS_TotalCodeSize = TotalSize; }; + void SetReducedProcessingFlag(bool FlagValue) { STARS_PerformReducedAnalysis = FlagValue; }; + void SetRootFileName(std::string NewName) { RootFileName = NewName; }; + + // Analysis methods + + // Convert a call type string from the policy file, such as "FILECALLS", to the + // corresponding ZST_SysCallType, such as ZST_FILE_CALL. + ZST_SysCallType ConvertStringToCallType(char *Str2); + // Convert a policy string from the policy file, such as "DISALLOW", to + // the corresponding ZST_Policy value, such as ZST_DISALLOW. + ZST_Policy ConvertStringToPolicy(char *Str3); + + private: + // Data members. + std::size_t STARS_ISA_Bitwidth; + std::size_t STARS_ISA_Bytewidth; + + // Unique data referent number to use in data annotations. + unsigned long DataReferentID; + + bool STARS_PerformReducedAnalysis; // true means program is too big for full analysis + + // Total code size for the program in bytes. + unsigned long long STARS_TotalCodeSize; + + // Filename (not including path) of executable being analyzed. + std::string RootFileName; + + // File to print security alert messages to, e.g. foo.exe.alarms. + FILE *ZST_AlarmFile; + + // File for code xref targets (helps ILR, makes IRDB more complete) + FILE *STARS_XrefsFile; + + // File to provide details on fast returns, safe and unsafe return-address functions, etc. + FILE *STARS_CallReturnFile; + + // Files for SPARK Ada translation of program RTLs + FILE *ZST_SPARKSourceFile; + FILE *ZST_SPARKHeaderFile; + + // Keep statistics on how many instructions we saw in each optimization + // category, and how many optimizing annotations were emitted for + // each category. + int AnnotationCount[LAST_OPT_CATEGORY + 1]; + int OptCount[LAST_OPT_CATEGORY + 1]; + + // Define optimization categories for instructions. + int OptCategory[STARS_NN_last + 1]; + + // Record which opcodes change the stack pointer, and by how many + // bytes up (reduction in stack size for stacks that grow downward) + // or down (increase in stack size for stacks that grow downward). + STARS_sval_t StackAlteration[STARS_NN_last + 1]; + + // Map library function names to their system call type. + std::map<std::string, ZST_SysCallType> ZST_FuncTypeMap; + + // Map system call types to their Zephyr Security Toolkit security policy. + std::map<ZST_SysCallType, ZST_Policy> ZST_TypePolicyMap; + + // Set of whitelisted file locations. + std::set<std::string> ZST_FileLocWhitelist; + + // Set of whitelisted network locations. + std::set<std::string> ZST_NetworkLocWhitelist; + + // Set of blacklisted file locations. + std::set<std::string> ZST_FileLocBlacklist; + + // Set of blacklisted network locations. + std::set<std::string> ZST_NetworkLocBlacklist; + + // Set of system call names whose returned values should be trusted to have only benign numeric errors. + std::set<std::string> ZST_SystemCallNumericWhitelist; + + // Methods + + // Initialize the OptCategory[] array. + void InitOptCategory(void); + // Initialize the StackAlteration[] array. + void InitStackAlteration(void); + void InitLibFuncFGInfoMaps(void); + void InitDFACategory(void); + void InitSMPDefsFlags(void); + void InitSMPUsesFlags(void); + void InitTypeCategory(void); + +}; + +#endif diff --git a/include/interfaces/abstract/all.h b/include/interfaces/abstract/all.h index 92b69437..b3765e40 100644 --- a/include/interfaces/abstract/all.h +++ b/include/interfaces/abstract/all.h @@ -1,8 +1,10 @@ -#include <stdint.h> +#include <cstdint> + #include <interfaces/abstract/STARSInterface.h> #include <interfaces/abstract/STARSSegment.h> +#include <interfaces/abstract/STARSProgram.h> #include <interfaces/abstract/STARSFunction.h> #include <interfaces/abstract/STARSInstructionID.h> #include <interfaces/abstract/STARSInstruction.h> diff --git a/include/interfaces/idapro/STARSInstruction.h b/include/interfaces/idapro/STARSInstruction.h index 1b4cf871..59464e9b 100644 --- a/include/interfaces/idapro/STARSInstruction.h +++ b/include/interfaces/idapro/STARSInstruction.h @@ -144,6 +144,8 @@ class STARS_IDA_Instruction_t : public STARS_Instruction_t struct STARS_IDA_insn_t STARScmd; uint32_t STARSfeatures; + private: + void InitOperand(op_t &InitOp) const; }; #endif diff --git a/include/interfaces/idapro/STARSOp.h b/include/interfaces/idapro/STARSOp.h index 161dfe05..f9732ad7 100644 --- a/include/interfaces/idapro/STARSOp.h +++ b/include/interfaces/idapro/STARSOp.h @@ -19,10 +19,7 @@ class STARS_IDA_op_t : public STARS_op_t // Clone method (deep copy). STARSOpndTypePtr clone(void) const; -#if 0 - STARSOpndTypePtr CloneIfSubwordReg(void) const; // Clone only if subword register. - STARSOpndTypePtr CloneIfNecessary(bool UseFP) const; // Clone operands that will be changed (e.g. normalized) later -#endif + // Operators bool operator<(const STARS_op_t &rOp) const; // Less-than operator for use in STL ordered containers, e.g. sets. @@ -42,7 +39,7 @@ class STARS_IDA_op_t : public STARS_op_t // Set methods void SetByteWidth(uint16_t ByteWidth); // Change default byte width of opnd void DoubleRegWidth(void); // Double the width of opnd if it is a subword register - void SetOpGlobalIndex(size_t index); // Set STARS SSA name index. + void SetOpGlobalIndex(std::size_t index); // Set STARS SSA name index. void SetReg(uint16_t NewReg); // Change the register field of the operand. void SetAddr(STARS_ea_t NewAddr) { m_Opnd.addr = NewAddr; }; void SetSIB(char value) { m_Opnd.sib = value; }; @@ -72,6 +69,8 @@ class STARS_IDA_op_t : public STARS_op_t bool IsTestRegOp(void) const { return (m_Opnd.type == o_trreg); }; bool IsDebugRegOp(void) const { return (m_Opnd.type == o_dbreg); }; bool IsControlRegOp(void) const { return (m_Opnd.type == o_crreg); }; + bool MDIsKnownOpType(void) const { return ((m_Opnd.type >= o_reg) && (m_Opnd.type <= o_ymmreg)); }; + bool MDIsSpecialRegOpType(void) const { return ((m_Opnd.type >= o_trreg) && (m_Opnd.type <= o_ymmreg)); }; bool HasSegReg(void) const { return is_segreg(GetSegReg()); }; // Has a segment register protected: diff --git a/include/interfaces/idapro/STARSProgram.h b/include/interfaces/idapro/STARSProgram.h new file mode 100644 index 00000000..b8174b6e --- /dev/null +++ b/include/interfaces/idapro/STARSProgram.h @@ -0,0 +1,48 @@ +#ifndef STARSIDAProgram_h +#define STARSIDAProgram_h + +// #include <map> +// #include <set> +// #include <string> + +// #include <cstdint> +// #include <cstdio> + +// #include <intel.hpp> // indirectly includes the unguarded allins.hpp header + +// #include "interfaces/STARSTypes.h" +#include "interfaces/abstract/STARSProgram.h" + +class STARS_IDA_Program_t : public STARS_Program_t { +public: + // Data initialization + virtual void InitData(void); + void DetermineRootFileName(void); + bool OpenFiles(void); + void CloseFiles(void); + + // Get (accessor) methods + char GetSTARS_ISA_dtyp(void) const { return STARS_ISA_dtyp; }; + int GetSTARS_MD_LAST_SAVED_REG_NUM(void) const { return STARS_MD_LAST_SAVED_REG_NUM; }; + + // Set (mutator) methods + void Set32BitBinary(void); // Set internal state to handle a 32-bit binary + void Set64BitBinary(void); // Set internal state to handle a 64-bit binary + + // Query methods + + // Analysis methods + void ReportTotalCodeSize(unsigned long long TotalCodeSize); + +private: + // Data + + char STARS_ISA_dtyp; + int STARS_MD_LAST_SAVED_REG_NUM; + + // Methods + void MDInitializeCallerSavedRegs(void); + void MDInitializeArgumentRegs(void); +}; + +#endif diff --git a/include/interfaces/idapro/all.h b/include/interfaces/idapro/all.h index 1ff16a1e..64baaee4 100644 --- a/include/interfaces/idapro/all.h +++ b/include/interfaces/idapro/all.h @@ -18,6 +18,7 @@ #include <interfaces/abstract/all.h> #include <interfaces/idapro/STARSSegment.h> +#include <interfaces/idapro/STARSProgram.h> #include <interfaces/idapro/STARSFunction.h> #include <interfaces/idapro/STARSInterface.h> #include <interfaces/idapro/STARSInstruction.h> diff --git a/src/base/ProfilerInformation.cpp b/src/base/ProfilerInformation.cpp index a8cf5357..6fab15bd 100644 --- a/src/base/ProfilerInformation.cpp +++ b/src/base/ProfilerInformation.cpp @@ -286,12 +286,12 @@ ProfilerInformation::~ProfilerInformation() { SMP_fprintf(fout, "%s", (*iter).c_str()); } - for (std::map<ea_t,InstructionInformation*>::iterator iter = the_map.begin(); + for (std::map<STARS_ea_t,InstructionInformation*>::iterator iter = the_map.begin(); iter != the_map.end(); ++iter ) { - ea_t addr=(*iter).first; + STARS_ea_t addr=(*iter).first; InstructionInformation *ii=(*iter).second; if (ii) { @@ -315,18 +315,18 @@ ProfilerInformation::~ProfilerInformation() { } } - for (std::map<ea_t, set<ea_t> >::iterator iter = indirect_call_map.begin(); + for (std::map<STARS_ea_t, set<STARS_ea_t> >::iterator iter = indirect_call_map.begin(); iter != indirect_call_map.end(); ++iter ) { - for (std::set<ea_t>::iterator iter2 = (*iter).second.begin(); + for (std::set<STARS_ea_t>::iterator iter2 = (*iter).second.begin(); iter2 != (*iter).second.end(); ++iter2 ) { - ea_t source=iter->first; - ea_t target=*iter2; + STARS_ea_t source=iter->first; + STARS_ea_t target=*iter2; SMP_fprintf(fout, "%lx 0 INSTR INDIRECTCALL %lu Profiler generated, idal summarized\n", (unsigned long) source, (unsigned long) target); } } @@ -335,7 +335,7 @@ ProfilerInformation::~ProfilerInformation() { this->constant_info.clear(); } -void ProfilerInformation::addProfileInformation(ea_t addr, long long nc, long long pc, long long oc) { +void ProfilerInformation::addProfileInformation(STARS_ea_t addr, long long nc, long long pc, long long oc) { InstructionInformation *ii = GetInfo(addr); if (!ii) { @@ -360,13 +360,13 @@ void ProfilerInformation::addProfileInformation(ea_t addr, long long nc, long lo void ProfilerInformation::profileAddressingInformation ( - ea_t addr, + STARS_ea_t addr, int size, char *type, char *scope, - ea_t the_const, + STARS_ea_t the_const, char* field, - ea_t real_const + STARS_ea_t real_const ) { char buffer[1000]; @@ -380,7 +380,7 @@ void ProfilerInformation::profileAddressingInformation // ****************************************************** // Constructor. -SMPMemoryAccesses::SMPMemoryAccesses(ea_t addr) { +SMPMemoryAccesses::SMPMemoryAccesses(STARS_ea_t addr) { address = addr; ByteLimit = 0; region = SMP_NO_REGION; @@ -449,7 +449,7 @@ MemoryAccessInfo::~MemoryAccessInfo() { void MemoryAccessInfo::Dump(void) { SMP_msg("Debug dump of MemoryAccessInfo:\n"); - set<ea_t>::iterator MultiIter; + set<STARS_ea_t>::iterator MultiIter; SMP_msg("\nMultiAccess set: "); int count = 0; for (MultiIter = this->MultipleAccessTypeSet.begin(); @@ -463,7 +463,7 @@ void MemoryAccessInfo::Dump(void) { } SMP_msg("\n"); - map<ea_t, size_t>::iterator InstType; + map<STARS_ea_t, size_t>::iterator InstType; SMP_msg("\nInst to Type map: "); count = 0; for (InstType = this->InstrTypeMap.begin(); InstType != this->InstrTypeMap.end(); ++InstType) { @@ -474,7 +474,7 @@ void MemoryAccessInfo::Dump(void) { } SMP_msg("\n"); - map<ea_t, size_t>::iterator ObjType; + map<STARS_ea_t, size_t>::iterator ObjType; SMP_msg("\nObject to Type map: "); count = 0; for (ObjType = this->ObjectTypeMap.begin(); ObjType != this->ObjectTypeMap.end(); ++ObjType) { @@ -524,8 +524,8 @@ void MemoryAccessInfo::ProcessMemoryAccessAnnotation(FILE *fin, int addr) { // Extract the remaining fields of the annotation. char NameAddrsSize[MAXSTR]; char ObjectName[MAXSTR]; - ea_t AllocationAddress; // == 0 for static; code address otherwise - ea_t InstructionAddress; // redundant; == addr + STARS_ea_t AllocationAddress; // == 0 for static; code address otherwise + STARS_ea_t InstructionAddress; // redundant; == addr size_t ObjectSize; // in bytes int ProcessID; // of Profiler process that gathered data size_t RedundantObjectSize; // == ObjectSize @@ -546,9 +546,9 @@ void MemoryAccessInfo::ProcessMemoryAccessAnnotation(FILE *fin, int addr) { char *NamePtr = strtok(NameAddrsSize, ":"); SMP_strncpy(ObjectName, NamePtr, MAXSTR-1); char *TempStr = strtok(NULL, ":"); - AllocationAddress = (ea_t) strtol(TempStr, &EndPtr, 16); + AllocationAddress = (STARS_ea_t) strtol(TempStr, &EndPtr, 16); TempStr = strtok(NULL, ":"); - InstructionAddress = (ea_t) strtol(TempStr, &EndPtr, 16); + InstructionAddress = (STARS_ea_t) strtol(TempStr, &EndPtr, 16); TempStr = strtok(NULL, " "); signed long SignedObjectSize = strtol(TempStr, &EndPtr, 10); assert(addr == ((int) InstructionAddress)); @@ -591,7 +591,7 @@ void MemoryAccessInfo::ProcessMemoryAccessAnnotation(FILE *fin, int addr) { } else if (0 == AllocationAddress) { // static global data is not allocated at an instruction - map<string, ea_t>::iterator NameMapIter; + map<string, STARS_ea_t>::iterator NameMapIter; NameMapIter = this->MyProg->FindGlobalName(ObjectString); if (NameMapIter == this->MyProg->GetLastGlobalName()) { SMP_msg("WARNING: Cannot find global name %s ; discarding memory access annotation.\n", @@ -606,13 +606,13 @@ void MemoryAccessInfo::ProcessMemoryAccessAnnotation(FILE *fin, int addr) { } // Add to ObjectInstrMap. - map<ea_t, set<ea_t> >::iterator ObjInstIter; + map<STARS_ea_t, set<STARS_ea_t> >::iterator ObjInstIter; ObjInstIter = this->ObjectInstrMap.find(AllocationAddress); if (ObjInstIter == this->ObjectInstrMap.end()) { // Not already in map; create map entry. - pair<map<ea_t, set<ea_t> >::iterator, bool> ObjPairIB; - set<ea_t> EmptyInstrs; - pair<ea_t, set<ea_t> > TempObjPair(AllocationAddress, EmptyInstrs); + pair<map<STARS_ea_t, set<STARS_ea_t> >::iterator, bool> ObjPairIB; + set<STARS_ea_t> EmptyInstrs; + pair<STARS_ea_t, set<STARS_ea_t> > TempObjPair(AllocationAddress, EmptyInstrs); ObjPairIB = this->ObjectInstrMap.insert(TempObjPair); assert(true == ObjPairIB.second); ObjInstIter = ObjPairIB.first; @@ -620,13 +620,13 @@ void MemoryAccessInfo::ProcessMemoryAccessAnnotation(FILE *fin, int addr) { ObjInstIter->second.insert(InstructionAddress); // Add to InstrObjectMap. - map<ea_t, set<ea_t> >::iterator InstObjIter; + map<STARS_ea_t, set<STARS_ea_t> >::iterator InstObjIter; InstObjIter = this->InstrObjectMap.find(InstructionAddress); if (InstObjIter == this->InstrObjectMap.end()) { // Not already in map; create map entry. - pair<map<ea_t, set<ea_t> >::iterator, bool> InstPairIB; - set<ea_t> EmptyObjs; - pair<ea_t, set<ea_t> > TempInstPair(InstructionAddress, EmptyObjs); + pair<map<STARS_ea_t, set<STARS_ea_t> >::iterator, bool> InstPairIB; + set<STARS_ea_t> EmptyObjs; + pair<STARS_ea_t, set<STARS_ea_t> > TempInstPair(InstructionAddress, EmptyObjs); InstPairIB = this->InstrObjectMap.insert(TempInstPair); assert(true == InstPairIB.second); InstObjIter = InstPairIB.first; @@ -641,7 +641,7 @@ void MemoryAccessInfo::ProcessMemoryAccessAnnotation(FILE *fin, int addr) { // annotation. // Else (no size conflict) use the meet function to update the // memory access map for this instruction address. - map<ea_t, SMPMemoryAccesses *>::iterator InstrAccessIter; + map<STARS_ea_t, SMPMemoryAccesses *>::iterator InstrAccessIter; InstrAccessIter = this->InstrAccessMap.find(InstructionAddress); if (InstrAccessIter != this->InstrAccessMap.end()) { // Already have seen this instruction address. @@ -670,8 +670,8 @@ void MemoryAccessInfo::ProcessMemoryAccessAnnotation(FILE *fin, int addr) { else { // First time we have seen this instruction address. SMPMemoryAccesses *TempMemoryAccess = new SMPMemoryAccesses(InstructionAddress); - pair<ea_t, SMPMemoryAccesses *> TempPair(InstructionAddress, TempMemoryAccess); - pair<map<ea_t, SMPMemoryAccesses *>::iterator, bool> PairIB; + pair<STARS_ea_t, SMPMemoryAccesses *> TempPair(InstructionAddress, TempMemoryAccess); + pair<map<STARS_ea_t, SMPMemoryAccesses *>::iterator, bool> PairIB; PairIB = this->InstrAccessMap.insert(TempPair); assert(true == PairIB.second); InstrAccessIter = PairIB.first; @@ -761,10 +761,10 @@ void MemoryAccessInfo::ProcessMemoryAccessAnnotation(FILE *fin, int addr) { void MemoryAccessInfo::InferDataGranularity(void) { // For each entry in MultipleAccessSet, remove all its information // from all other maps. - set<ea_t>::iterator MultiIter; - map<ea_t, set<ea_t> >::iterator InstObjIter; - set<ea_t>::iterator ObjIter; - map<ea_t, set<ea_t> >::iterator ObjInstIter; + set<STARS_ea_t>::iterator MultiIter; + map<STARS_ea_t, set<STARS_ea_t> >::iterator InstObjIter; + set<STARS_ea_t>::iterator ObjIter; + map<STARS_ea_t, set<STARS_ea_t> >::iterator ObjInstIter; #if SMP_GRANULARITY_STATISTICS SMP_msg("MultiAccess instructions: %zu\n", this->MultipleAccessTypeSet.size()); @@ -825,15 +825,15 @@ void MemoryAccessInfo::InferDataGranularity(void) { // See if the instruction address has already been associated // with a type number. If not, associate it with a new type #. - ea_t InstAddr = InstObjIter->first; + STARS_ea_t InstAddr = InstObjIter->first; size_t CurrTypeIndex; - map<ea_t, SMPMemoryAccesses*>::iterator InstAccessIter; + map<STARS_ea_t, SMPMemoryAccesses*>::iterator InstAccessIter; InstAccessIter = this->InstrAccessMap.find(InstAddr); assert(InstAccessIter != this->InstrAccessMap.end()); size_t ObjectSize = InstAccessIter->second->GetLimit(); size_t TypeSize; assert(0 < ObjectSize); - map<ea_t, size_t>::iterator InstTypeIter; + map<STARS_ea_t, size_t>::iterator InstTypeIter; InstTypeIter = this->InstrTypeMap.find(InstAddr); if (InstTypeIter != this->InstrTypeMap.end()) { // Already associated with a type ID. @@ -874,16 +874,16 @@ void MemoryAccessInfo::InferDataGranularity(void) { // Associate instruction and data allocation addresses with the data TypeID // for the common data type they all reference. -void MemoryAccessInfo::AssociateInstrWithType(ea_t InstAddr, size_t TypeID, - map<ea_t, set<ea_t> >::iterator InstObjIter) { - pair<ea_t, size_t> InstPair(InstAddr, TypeID); +void MemoryAccessInfo::AssociateInstrWithType(STARS_ea_t InstAddr, size_t TypeID, + map<STARS_ea_t, set<STARS_ea_t> >::iterator InstObjIter) { + pair<STARS_ea_t, size_t> InstPair(InstAddr, TypeID); this->InstrTypeMap.insert(InstPair); - set<ea_t>::iterator ObjIter = InstObjIter->second.begin(); + set<STARS_ea_t>::iterator ObjIter = InstObjIter->second.begin(); while (ObjIter != InstObjIter->second.end()) { // For each data object, if it is not already associated with the // TypeID, associate it and recurse through all unassociated // instruction addresses that access the data object. - map<ea_t, size_t>::iterator ObjTypeIter; + map<STARS_ea_t, size_t>::iterator ObjTypeIter; ObjTypeIter = this->ObjectTypeMap.find(*ObjIter); if (ObjTypeIter != this->ObjectTypeMap.end()) { // Already associated with a type ID #. @@ -891,23 +891,23 @@ void MemoryAccessInfo::AssociateInstrWithType(ea_t InstAddr, size_t TypeID, } else { // Not yet associated with TypeID. - pair<ea_t, size_t> ObjPair(*ObjIter, TypeID); + pair<STARS_ea_t, size_t> ObjPair(*ObjIter, TypeID); this->ObjectTypeMap.insert(ObjPair); // Find all inst addresses that access this object. - map<ea_t, set<ea_t> >::iterator ObjInstIter; + map<STARS_ea_t, set<STARS_ea_t> >::iterator ObjInstIter; ObjInstIter = this->ObjectInstrMap.find(*ObjIter); assert(ObjInstIter != this->ObjectInstrMap.end()); - set<ea_t>::iterator InstIter = ObjInstIter->second.begin(); + set<STARS_ea_t>::iterator InstIter = ObjInstIter->second.begin(); while (InstIter != ObjInstIter->second.end()) { // Is this inst address not yet associated with TypeID? - map<ea_t, size_t>::iterator InstTypeIter; + map<STARS_ea_t, size_t>::iterator InstTypeIter; InstTypeIter = this->InstrTypeMap.find(*InstIter); if (InstTypeIter == this->InstrTypeMap.end()) { // Not yet in InstrTypeMap - pair<ea_t, size_t> InstPair2(*InstIter, TypeID); + pair<STARS_ea_t, size_t> InstPair2(*InstIter, TypeID); this->InstrTypeMap.insert(InstPair2); // Recurse on new inst address. - map<ea_t, set<ea_t> >::iterator InstObjIter2; + map<STARS_ea_t, set<STARS_ea_t> >::iterator InstObjIter2; InstObjIter2 = this->InstrObjectMap.find(*InstIter); assert(InstObjIter2 != this->InstrObjectMap.end()); this->AssociateInstrWithType(*InstIter, TypeID, InstObjIter2); @@ -929,12 +929,12 @@ void MemoryAccessInfo::AssociateInstrWithType(ea_t InstAddr, size_t TypeID, // address. // Return true if there are non-direct accesses through this instruction, // and set ChildOffset/RegionSize to mark the non-direct child region. -bool MemoryAccessInfo::ComputeNonDirectAccessRegion(ea_t InstAddr, int &ChildOffset, int &RegionSize) { +bool MemoryAccessInfo::ComputeNonDirectAccessRegion(STARS_ea_t InstAddr, int &ChildOffset, int &RegionSize) { bool NonDirect = false; bool Scaled = false; size_t TypeID; - map<ea_t, size_t>::iterator InstTypeIter; + map<STARS_ea_t, size_t>::iterator InstTypeIter; InstTypeIter = this->InstrTypeMap.find(InstAddr); if (InstTypeIter == this->InstrTypeMap.end()) { // InstAddr was not hit in the profiling run. @@ -947,7 +947,7 @@ bool MemoryAccessInfo::ComputeNonDirectAccessRegion(ea_t InstAddr, int &ChildOff TypeID = InstTypeIter->second; } - map<ea_t, SMPMemoryAccesses *>::iterator InstAccessIter; + map<STARS_ea_t, SMPMemoryAccesses *>::iterator InstAccessIter; InstAccessIter = this->InstrAccessMap.find(InstAddr); assert(InstAccessIter != this->InstrAccessMap.end()); @@ -980,7 +980,7 @@ bool MemoryAccessInfo::ComputeNonDirectAccessRegion(ea_t InstAddr, int &ChildOff if (SMP_STACK & InstAccessIter->second->GetRegion()) { // Inst accessed a stack frame. Now, see if it accessed more // than one object. - map<ea_t, set<ea_t> >::iterator InstObjIter; + map<STARS_ea_t, set<STARS_ea_t> >::iterator InstObjIter; InstObjIter = this->InstrObjectMap.find(InstAddr); assert(InstObjIter != this->InstrObjectMap.end()); if (1 < InstObjIter->second.size()) { @@ -1001,12 +1001,12 @@ bool MemoryAccessInfo::ComputeNonDirectAccessRegion(ea_t InstAddr, int &ChildOff // a caller's stack frame, and there is more than one potential // caller to the present instruction's function, then we // have the incomplete profiling situation detailed above. - ea_t InstFirstEA, InstLastEA; + STARS_ea_t InstFirstEA, InstLastEA; STARS_Function_t *InstFunc = SMP_get_func(InstAccessIter->first); assert(NULL != InstFunc); InstFirstEA = InstFunc->get_startEA(); InstLastEA = InstFunc->get_endEA(); - ea_t AllocationAddr = *(InstObjIter->second.begin()); + STARS_ea_t AllocationAddr = *(InstObjIter->second.begin()); bool AccessedCallerFrame = ((InstFirstEA > AllocationAddr) || (InstLastEA < AllocationAddr)); if (AccessedCallerFrame) { diff --git a/src/base/SMPBasicBlock.cpp b/src/base/SMPBasicBlock.cpp index a136c647..95ea3c9b 100644 --- a/src/base/SMPBasicBlock.cpp +++ b/src/base/SMPBasicBlock.cpp @@ -50,7 +50,6 @@ #include <intel.hpp> #include "SMPDBInterface.h" -#include "SMPStaticAnalyzer.h" #include "SMPDataFlowAnalysis.h" #include "SMPBasicBlock.h" #include "SMPInstr.h" @@ -115,7 +114,7 @@ SMPBasicBlock::SMPBasicBlock(SMPFunction *Func, list<SMPInstr *>::iterator First this->PhiFunctions.clear(); this->LocalNames.clear(); - ea_t InstAddr; + STARS_ea_t InstAddr; list<SMPInstr *>::iterator InstIter = First; SMPInstr *CurrInst; @@ -125,7 +124,7 @@ SMPBasicBlock::SMPBasicBlock(SMPFunction *Func, list<SMPInstr *>::iterator First this->InstVec.push_back(CurrInst); VecIndex = this->InstVec.size() - 1; InstAddr = CurrInst->GetAddr(); - pair<ea_t, size_t> MapItem(InstAddr, VecIndex); + pair<STARS_ea_t, size_t> MapItem(InstAddr, VecIndex); this->AddrInstMap.insert(MapItem); ++InstIter; } @@ -135,7 +134,7 @@ SMPBasicBlock::SMPBasicBlock(SMPFunction *Func, list<SMPInstr *>::iterator First this->InstVec.push_back(CurrInst); // Add last instruction InstAddr = CurrInst->GetAddr(); VecIndex = this->InstVec.size() - 1; - pair<ea_t, size_t> MapItem2(InstAddr, VecIndex); + pair<STARS_ea_t, size_t> MapItem2(InstAddr, VecIndex); this->AddrInstMap.insert(MapItem2); CurrInst->SetTerminatesBlock(); @@ -151,12 +150,12 @@ SMPBasicBlock::SMPBasicBlock(SMPFunction *Func, list<SMPInstr *>::iterator First } // Get address of first instruction in the block. -ea_t SMPBasicBlock::GetFirstAddr(void) const { +STARS_ea_t SMPBasicBlock::GetFirstAddr(void) const { return this->FirstAddr; } // Get address of last instruction in the block. -ea_t SMPBasicBlock::GetLastAddr(void) { +STARS_ea_t SMPBasicBlock::GetLastAddr(void) { vector<SMPInstr *>::reverse_iterator LastInstIter = this->GetRevInstBegin(); return (*LastInstIter)->GetAddr(); } @@ -262,7 +261,7 @@ void SMPBasicBlock::LinkToSucc(SMPBasicBlock *Successor) { // We will keep successors sorted in address order. for (list<SMPBasicBlock *>::iterator SuccIter = this->GetFirstSucc(); SuccIter != this->GetLastSucc(); ++SuccIter) { SMPBasicBlock *SuccBlock = (*SuccIter); - ea_t SuccStartAddr = SuccBlock->GetFirstAddr(); + STARS_ea_t SuccStartAddr = SuccBlock->GetFirstAddr(); if (SuccStartAddr > Successor->GetFirstAddr()) { SuccIter = this->Successors.insert(SuccIter, Successor); inserted = true; @@ -440,7 +439,7 @@ list<SMPBasicBlock *>::iterator SMPBasicBlock::GetFallThroughSucc(void) { list<SMPBasicBlock *>::iterator SuccIter; vector<SMPInstr *>::reverse_iterator LastInstIter = this->GetRevInstBegin(); SMPInstr *LastInst = (*LastInstIter); - ea_t LastAddr = LastInst->GetAddr(), AddrDiff = 1000, FirstSuccAddr; + STARS_ea_t LastAddr = LastInst->GetAddr(), AddrDiff = 1000, FirstSuccAddr; SMPitype LastDataFlow = LastInst->GetDataFlowType(); if ((JUMP != LastDataFlow) && (RETURN != LastDataFlow) && (HALT != LastDataFlow)) { @@ -448,7 +447,7 @@ list<SMPBasicBlock *>::iterator SMPBasicBlock::GetFallThroughSucc(void) { for (SuccIter = this->GetFirstSucc(); SuccIter != this->GetLastSucc(); ++SuccIter) { FirstSuccAddr = (*SuccIter)->GetFirstAddr(); if (FirstSuccAddr > LastAddr) { // block comes after this block; candidate for fall-through - ea_t NewAddrDiff = FirstSuccAddr - LastAddr; + STARS_ea_t NewAddrDiff = FirstSuccAddr - LastAddr; #if 1 if (NewAddrDiff == LastInst->GetSize()) { FallThroughSuccIter = SuccIter; @@ -496,71 +495,51 @@ bool SMPBasicBlock::MDAlreadyKilled(STARSOpndTypePtr Opnd1) const { // address appears in a definition, for example. We will do that if it proves // to be necessary. bool FoundInKillSet = this->IsVarKill(Opnd1); - bool DirectAccess = false; - bool StackAccess = false; + if (!(Opnd1->IsMemDisplacementOp() || Opnd1->IsMemNoDisplacementOp())) + // Look in KillSet. These simple types should be found there with + // no complicated comparisons needed. + return FoundInKillSet; + + // If found directly in KillSet, return true. Otherwise, see if any registers + // used in the memory addressing expression were killed. + if (FoundInKillSet) + return true; + bool UseFP = this->MyFunc->UsesFramePointer(); + bool StackAccess = MDIsStackAccessOpnd(Opnd1, UseFP); + bool DirectAccess = false; - switch (Opnd1->GetOpType()) { - // Some types are simple to test for equality. - case o_void: - case o_reg: - case o_mem: - case o_imm: - case o_far: - case o_near: - case o_trreg: - case o_dbreg: - case o_crreg: - case o_fpreg: - case o_mmxreg: - case o_xmmreg: - // Look in KillSet. These simple types should be found there with - // no complicated comparisons needed. - return FoundInKillSet; - - case o_phrase: - case o_displ: - StackAccess = MDIsStackAccessOpnd(Opnd1, UseFP); - if (StackAccess) { - DirectAccess = !MDIsIndirectMemoryOpnd(Opnd1, UseFP); - } - // If found directly in KillSet, return true. Otherwise, see if any registers - // used in the memory addressing expression were killed. - if (FoundInKillSet) - return true; - else if (!(DirectAccess && StackAccess)) { + + if (StackAccess) { + DirectAccess = !MDIsIndirectMemoryOpnd(Opnd1, UseFP); + } + else if (!(DirectAccess && StackAccess)) { #if 1 - // We only keep registers and direct stack accesses in the data flow sets. - // Commented-out code has const-ness compiler problems, anyway. - return false; + // We only keep registers and direct stack accesses in the data flow sets. + // Commented-out code has const-ness compiler problems, anyway. + return false; #else - // Should we add Opnd1 to the KillSet every time we return true below? **!!** - int BaseReg; - int IndexReg; - uint16_t ScaleFactor; - ea_t displacement; - - MDExtractAddressFields(Opnd1, BaseReg, IndexReg, ScaleFactor, displacement); - - vector<SMPInstr *>::const_iterator FirstInst = this->GetFirstInst(); - if (R_none != BaseReg) { - STARSOpndTypePtr TempOp = (*FirstInst)->MakeRegOpnd(BaseReg); - if (this->KillSet.end() != this->KillSet.find(TempOp)) - return true; - } - if (R_none != IndexReg) { // Cannot have ESP index reg in SIB - STARSOpndTypePtr TempOp = (*FirstInst)->MakeRegOpnd(IndexReg); - if (this->KillSet.end() != this->KillSet.find(TempOp)) - return true; - } + // Should we add Opnd1 to the KillSet every time we return true below? **!!** + int BaseReg; + int IndexReg; + uint16_t ScaleFactor; + STARS_ea_t displacement; + + MDExtractAddressFields(Opnd1, BaseReg, IndexReg, ScaleFactor, displacement); + + vector<SMPInstr *>::const_iterator FirstInst = this->GetFirstInst(); + if (STARS_x86_R_none != BaseReg) { + STARSOpndTypePtr TempOp = (*FirstInst)->MakeRegOpnd(BaseReg); + if (this->KillSet.end() != this->KillSet.find(TempOp)) + return true; + } + if (STARS_x86_R_none != IndexReg) { // Cannot have ESP index reg in SIB + STARSOpndTypePtr TempOp = (*FirstInst)->MakeRegOpnd(IndexReg); + if (this->KillSet.end() != this->KillSet.find(TempOp)) + return true; + } #endif - } // end if (FoundInKillSet) ... else ... - break; - - default: - SMP_msg("Unknown operand type %d in MDAlreadyKilled, block %d\n", Opnd1->GetOpType(), this->GetNumber()); - } // end of switch on Opnd1.type - + } return false; } // end of SMPBasicBlock::MDAlreadyKilled() @@ -724,9 +703,9 @@ set<SMPPhiFunction, LessPhi>::iterator SMPBasicBlock::FindPhi(STARSOpndTypePtr F // Get a pointer to the instruction at address InstAddr. // Will assert if it does not find the instruction. -SMPInstr *SMPBasicBlock::FindInstr(ea_t InstAddr) { +SMPInstr *SMPBasicBlock::FindInstr(STARS_ea_t InstAddr) { SMPInstr *CurrInst; - map<ea_t, size_t>::iterator MapEntry; + map<STARS_ea_t, size_t>::iterator MapEntry; MapEntry = this->AddrInstMap.find(InstAddr); if (MapEntry == this->AddrInstMap.end()) { @@ -742,7 +721,7 @@ SMPInstr *SMPBasicBlock::FindInstr(ea_t InstAddr) { // Get an iterator to the instruction at address InstAddr. // Will assert if it does not find the instruction. -vector<SMPInstr *>::iterator SMPBasicBlock::GetInstIterFromAddr(ea_t InstAddr) { +vector<SMPInstr *>::iterator SMPBasicBlock::GetInstIterFromAddr(STARS_ea_t InstAddr) { #if 1 size_t VecIndex = this->GetIndexFromInstAddr(InstAddr); vector<SMPInstr *>::iterator InstIter(this->InstVec.begin() + VecIndex); @@ -765,9 +744,9 @@ vector<SMPInstr *>::iterator SMPBasicBlock::GetInstIterFromAddr(ea_t InstAddr) { } // end of SMPBasicBlock::GetInstIterFromAddr() // Get the InstVec index for the instruction at InstAddr. Assert if not found. -size_t SMPBasicBlock::GetIndexFromInstAddr(ea_t InstAddr) const { +size_t SMPBasicBlock::GetIndexFromInstAddr(STARS_ea_t InstAddr) const { SMPInstr *CurrInst; - ea_t CurrAddr; + STARS_ea_t CurrAddr; size_t VecIndex; size_t UpperLimit = this->InstVec.size(); if (STARS_IsSSAMarkerPseudoID(InstAddr)) { @@ -824,8 +803,8 @@ int SMPBasicBlock::GetPredPosition(int BlockNum) { } // Set the DEF iterator from the DefAddr and DefOp. Assert if not found. -set<DefOrUse, LessDefUse>::iterator SMPBasicBlock::GetGlobalDefIterFromDefAddr(STARSOpndTypePtr DefOp, ea_t DefAddr) { - map<ea_t, size_t>::iterator MapIter = this->AddrInstMap.find(DefAddr); +set<DefOrUse, LessDefUse>::iterator SMPBasicBlock::GetGlobalDefIterFromDefAddr(STARSOpndTypePtr DefOp, STARS_ea_t DefAddr) { + map<STARS_ea_t, size_t>::iterator MapIter = this->AddrInstMap.find(DefAddr); assert(MapIter != this->AddrInstMap.end()); SMPInstr *DefInst = this->GetInstFromIndex(MapIter->second); set<DefOrUse, LessDefUse>::iterator DefIter = DefInst->FindDef(DefOp); @@ -836,8 +815,8 @@ set<DefOrUse, LessDefUse>::iterator SMPBasicBlock::GetGlobalDefIterFromDefAddr(S // Given a USE operand and the address of its instr, return DEF addr using SSA chains or Phi func. // If DEF is in a Phi function, we return the block number, which (hopefully) never conflicts with instruction // addresses. -ea_t SMPBasicBlock::GetDefAddrFromUseAddr(STARSOpndTypePtr UseOp, ea_t InstAddr, int SSANum, bool LocalName) { - ea_t DefAddr = BADADDR; +STARS_ea_t SMPBasicBlock::GetDefAddrFromUseAddr(STARSOpndTypePtr UseOp, STARS_ea_t InstAddr, int SSANum, bool LocalName) { + STARS_ea_t DefAddr = BADADDR; bool RegisterOp = (UseOp->IsRegOp()); bool PhiUse = (STARS_IsBlockNumPseudoID(InstAddr)); @@ -858,7 +837,7 @@ ea_t SMPBasicBlock::GetDefAddrFromUseAddr(STARSOpndTypePtr UseOp, ea_t InstAddr, DefAddr = this->GetFunc()->GetGlobalDefAddr(UseOp, SSANum); if (BADADDR == DefAddr) { // Need to search Phi functions. // Rare case in which a Phi USE was traced only to a Phi DEF in an earlier block. - DefAddr = (ea_t) this->GetFunc()->GetBlockNumForPhiDef(UseOp, SSANum); + DefAddr = (STARS_ea_t) this->GetFunc()->GetBlockNumForPhiDef(UseOp, SSANum); assert(BADADDR != DefAddr); DefAddr += STARS_PSEUDO_ID_MIN; } @@ -900,8 +879,8 @@ ea_t SMPBasicBlock::GetDefAddrFromUseAddr(STARSOpndTypePtr UseOp, ea_t InstAddr, return DefAddr; } // end of SMPBasicBlock::GetDefAddrFromUseAddr() -ea_t SMPBasicBlock::GetUltimateDefAddr(STARSOpndTypePtr UseOp, ea_t InstAddr, int SSANum, bool LocalName) { - ea_t DefAddr = BADADDR; +STARS_ea_t SMPBasicBlock::GetUltimateDefAddr(STARSOpndTypePtr UseOp, STARS_ea_t InstAddr, int SSANum, bool LocalName) { + STARS_ea_t DefAddr = BADADDR; DefAddr = this->GetDefAddrFromUseAddr(UseOp, InstAddr, SSANum, LocalName); bool LiveInAddr = STARS_IsLiveInPseudoID(DefAddr); if (LiveInAddr && this->IsLiveIn(UseOp)) { // UpExposed or pass-through case @@ -933,7 +912,7 @@ ea_t SMPBasicBlock::GetUltimateDefAddr(STARSOpndTypePtr UseOp, ea_t InstAddr, in set<SMPPhiFunction, LessPhi>::iterator PhiIter = CurrBlock->FindPhi(UseOp); if (PhiIter != CurrBlock->GetLastPhi()) { if (SSANum == PhiIter->GetDefSSANum()) { - DefAddr = (ea_t) BlockIndex + STARS_PSEUDO_ID_MIN; + DefAddr = (STARS_ea_t) BlockIndex + STARS_PSEUDO_ID_MIN; FoundDEF = true; break; } @@ -942,7 +921,7 @@ ea_t SMPBasicBlock::GetUltimateDefAddr(STARSOpndTypePtr UseOp, ea_t InstAddr, in vector<SMPInstr *>::reverse_iterator RevInstIter; for (RevInstIter = CurrBlock->GetRevInstBegin(); RevInstIter != CurrBlock->GetRevInstEnd(); ++RevInstIter) { SMPInstr *CurrInst = (*RevInstIter); - ea_t CurrAddr = CurrInst->GetAddr(); + STARS_ea_t CurrAddr = CurrInst->GetAddr(); if (CurrInst->HasDestMemoryOperand() || CurrInst->MDIsPushInstr()) { DefIter = CurrInst->FindDef(UseOp); if (DefIter != CurrInst->GetLastDef()) { @@ -971,7 +950,7 @@ ea_t SMPBasicBlock::GetUltimateDefAddr(STARSOpndTypePtr UseOp, ea_t InstAddr, in // we need to check to see if it is the DefAddr. vector<SMPInstr *>::reverse_iterator RevInstIter = PredBlock->GetRevInstBegin(); SMPInstr *LastPredInst = (*RevInstIter); - ea_t LastPredAddr = LastPredInst->GetAddr(); + STARS_ea_t LastPredAddr = LastPredInst->GetAddr(); if (LastPredInst->FindDef(UseOp) != LastPredInst->GetLastDef()) { DefAddr = LastPredAddr; PredBlock->SetProcessed(true); @@ -997,9 +976,9 @@ ea_t SMPBasicBlock::GetUltimateDefAddr(STARSOpndTypePtr UseOp, ea_t InstAddr, in } // end of SMPBasicBlock::GetUltimateDefAddr() // STUB: Trace UseOp through move and Phi defs to some defining operation. -ea_t SMPBasicBlock::GetUltimateOperandSource(ea_t UseAddr, STARSOpndTypePtr UseOp, int UseSSANum) { +STARS_ea_t SMPBasicBlock::GetUltimateOperandSource(STARS_ea_t UseAddr, STARSOpndTypePtr UseOp, int UseSSANum) { bool LocalName = this->IsLocalName(UseOp); - ea_t DefiningAddr = this->GetDefAddrFromUseAddr(UseOp, UseAddr, UseSSANum, LocalName); + STARS_ea_t DefiningAddr = this->GetDefAddrFromUseAddr(UseOp, UseAddr, UseSSANum, LocalName); SMPBasicBlock *CurrBlock; // We have four possibilities for DefiningAddr: @@ -1013,13 +992,13 @@ ea_t SMPBasicBlock::GetUltimateOperandSource(ea_t UseAddr, STARSOpndTypePtr UseO } // end of SMPBasicBlock::GetUltimateOperandSource() // Does DefOp get written out in truncated form (lower bits only)? -bool SMPBasicBlock::IsOpDestTruncatedWrite(STARSOpndTypePtr DefOp, int DefSSANum, ea_t DefAddr) { +bool SMPBasicBlock::IsOpDestTruncatedWrite(STARSOpndTypePtr DefOp, int DefSSANum, STARS_ea_t DefAddr) { vector<SMPInstr *>::iterator InstIter; SMPInstr *LastUseInst = NULL; set<DefOrUse, LessDefUse>::iterator DefIter; bool RegisterOp = (DefOp->IsRegOp()); bool LastUseIsTruncatedWrite = false; - ea_t LastAddr = BADADDR; + STARS_ea_t LastAddr = BADADDR; if (!RegisterOp || (DefSSANum == SMP_SSA_UNINIT)) return false; @@ -1153,7 +1132,7 @@ bool SMPBasicBlock::ComputeReachesOutSet(void) { size_t NewSize; // If NewSize becomes different from OldSize, then ReachesOutSet changed. // First step: Add all ReachesIn defns that are not killed. - set<pair<STARSOpndTypePtr, ea_t>, LessDefinition>::iterator ReachesInIter; + set<pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition>::iterator ReachesInIter; for (ReachesInIter = this->GetFirstReachesIn(); ReachesInIter != this->GetLastReachesIn(); ++ReachesInIter) { STARSOpndTypePtr InOp = ReachesInIter->first; if (!(this->IsVarKill(InOp))) { @@ -1162,7 +1141,7 @@ bool SMPBasicBlock::ComputeReachesOutSet(void) { } // Second step: Add DEDefns. - set<pair<STARSOpndTypePtr, ea_t>, LessDefinition>::iterator DEDefnIter; + set<pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition>::iterator DEDefnIter; for (DEDefnIter = this->GetFirstDownExposedDefn(); DEDefnIter != this->GetLastDownExposedDefn(); ++DEDefnIter) { this->AddReachesOut(*DEDefnIter); } @@ -1173,9 +1152,9 @@ bool SMPBasicBlock::ComputeReachesOutSet(void) { } // end of SMPBasicBlock::ComputeReachesOutSet() // Add DefOp, remove previous defs of DefOp that now do not reach the end of the block. -void SMPBasicBlock::UpdateDownExposedDefs(STARSOpndTypePtr DefOp, ea_t InstAddr) { +void SMPBasicBlock::UpdateDownExposedDefs(STARSOpndTypePtr DefOp, STARS_ea_t InstAddr) { // First, remove any definition of DefOp that precedes the current definition. - set<pair<STARSOpndTypePtr, ea_t>, LessDefinition>::iterator DEDefnIter = this->GetFirstDownExposedDefn(); + set<pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition>::iterator DEDefnIter = this->GetFirstDownExposedDefn(); while (DEDefnIter != this->GetLastDownExposedDefn()) { STARSOpndTypePtr OldOp = DEDefnIter->first; if (IsEqOpIgnoreBitwidth(OldOp, DefOp)) { @@ -1187,8 +1166,8 @@ void SMPBasicBlock::UpdateDownExposedDefs(STARSOpndTypePtr DefOp, ea_t InstAddr) } } // Next, insert the new definition. - pair<STARSOpndTypePtr, ea_t> NewDefn(DefOp, InstAddr); - pair<set<pair<STARSOpndTypePtr, ea_t>, LessDefinition>::iterator, bool> InsertResult; + pair<STARSOpndTypePtr, STARS_ea_t> NewDefn(DefOp, InstAddr); + pair<set<pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition>::iterator, bool> InsertResult; InsertResult = this->DownExposedDefnSet.insert(NewDefn); assert(InsertResult.second); this->SetReachesOutStale(); @@ -1325,7 +1304,7 @@ void SMPBasicBlock::SCCPNullifyUnreachableBlock(void) { // Remove this block from the predecessors list of its successors. list<SMPBasicBlock *>::iterator SuccIter; - ea_t TempAddr = this->GetFirstAddr(); + STARS_ea_t TempAddr = this->GetFirstAddr(); for (SuccIter = this->GetFirstSucc(); SuccIter != this->GetLastSucc(); ++SuccIter) { (*SuccIter)->ErasePred(TempAddr); } @@ -1340,7 +1319,7 @@ void SMPBasicBlock::SCCPNullifyUnreachableBlock(void) { // Patch all bytes in the database for this block into nops. size_t NumBytes = this->GetBlockSize(); - ea_t CurrAddr = this->GetFirstAddr(); + STARS_ea_t CurrAddr = this->GetFirstAddr(); for (size_t ByteIndex = 0; ByteIndex < NumBytes; ++ByteIndex) { bool success = patch_byte(CurrAddr, MD_BINARY_NOP_INSTRUCTION); // If success == false, that just means the byte already had that value in the @@ -1468,7 +1447,7 @@ void SMPBasicBlock::SSALocalRenumber(void) { set<STARSOpndTypePtr, LessOp>::iterator UseNameIter, DefNameIter; for (InstIter = this->GetFirstInst(); InstIter != this->GetLastInst(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); - ea_t InstAddr = CurrInst->GetAddr(); // for debugging + STARS_ea_t InstAddr = CurrInst->GetAddr(); // for debugging size_t NameIndex; // USEs get referenced logically before DEFs, so start with them. CurrUse = CurrInst->GetFirstUse(); @@ -1537,7 +1516,7 @@ bool SMPBasicBlock::FindLoopHeadsAndTails(void) { } // end of SMPBasicBlock::FindLoopHeadsAndTails() // Does DefOp/DefSSANum control loop-back or loop-exit branches? -bool SMPBasicBlock::DoesDefControlLoopFlow(STARSOpndTypePtr DefOp, int DefSSANum, ea_t DefAddr) { +bool SMPBasicBlock::DoesDefControlLoopFlow(STARSOpndTypePtr DefOp, int DefSSANum, STARS_ea_t DefAddr) { bool FoundLoopControl = false; // First, determine if the current block ends with a loop exit or a loop-back. @@ -1545,7 +1524,7 @@ bool SMPBasicBlock::DoesDefControlLoopFlow(STARSOpndTypePtr DefOp, int DefSSANum SMPInstr *LastInst = (*RevInstIter); SMPitype FlowType = LastInst->GetDataFlowType(); if (FlowType == COND_BRANCH) { - ea_t LastAddr = LastInst->GetAddr(); + STARS_ea_t LastAddr = LastInst->GetAddr(); ControlFlowType LastBranchType = this->GetFunc()->GetControlFlowType(LastAddr); if (LastBranchType != LOOP_EXIT) { return false; @@ -1611,7 +1590,7 @@ void SMPBasicBlock::FreeUnusedMemory4(void) { std::set<STARSOpndTypePtr, LessOp>(this->KillSet).swap(this->KillSet); std::set<STARSOpndTypePtr, LessOp>(this->LiveOutSet).swap(this->LiveOutSet); std::set<SMPPhiFunction, LessPhi>(this->PhiFunctions).swap(this->PhiFunctions); - std::map<ea_t, size_t>(this->AddrInstMap).swap(this->AddrInstMap); + std::map<STARS_ea_t, size_t>(this->AddrInstMap).swap(this->AddrInstMap); std::list<SMPBasicBlock *>(this->Predecessors).swap(this->Predecessors); std::list<SMPBasicBlock *>(this->Successors).swap(this->Successors); #endif @@ -1642,7 +1621,7 @@ unsigned int SMPBasicBlock::GetLocalDUIndex(STARSOpndTypePtr DefOp, int SSANum) } // end of SMPBasicBlock::GetLocalDUIndex() // Find the global Def-Use chain index for the given DefOp with given address. -unsigned int SMPBasicBlock::GetGlobalDUIndex(STARSOpndTypePtr DefOp, ea_t DefAddr) { +unsigned int SMPBasicBlock::GetGlobalDUIndex(STARSOpndTypePtr DefOp, STARS_ea_t DefAddr) { unsigned int RegIndex = 0; set<STARSOpndTypePtr, LessOp>::iterator NameIter; @@ -1698,7 +1677,7 @@ bool SMPBasicBlock::HasUseAfterIndWrite(STARSOpndTypePtr MemDefOp, vector<SMPIns void SMPBasicBlock::MarkBranchSignedness(void) { unsigned short SignMask; set<DefOrUse, LessDefUse>::iterator UseIter; - ea_t DefAddr; // for flags USE in branch + STARS_ea_t DefAddr; // for flags USE in branch int SSANum; // for flags USE in branch bool LocalFlags; // is flags register a local name? vector<SMPInstr *>::reverse_iterator InstRevIter; @@ -1739,14 +1718,14 @@ void SMPBasicBlock::MarkBranchSignedness(void) { // and SearchOp will change as we backtrack up the signedness propagation chain. // We recurse on all USEs until we encounter memory operands, also terminating the recursion as // soon as we see an instruction other than a move, compare, or test. -void SMPBasicBlock::PropagateBranchSignedness(ea_t DefAddr, STARSOpndTypePtr SearchOp, unsigned short SignMask) { +void SMPBasicBlock::PropagateBranchSignedness(STARS_ea_t DefAddr, STARSOpndTypePtr SearchOp, unsigned short SignMask) { SMPInstr *DefInst; SMPBasicBlock *DefBlock; set<DefOrUse, LessDefUse>::iterator UseIter; set<DefOrUse, LessDefUse>::iterator DefIter; int DefHashValue, UseHashValue; - ea_t PhiUseDefAddr; // for a Phi USE, where was it DEFed? - ea_t UseDefAddr; // for an instruction USE, where was it DEFed? + STARS_ea_t PhiUseDefAddr; // for a Phi USE, where was it DEFed? + STARS_ea_t UseDefAddr; // for an instruction USE, where was it DEFed? bool LocalDef = this->IsLocalName(SearchOp); if (! SearchOp->IsRegOp()) @@ -1890,7 +1869,7 @@ void SMPBasicBlock::PropagateBranchSignedness(ea_t DefAddr, STARSOpndTypePtr Sea #else bool PropagateThroughUses = false; #endif - ea_t UseDefAddr = BADADDR; + STARS_ea_t UseDefAddr = BADADDR; for (UseIter = DefInst->GetFirstUse(); UseIter != DefInst->GetLastUse(); ++UseIter) { STARSOpndTypePtr UseOp = UseIter->GetOp(); if (UseOp->IsRegOp() && ((!ReadsMemory) || (DefInst->IsNonAddressReg(UseOp)))) { // don't want addressing registers @@ -1996,14 +1975,14 @@ bool SMPBasicBlock::PropagateDEFSignedness(void) { } // end of SMPBasicBlock::PropagateDEFSignedness() // backtrack from CallAddr and mark unsigned args based on bitset -void SMPBasicBlock::MarkUnsignedArgs(ea_t CallAddr, unsigned int ArgPosBits) { +void SMPBasicBlock::MarkUnsignedArgs(STARS_ea_t CallAddr, unsigned int ArgPosBits) { vector<SMPInstr *>::reverse_iterator RevInstIter; unsigned int UnsignedArgCount = CountBitsSet(ArgPosBits); unsigned int UnsignedArgsFound = 0; for (RevInstIter = this->GetRevInstBegin(); RevInstIter != this->GetRevInstEnd(); ++RevInstIter) { SMPInstr *CurrInst = (*RevInstIter); - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); if (InstAddr < CallAddr) { SMPitype FlowType = CurrInst->GetDataFlowType(); if ((FlowType == CALL) || (FlowType == INDIR_CALL)) { @@ -2028,14 +2007,14 @@ void SMPBasicBlock::MarkUnsignedArgs(ea_t CallAddr, unsigned int ArgPosBits) { } // end of SMPBasicBlock::MarkUnsignedArgs() // backtrack from CallAddr and mark POINTER args based on bitset -void SMPBasicBlock::MarkPointerArgs(ea_t CallAddr, unsigned int ArgPosBits) { +void SMPBasicBlock::MarkPointerArgs(STARS_ea_t CallAddr, unsigned int ArgPosBits) { vector<SMPInstr *>::reverse_iterator RevInstIter; unsigned int PointerArgCount = CountBitsSet(ArgPosBits); unsigned int PointerArgsFound = 0; for (RevInstIter = this->GetRevInstBegin(); RevInstIter != this->GetRevInstEnd(); ++RevInstIter) { SMPInstr *CurrInst = (*RevInstIter); - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); if (InstAddr < CallAddr) { SMPitype FlowType = CurrInst->GetDataFlowType(); if ((FlowType == CALL) || (FlowType == INDIR_CALL)) { @@ -2074,10 +2053,10 @@ void SMPBasicBlock::MarkPointerArgs(ea_t CallAddr, unsigned int ArgPosBits) { // Find the stack target of a call to memset() and the size in bytes of the memset() region. // If the memset() target is not on the stack, return false. If the // size of the memset() region is not a constant, we also return false. -bool SMPBasicBlock::AnalyzeMemSet(ea_t MemSetAddr, STARSOpndTypePtr &MemSetTarget, size_t &MemSetSize, int &StackOffset, bool &FPRelativeTarget) { +bool SMPBasicBlock::AnalyzeMemSet(STARS_ea_t MemSetAddr, STARSOpndTypePtr &MemSetTarget, size_t &MemSetSize, int &StackOffset, bool &FPRelativeTarget) { set<DefOrUse, LessDefUse>::iterator UseIter; STARSOpndTypePtr DefOp = nullptr, UseOp = nullptr, UltimateSourceOp = nullptr; - ea_t InstAddr; + STARS_ea_t InstAddr; int UseSSANum; bool FoundTarget = false, FoundSize = false; bool UseFP = this->GetFunc()->UsesFramePointer(); @@ -2085,7 +2064,7 @@ bool SMPBasicBlock::AnalyzeMemSet(ea_t MemSetAddr, STARSOpndTypePtr &MemSetTarge vector<SMPInstr *>::reverse_iterator InstRevIter; sval_t CurrentDelta; - ea_t FirstAddr = this->GetFirstAddr(); + STARS_ea_t FirstAddr = this->GetFirstAddr(); if (!(STARS_IsSSAMarkerPseudoID(FirstAddr))) { assert(MemSetAddr >= FirstAddr); } @@ -2124,9 +2103,9 @@ bool SMPBasicBlock::AnalyzeMemSet(ea_t MemSetAddr, STARSOpndTypePtr &MemSetTarge if (MDIsDirectStackAccessOpnd(UseOp, UseFP)) { int BaseReg, IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; MDExtractAddressFields(UseOp, BaseReg, IndexReg, ScaleFactor, offset); - if ((R_none != IndexReg) || (0 != ScaleFactor)) { + if ((STARS_x86_R_none != IndexReg) || (0 != ScaleFactor)) { break; // cannot make use of complex stack loc expression } else { @@ -2164,9 +2143,9 @@ bool SMPBasicBlock::AnalyzeMemSet(ea_t MemSetAddr, STARSOpndTypePtr &MemSetTarge // UltimateSourceOp. int BaseReg, IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; MDExtractAddressFields(UltimateSourceOp, BaseReg, IndexReg, ScaleFactor, offset); - if ((R_none != IndexReg) || (0 != ScaleFactor)) { + if ((STARS_x86_R_none != IndexReg) || (0 != ScaleFactor)) { break; // cannot make use of complex stack loc expression } else { @@ -2225,7 +2204,7 @@ bool SMPBasicBlock::AnalyzeMemSet(ea_t MemSetAddr, STARSOpndTypePtr &MemSetTarge // For the newly defined type DefType for DefOp at instruction DefAddr, propagate the // type to all USEs in the local SSA chain for the DEF. If any USE types change, // return true. -bool SMPBasicBlock::PropagateLocalDefType(STARSOpndTypePtr DefOp, SMPOperandType DefType, ea_t DefAddr, int SSANum, bool IsMemOp, bool PointerOverride) { +bool SMPBasicBlock::PropagateLocalDefType(STARSOpndTypePtr DefOp, SMPOperandType DefType, STARS_ea_t DefAddr, int SSANum, bool IsMemOp, bool PointerOverride) { bool changed = false; bool SafeFunc = (this->MyFunc) && this->MyFunc->IsSafe(); bool DebugFlag = false; @@ -2263,7 +2242,7 @@ bool SMPBasicBlock::PropagateLocalDefType(STARSOpndTypePtr DefOp, SMPOperandType while (InstIter != this->GetLastInst()) { SMPInstr *CurrInst = (*InstIter); ++InstIter; - ea_t CurrAddr = CurrInst->GetAddr(); + STARS_ea_t CurrAddr = CurrInst->GetAddr(); #if SMP_VERBOSE_ALIAS_DETECTION if (IsMemOp && (CurrInst->HasIndirectMemoryWrite())) { SMP_msg("CAUTION: Indirect memory write in MemOp chain.\n"); @@ -2302,7 +2281,7 @@ bool SMPBasicBlock::PropagateLocalDefType(STARSOpndTypePtr DefOp, SMPOperandType changed = true; } else if (IsDataPtr(DefType) && IsNumeric(UseType) - && ((InstOpcode == NN_adc) || (InstOpcode == NN_sbb))) { + && ((InstOpcode == STARS_NN_adc) || (InstOpcode == STARS_NN_sbb))) { SMP_msg("ADC/SBB: Refining NUMERIC to %d at %lx %s for USE:", DefType, (unsigned long) CurrInst->GetAddr(), CurrInst->GetDisasm()); CurrUse->Dump(); @@ -2449,7 +2428,7 @@ bool SMPBasicBlock::PropagateGlobalDefType(STARSOpndTypePtr DefOp, SMPOperandTyp bool FoundUse = false; for (InstIter = this->GetFirstInst(); InstIter != this->GetLastInst(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); #if 0 if (IsMemOp && (CurrInst->HasIndirectMemoryWrite())) { if (!SafeFunc) { @@ -2528,7 +2507,7 @@ bool SMPBasicBlock::PropagateGlobalDefType(STARSOpndTypePtr DefOp, SMPOperandTyp changed = true; } else if (IsDataPtr(DefType) && IsNumeric(UseType) - && ((InstOpcode == NN_adc) || (InstOpcode == NN_sbb))) { + && ((InstOpcode == STARS_NN_adc) || (InstOpcode == STARS_NN_sbb))) { SMP_msg("ADC/SBB: Refining NUMERIC to %d at %lx %s for USE:", DefType, (unsigned long) CurrInst->GetAddr(), CurrInst->GetDisasm()); CurrUse->Dump(); @@ -2578,7 +2557,7 @@ bool SMPBasicBlock::PropagateGlobalDefType(STARSOpndTypePtr DefOp, SMPOperandTyp // Propagate the metadata Status for UseOp/SSANum to its local DEF. // Return true if successful. -bool SMPBasicBlock::PropagateLocalMetadata(STARSOpndTypePtr UseOp, SMPMetadataType Status, int SSANum, ea_t UseAddr) { +bool SMPBasicBlock::PropagateLocalMetadata(STARSOpndTypePtr UseOp, SMPMetadataType Status, int SSANum, STARS_ea_t UseAddr) { bool changed = false; set<STARSOpndTypePtr, LessOp>::iterator NameIter; NameIter = this->FindLocalName(UseOp); @@ -2587,7 +2566,7 @@ bool SMPBasicBlock::PropagateLocalMetadata(STARSOpndTypePtr UseOp, SMPMetadataTy } assert(0 <= SSANum); - ea_t DefAddr = this->GetDefAddrFromUseAddr(UseOp, UseAddr, SSANum, true); + STARS_ea_t DefAddr = this->GetDefAddrFromUseAddr(UseOp, UseAddr, SSANum, true); if ((DefAddr == BADADDR) || STARS_IsLiveInPseudoID(DefAddr)) { return false; } @@ -2645,9 +2624,9 @@ bool SMPBasicBlock::PropagateLocalMetadata(STARSOpndTypePtr UseOp, SMPMetadataTy return changed; // address regs are not live metadata } else if ((5 == CurrInst->GetOptType()) - || (NN_and == CurrInst->GetIDAOpcode()) - || (NN_or == CurrInst->GetIDAOpcode()) - || (NN_xor == CurrInst->GetIDAOpcode())) { + || (STARS_NN_and == CurrInst->GetIDAOpcode()) + || (STARS_NN_or == CurrInst->GetIDAOpcode()) + || (STARS_NN_xor == CurrInst->GetIDAOpcode())) { // add, subtract, and, or with memsrc // Find the DEF reg in the USE list. CurrUse = CurrInst->FindUse(UseOp); @@ -2689,7 +2668,7 @@ bool SMPBasicBlock::PropagateLocalMetadata(STARSOpndTypePtr UseOp, SMPMetadataTy // For the UNINIT type DEF DefOp at instruction DefAddr, see if all its USEs have // a single type. If so, set the DEF to that type and return true, else return false. -bool SMPBasicBlock::InferLocalDefType(STARSOpndTypePtr DefOp, unsigned int LocIndex, ea_t DefAddr) { +bool SMPBasicBlock::InferLocalDefType(STARSOpndTypePtr DefOp, unsigned int LocIndex, STARS_ea_t DefAddr) { bool changed = false; bool DebugFlag = false; #if SMP_DEBUG_OPTIMIZATIONS @@ -2732,7 +2711,7 @@ bool SMPBasicBlock::InferLocalDefType(STARSOpndTypePtr DefOp, unsigned int LocIn ++InstIter; for ( ; InstIter != this->GetLastInst(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); - ea_t CurrAddr = CurrInst->GetAddr(); + STARS_ea_t CurrAddr = CurrInst->GetAddr(); CurrUse = CurrInst->FindUse(DefOp); if (CurrUse != CurrInst->GetLastUse()) { // found a USE in the chain if (!FirstUseSeen) @@ -2796,7 +2775,7 @@ bool SMPBasicBlock::InferLocalDefType(STARSOpndTypePtr DefOp, unsigned int LocIn return changed; } // end of SMPBasicBlock::InferLocalDefType() -void SMPBasicBlock::InferGlobalDefType(STARSOpndTypePtr DefOp, int SSANum, ea_t DefAddr, bool &FoundNumeric, bool &FoundPointer, +void SMPBasicBlock::InferGlobalDefType(STARSOpndTypePtr DefOp, int SSANum, STARS_ea_t DefAddr, bool &FoundNumeric, bool &FoundPointer, bool &FoundUnknown, bool &FoundUninit, SMPOperandType &PtrType) { // Avoid infinite recursion @@ -2882,7 +2861,7 @@ void SMPBasicBlock::InferGlobalDefType(STARSOpndTypePtr DefOp, int SSANum, ea_t if (DefEscapes) { // Need to recurse into successor blocks list<SMPBasicBlock *>::iterator SuccIter; - ea_t TempAddr; + STARS_ea_t TempAddr; set<SMPPhiFunction, LessPhi>::iterator PhiIter; for (SuccIter = this->GetFirstSucc(); SuccIter != this->GetLastSucc(); ++SuccIter) { SMPBasicBlock *CurrBlock = (*SuccIter); @@ -3036,7 +3015,7 @@ bool SMPBasicBlock::IsGlobalNameUsedLiveIn(STARSOpndTypePtr GlobalOp) { } // end of SMPBasicBlock::IsGlobalNameUsed() // Extension of IsRegDead for Global names. Check and see if it overlaps with a DEF-USE chain -bool SMPBasicBlock::IsGlobalRegDead(ea_t InstAddr, STARSOpndTypePtr Operand, unsigned int RegIndex) { +bool SMPBasicBlock::IsGlobalRegDead(STARS_ea_t InstAddr, STARSOpndTypePtr Operand, unsigned int RegIndex) { bool FoundInLiveInSet = this->IsLiveIn(Operand); bool FoundInLiveOutSet = this->IsLiveOut(Operand); bool FoundInKillSet = this->IsVarKill(Operand); @@ -3082,7 +3061,7 @@ bool SMPBasicBlock::IsGlobalRegDead(ea_t InstAddr, STARSOpndTypePtr Operand, uns // falls between the USEs of the instruction at InstAddr and its DEFs), for register RegIndex, // then it is safe for the instrumentation to use that register without saving and // restoring its value. Return true in this case, false if there is DEF-USE overlap. -bool SMPBasicBlock::IsRegDead(ea_t InstAddr, uint16 RegNo) { +bool SMPBasicBlock::IsRegDead(STARS_ea_t InstAddr, uint16 RegNo) { // See if any DEF-USE chains overlap InstAddr's USEs. vector<SMPInstr *>::iterator InstIter = this->GetInstIterFromAddr(InstAddr); STARSOpndTypePtr RegOp = (*InstIter)->MakeRegOpnd(RegNo); @@ -3130,7 +3109,7 @@ void SMPBasicBlock::MarkDeadRegs(void) { SMPInstr *CurrInst = (*InstIter); if (CurrInst->IsMarkerInst()) continue; - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); DebugFlag = (0x804dafc == InstAddr); if (DebugFlag) { CurrInst->PrintOperands(); @@ -3223,7 +3202,7 @@ void SMPBasicBlock::MarkDeadRegs(void) { } // end of SMPBasicBlock::MarkDeadRegs() // Does DefOp at DefAddr never get used? -bool SMPBasicBlock::IsDefDead(ea_t DefAddr, STARSOpndTypePtr DefOp) { +bool SMPBasicBlock::IsDefDead(STARS_ea_t DefAddr, STARSOpndTypePtr DefOp) { vector<SMPInstr *>::iterator InstIter = this->GetInstIterFromAddr(DefAddr); ++InstIter; // start with next instruction @@ -3248,7 +3227,7 @@ bool SMPBasicBlock::IsDefDead(ea_t DefAddr, STARSOpndTypePtr DefOp) { // Return true and produce list if any flags are live out of inst at InstAddr. // NOTE: Assumes deadregs have been computed for all registers. -bool SMPBasicBlock::AreFlagsLiveAfterInst(ea_t InstAddr, set<int> &LiveFlagRegs) { +bool SMPBasicBlock::AreFlagsLiveAfterInst(STARS_ea_t InstAddr, set<int> &LiveFlagRegs) { vector<SMPInstr *>::iterator InstIter = this->GetInstIterFromAddr(InstAddr); STARSOpndTypePtr FlagsOp = (*InstIter)->MakeRegOpnd(MD_FLAGS_REG); @@ -3300,7 +3279,7 @@ bool SMPBasicBlock::AreFlagsLiveAfterInst(ea_t InstAddr, set<int> &LiveFlagRegs) } // end of SMPBasicBlock::AreFlagsLiveAfterInst() // Return true if DefOp at DefAddr is used in or redefined by addition; pass back AdditionAddr -bool SMPBasicBlock::IsDefInvolvedInAddition(ea_t DefAddr, STARSOpndTypePtr DefOp, ea_t &AdditionAddr) { +bool SMPBasicBlock::IsDefInvolvedInAddition(STARS_ea_t DefAddr, STARSOpndTypePtr DefOp, STARS_ea_t &AdditionAddr) { set<STARSOpndTypePtr, LessOp>::iterator LocalIter = this->LocalNames.find(DefOp); bool UseFP = this->GetFunc()->UsesFramePointer(); vector<SMPInstr *>::iterator UseInstIter; @@ -3323,7 +3302,7 @@ bool SMPBasicBlock::IsDefInvolvedInAddition(ea_t DefAddr, STARSOpndTypePtr DefOp // Copied to another location via move or subtraction; could reach addition in that location. set<DefOrUse, LessDefUse>::iterator CopyDefIter = UseInst->GetFirstNonFlagsDef(); STARSOpndTypePtr CopyDefOp = CopyDefIter->GetOp(); - ea_t CopyAdditionAddr; + STARS_ea_t CopyAdditionAddr; if (this->IsDefInvolvedInAddition(UseInst->GetAddr(), CopyDefOp, CopyAdditionAddr)) { AdditionAddr = CopyAdditionAddr; return true; @@ -3341,7 +3320,7 @@ bool SMPBasicBlock::IsDefInvolvedInAddition(ea_t DefAddr, STARSOpndTypePtr DefOp } // end of SMPBasicBlock::IsDefInvolvedInAddition() // Does a copy of UseOp get shifted right in this block? -bool SMPBasicBlock::IsUseCopiedAndShiftedRight(STARSOpndTypePtr UseOp, ea_t UseAddr) { +bool SMPBasicBlock::IsUseCopiedAndShiftedRight(STARSOpndTypePtr UseOp, STARS_ea_t UseAddr) { SMPInstr *UseInst = this->FindInstr(UseAddr); STARSOpndTypePtr SearchOp = UseOp; set<DefOrUse, LessDefUse>::iterator UseIter = UseInst->FindUse(SearchOp); @@ -3386,7 +3365,7 @@ bool SMPBasicBlock::IsUseCopiedAndShiftedRight(STARSOpndTypePtr UseOp, ea_t UseA } // end of SMPBasicBlock::IsUseCopiedAndShiftedRight() // Does value of DefOp/DefSSANum reach block end in any computation of any DEF at all? -bool SMPBasicBlock::DoesDefReachBlockEnd(ea_t DefAddr, STARSOpndTypePtr DefOp, int DefSSANum, set<int> &NonEscapingRegisterHashes) { +bool SMPBasicBlock::DoesDefReachBlockEnd(STARS_ea_t DefAddr, STARSOpndTypePtr DefOp, int DefSSANum, set<int> &NonEscapingRegisterHashes) { set<STARSOpndTypePtr, LessOp>::iterator LocalIter = this->LocalNames.find(DefOp); bool LocalName = (LocalIter != this->LocalNames.end()); bool DoesEscape = false; @@ -3424,7 +3403,7 @@ bool SMPBasicBlock::DoesDefReachBlockEnd(ea_t DefAddr, STARSOpndTypePtr DefOp, i continue; } } - ea_t NextDefAddr = NextInst->GetAddr(); + STARS_ea_t NextDefAddr = NextInst->GetAddr(); if (this->DoesDefReachBlockEnd(NextDefAddr, NextDefOp, NextDefSSANum, NonEscapingRegisterHashes)) { DoesEscape = true; break; @@ -3457,7 +3436,7 @@ bool SMPBasicBlock::DoesDefReachBlockEnd(ea_t DefAddr, STARSOpndTypePtr DefOp, i } // end of SMPBasicBlock::DoesDefReachBlockEnd() // DefOp/DefSSANum is only used in LoopNum (outside of DefAddr) as address reg or Phi USE -bool SMPBasicBlock::IsDefOnlyUsedAsAddressReg(ea_t DefAddr, STARSOpndTypePtr DefOp, size_t LoopNum, size_t &AddrUseCounter, SMPOperandType &MemType) { +bool SMPBasicBlock::IsDefOnlyUsedAsAddressReg(STARS_ea_t DefAddr, STARSOpndTypePtr DefOp, size_t LoopNum, size_t &AddrUseCounter, SMPOperandType &MemType) { bool OnlyAddressReg = false; bool ReDefSeen = false; @@ -3473,7 +3452,7 @@ bool SMPBasicBlock::IsDefOnlyUsedAsAddressReg(ea_t DefAddr, STARSOpndTypePtr Def set<DefOrUse, LessDefUse>::iterator UseIter; for (InstIter = this->GetFirstInst(); InstIter != this->GetLastInst(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); if (CurrInst->IsMarkerInst()) continue; if (InstAddr != DefAddr) { // Skip induction variable re-definition. @@ -3487,7 +3466,7 @@ bool SMPBasicBlock::IsDefOnlyUsedAsAddressReg(ea_t DefAddr, STARSOpndTypePtr Def } int BaseReg, IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; MDExtractAddressFields(MemOp, BaseReg, IndexReg, ScaleFactor, offset); if ((BaseReg != DefOp->GetReg()) && (IndexReg != DefOp->GetReg())) { OnlyAddressReg = false; // USEd somehow, but not as an address reg. @@ -3519,7 +3498,7 @@ bool SMPBasicBlock::IsDefOnlyUsedAsAddressReg(ea_t DefAddr, STARSOpndTypePtr Def this->SetProcessed(true); if (OnlyAddressReg && (!ReDefSeen)) { list<SMPBasicBlock *>::iterator SuccIter; - ea_t PseudoDefAddr; // To identify re-DEF instructions in successor blocks. + STARS_ea_t PseudoDefAddr; // To identify re-DEF instructions in successor blocks. for (SuccIter = this->GetFirstSucc(); SuccIter != this->GetLastSucc(); ++SuccIter) { PseudoDefAddr = STARS_LIVEIN_PSEUDO_ID; // any DEF without USE will be seen as a re-DEF in successor. if (!(*SuccIter)->IsDefOnlyUsedAsAddressReg(PseudoDefAddr, DefOp, LoopNum, AddrUseCounter, MemType)) { @@ -3542,7 +3521,7 @@ bool SMPBasicBlock::IsDefOnlyUsedAsAddressReg(ea_t DefAddr, STARSOpndTypePtr Def // Is DefOp/DefAddr used in a loop back edge compare-and-branch? -bool SMPBasicBlock::IsDefUsedInLoopCompareAndBranch(ea_t DefAddr, STARSOpndTypePtr DefOp, int DefSSANum, bool &Signed) { +bool SMPBasicBlock::IsDefUsedInLoopCompareAndBranch(STARS_ea_t DefAddr, STARSOpndTypePtr DefOp, int DefSSANum, bool &Signed) { bool UsedInCompareAndBranch = false; bool ReDefSeen = false; bool ReDefInvalidates = false; @@ -3567,7 +3546,7 @@ bool SMPBasicBlock::IsDefUsedInLoopCompareAndBranch(ea_t DefAddr, STARSOpndTypeP set<DefOrUse, LessDefUse>::iterator UseIter; for (InstIter = this->GetFirstInst(); InstIter != this->GetLastInst(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); if (CurrInst->IsMarkerInst()) continue; if (InstAddr > DefAddr) { // Don't waste time before DefAddr. @@ -3648,7 +3627,7 @@ bool SMPBasicBlock::IsDefUsedInLoopCompareAndBranch(ea_t DefAddr, STARSOpndTypeP if (!UsedInCompareAndBranch && (!CompareSeen) && !ReDefInvalidates) { list<SMPBasicBlock *>::iterator SuccIter; - ea_t PseudoDefAddr; // To identify re-DEF instructions in successor blocks. + STARS_ea_t PseudoDefAddr; // To identify re-DEF instructions in successor blocks. for (SuccIter = this->GetFirstSucc(); SuccIter != this->GetLastSucc(); ++SuccIter) { if ((*SuccIter)->IsLiveIn(SearchOp)) { PseudoDefAddr = STARS_LIVEIN_PSEUDO_ID; // any DEF without USE will be seen as a re-DEF in successor. @@ -3664,7 +3643,7 @@ bool SMPBasicBlock::IsDefUsedInLoopCompareAndBranch(ea_t DefAddr, STARSOpndTypeP } // end of SMPBasicBlock::IsDefUsedInLoopCompareAndBranch() // erase() block starting at FirstAddr from Preds list -void SMPBasicBlock::ErasePred(ea_t FirstBlockAddr) { +void SMPBasicBlock::ErasePred(STARS_ea_t FirstBlockAddr) { list<SMPBasicBlock *>::iterator PredIter; PredIter = this->Predecessors.begin(); while (PredIter != this->Predecessors.end()) { @@ -3679,7 +3658,7 @@ void SMPBasicBlock::ErasePred(ea_t FirstBlockAddr) { } // end of SMPBasicBlock::ErasePred() // erase() block starting at FirstAddr from Successors list -void SMPBasicBlock::EraseSucc(ea_t FirstBlockAddr) { +void SMPBasicBlock::EraseSucc(STARS_ea_t FirstBlockAddr) { list<SMPBasicBlock *>::iterator SuccIter; SuccIter = this->Successors.begin(); while (SuccIter != this->Successors.end()) { @@ -3695,8 +3674,8 @@ void SMPBasicBlock::EraseSucc(ea_t FirstBlockAddr) { // Add ReachInDefn to the ReachesIn set. If it was not already present, // then update the ReachesOutStale flag. -void SMPBasicBlock::AddReachesIn(pair<STARSOpndTypePtr, ea_t> ReachInDefn) { - pair<set<pair<STARSOpndTypePtr, ea_t>, LessDefinition>::iterator, bool> InsertResult; +void SMPBasicBlock::AddReachesIn(pair<STARSOpndTypePtr, STARS_ea_t> ReachInDefn) { + pair<set<pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition>::iterator, bool> InsertResult; InsertResult = ReachesInSet.insert(ReachInDefn); if (InsertResult.second) { // New element added; ReachesOut set might be stale. @@ -3708,8 +3687,8 @@ void SMPBasicBlock::AddReachesIn(pair<STARSOpndTypePtr, ea_t> ReachInDefn) { // present in the ReachesOut set, then propagate it to the ReachesIn sets // of all successor blocks. NOTE: The policy here is to keep the ReachesIn // sets up to date at all times. -void SMPBasicBlock::AddReachesOut(pair<STARSOpndTypePtr, ea_t> ReachOutDefn) { - pair<set<pair<STARSOpndTypePtr, ea_t>, LessDefinition>::iterator, bool> InsertResult; +void SMPBasicBlock::AddReachesOut(pair<STARSOpndTypePtr, STARS_ea_t> ReachOutDefn) { + pair<set<pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition>::iterator, bool> InsertResult; InsertResult = ReachesOutSet.insert(ReachOutDefn); if (InsertResult.second) { // Insertion was of a new element; propagate to ReachesIn of all successors. @@ -4078,7 +4057,7 @@ bool SMPBasicBlock::FindRedundantLocalMetadata(bool SafeFunc) { for (InstIter = this->GetFirstInst(); InstIter != this->GetLastInst(); ++InstIter) { CurrInst = (*InstIter); - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); if (CurrInst->IsMarkerInst()) continue; // skip SSA marker instruction; has no normal DEFs CallInst = ((CurrInst->GetDataFlowType() == CALL) @@ -4273,7 +4252,7 @@ bool SMPBasicBlock::IsBenignOverflowDEF(STARSOpndTypePtr DefOp, int DefSSANum, s // only capable of two-address instructions. For either of the source operands, we want to // suppress annotations if the ultimate source was any special operation, such as bitwise operations // or zero-extended moves. - ea_t SourceInstAddr = BADADDR; + STARS_ea_t SourceInstAddr = BADADDR; int UseSSANum = SMP_SSA_UNINIT; bool SpecialSourceFound = false; if (DefInst->MDIsLoadEffectiveAddressInstr()) { @@ -4389,7 +4368,7 @@ bool SMPBasicBlock::IsBenignOverflowDEF(STARSOpndTypePtr DefOp, int DefSSANum, s UseIter = DefInst->FindUse(DefOp); if (UseIter != DefInst->GetLastUse()) { int UseSSANum = UseIter->GetSSANum(); - ea_t UseDefAddr = this->GetDefAddrFromUseAddr(DefOp, DefAddr, UseSSANum, LocalDefName); + STARS_ea_t UseDefAddr = this->GetDefAddrFromUseAddr(DefOp, DefAddr, UseSSANum, LocalDefName); if (UseDefAddr >= this->GetFirstAddr() && (UseDefAddr <= this->GetLastAddr())) { // Limit to the simple case in which UseDefAddr is in our block, not Phi function or function entry marker inst. SMPInstr *UseDefInst = this->GetFunc()->GetInstFromAddr(UseDefAddr); @@ -4439,10 +4418,10 @@ bool SMPBasicBlock::IsBenignOverflowDEF(STARSOpndTypePtr DefOp, int DefSSANum, s STARSOpndTypePtr UseOp = DefInst->GetLeaMemUseOp(); int BaseReg, IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; MDExtractAddressFields(UseOp, BaseReg, IndexReg, ScaleFactor, offset); - bool SafeBaseReg = (BaseReg == R_none); - bool SafeIndexReg = (IndexReg == R_none); + bool SafeBaseReg = (BaseReg == STARS_x86_R_none); + bool SafeIndexReg = (IndexReg == STARS_x86_R_none); STARSOpndTypePtr SearchOp = nullptr; if (!SafeBaseReg) { SearchOp = DefInst->MakeRegOpnd(BaseReg); @@ -4616,7 +4595,7 @@ bool SMPBasicBlock::IsBenignOverflowDEF(STARSOpndTypePtr DefOp, int DefSSANum, s InstIter = this->GetInstIterFromAddr(DefAddr); assert(InstIter != this->GetLastInst()); vector<SMPInstr *>::reverse_iterator RevInstIter(InstIter); - ea_t FirstAddrFound = (*InstIter)->GetAddr(); + STARS_ea_t FirstAddrFound = (*InstIter)->GetAddr(); while (RevInstIter != this->GetRevInstEnd()) { SMPInstr *SearchInst = (*RevInstIter); if (SearchInst->FindDef(DefOp) != SearchInst->GetLastDef()) { @@ -4715,7 +4694,7 @@ bool SMPBasicBlock::IsBenignOverflowDEF(STARSOpndTypePtr DefOp, int DefSSANum, s set<DefOrUse, LessDefUse>::iterator UseIter = DefInst->FindUse(UseOp2); assert(UseIter != DefInst->GetLastUse()); int UseSSANum = UseIter->GetSSANum(); - ea_t UseDefAddr = this->GetDefAddrFromUseAddr(UseOp2, DefAddr, UseSSANum, this->IsLocalName(UseOp2)); + STARS_ea_t UseDefAddr = this->GetDefAddrFromUseAddr(UseOp2, DefAddr, UseSSANum, this->IsLocalName(UseOp2)); // Stick with simple case in which an instruction was found in the block. if ((UseDefAddr >= this->GetFirstAddr()) && (UseDefAddr <= this->GetLastAddr())) { vector<SMPInstr *>::iterator InstIter = this->GetInstIterFromAddr(UseDefAddr); @@ -4742,7 +4721,7 @@ bool SMPBasicBlock::IsBenignOverflowDEF(STARSOpndTypePtr DefOp, int DefSSANum, s set<DefOrUse, LessDefUse>::iterator UseIter = DefInst->FindUse(DefOp); assert(UseIter != DefInst->GetLastUse()); int DefUseSSANum = UseIter->GetSSANum(); - ea_t DefUseDefAddr = this->GetDefAddrFromUseAddr(DefOp, DefAddr, DefUseSSANum, this->IsLocalName(DefOp)); + STARS_ea_t DefUseDefAddr = this->GetDefAddrFromUseAddr(DefOp, DefAddr, DefUseSSANum, this->IsLocalName(DefOp)); // Stick with simple case in which an instruction was found in the block. if ((DefUseDefAddr >= this->GetFirstAddr()) && (DefUseDefAddr <= this->GetLastAddr())) { @@ -4770,7 +4749,7 @@ bool SMPBasicBlock::IsBenignOverflowDEF(STARSOpndTypePtr DefOp, int DefSSANum, s } // end of SMPBasicBlock::IsBenignOverflowDEF() // Is subword of DefOp written later, before TruncAddr? -bool SMPBasicBlock::IsDEFWrittenWithTruncation(STARSOpndTypePtr DefOp, int DefSSANum, ea_t DefAddr, ea_t TruncAddr, bool PhiDEF) { +bool SMPBasicBlock::IsDEFWrittenWithTruncation(STARSOpndTypePtr DefOp, int DefSSANum, STARS_ea_t DefAddr, STARS_ea_t TruncAddr, bool PhiDEF) { assert(DefOp->IsRegOp()); STARSOpndTypePtr SearchOp = CloneIfNecessary(DefOp, this->GetFunc()->UsesFramePointer()); CanonicalizeOpnd(SearchOp); @@ -4785,7 +4764,7 @@ bool SMPBasicBlock::IsDEFWrittenWithTruncation(STARSOpndTypePtr DefOp, int DefSS while (InstIter != this->GetLastInst()) { // Search for subword write of DefOp/DefSSANum. SMPInstr *CurrInst = (*InstIter); - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); if (InstAddr >= TruncAddr) break; // else we will find the apparent truncation we started with! @@ -4981,7 +4960,7 @@ bool SMPBasicBlock::IsBenignTruncationDEF(STARSOpndTypePtr DefOp, int DefSSANum, return true; SMPInstr *DefInst = this->GetFunc()->GetInstFromAddr(DefAddr); - ea_t SourceInstAddr = BADADDR; + STARS_ea_t SourceInstAddr = BADADDR; SMPInstr *SourceInst = NULL; int DefUseSSANum = SMP_SSA_UNINIT; bool SpecialSourceFound = false; @@ -5004,7 +4983,7 @@ bool SMPBasicBlock::IsBenignTruncationDEF(STARSOpndTypePtr DefOp, int DefSSANum, // See if truncation use is a copy of another register that gets subword masked, which // is a sign that the truncation use is also only valid for the lower bits. bool LocalName = this->IsLocalName(SearchOp); - ea_t UseDefAddr = this->GetDefAddrFromUseAddr(SearchOp, DefAddr, UseSSANum, LocalName); + STARS_ea_t UseDefAddr = this->GetDefAddrFromUseAddr(SearchOp, DefAddr, UseSSANum, LocalName); if ((BADADDR != UseDefAddr) && (!STARS_IsBlockNumPseudoID(UseDefAddr))) { // We have a valid inst addr (not Phi block number). See if it is a reg to reg copy. SMPInstr *CopyInst = this->GetFunc()->GetInstFromAddr(UseDefAddr); @@ -5051,7 +5030,7 @@ bool SMPBasicBlock::IsBenignTruncationDEF(STARSOpndTypePtr DefOp, int DefSSANum, set<DefOrUse, LessDefUse>::iterator UseIter = CurrInst->FindUse(SearchOp); if ((UseIter != CurrInst->GetLastUse()) && (UseSSANum == UseIter->GetSSANum())) { // Found a copy of SearchOp+UseSSANum to another register. - ea_t CopyAddr = CurrInst->GetAddr(); + STARS_ea_t CopyAddr = CurrInst->GetAddr(); set<DefOrUse, LessDefUse>::iterator DefIter = CurrInst->GetFirstNonFlagsDef(); STARSOpndTypePtr CopyRegOp = DefIter->GetOp(); int CopyRegSSANum = DefIter->GetSSANum(); @@ -5075,7 +5054,7 @@ bool SMPBasicBlock::IsBenignTruncationDEF(STARSOpndTypePtr DefOp, int DefSSANum, // etc. // write subword of edx ; not really a truncation bool LocalName = this->IsLocalName(SearchOp); - ea_t UseDefAddr = this->GetDefAddrFromUseAddr(SearchOp, DefAddr, UseSSANum, LocalName); + STARS_ea_t UseDefAddr = this->GetDefAddrFromUseAddr(SearchOp, DefAddr, UseSSANum, LocalName); if (BADADDR != UseDefAddr) { // Check for Phi DEF instead of inst DEF. bool PhiDEF = false; @@ -5102,14 +5081,14 @@ bool SMPBasicBlock::IsBenignTruncationDEF(STARSOpndTypePtr DefOp, int DefSSANum, } // end of SMPBasicBlock::IsBenignTruncationDEF() // Does DefOp+DefSSANum get subreg masked before it gets re-DEFined? -bool SMPBasicBlock::IsDefMaskedOrShiftedRight(STARSOpndTypePtr DefOp, int DefSSANum, ea_t DefAddr) { +bool SMPBasicBlock::IsDefMaskedOrShiftedRight(STARSOpndTypePtr DefOp, int DefSSANum, STARS_ea_t DefAddr) { bool MaskingDetected = false; vector<SMPInstr *>::iterator InstIter; set<DefOrUse, LessDefUse>::iterator UseIter, DefIter; STARSOpndTypePtr SearchOp = CloneIfSubwordReg(DefOp); int UseSSANum; - ea_t InstAddr; + STARS_ea_t InstAddr; size_t BytesMasked; if (DefOp->IsRegOp()) { @@ -5174,7 +5153,7 @@ bool SMPBasicBlock::UseHasCriticalSink(STARSOpndTypePtr DefOp, int DefSSANum, ST bool FoundArgPass = false; int SearchSSANum = DefSSANum; int SearchSSANum2 = DefSSANum2; - ea_t InstAddr; // for debugging, breakpoints, etc. + STARS_ea_t InstAddr; // for debugging, breakpoints, etc. size_t ArgumentNumber = 7; // init to bad number // avoid infinite recursion @@ -5370,11 +5349,11 @@ bool SMPBasicBlock::UseHasCriticalSink(STARSOpndTypePtr DefOp, int DefSSANum, ST // It is safe to emit signedness checks when the very next use of a stack DEF is as // a sign-extended or zero-extended load. Beyond a single basic block, we need to // do more analysis. This catches a simple case that is valid across all programs. -bool SMPBasicBlock::IsStackOpNextUsedWithSignedness(STARSOpndTypePtr StackDefOp, ea_t DefAddr, int SSANum) { +bool SMPBasicBlock::IsStackOpNextUsedWithSignedness(STARSOpndTypePtr StackDefOp, STARS_ea_t DefAddr, int SSANum) { bool SafeCheck = false; vector<SMPInstr *>::iterator InstIter; set<DefOrUse, LessDefUse>::iterator UseIter; - ea_t InstAddr; // for debugging, breakpoints, etc. + STARS_ea_t InstAddr; // for debugging, breakpoints, etc. bool FoundDefInst = false; for (InstIter = this->GetFirstInst(); InstIter != this->GetLastInst(); ++InstIter) { @@ -5415,7 +5394,7 @@ void SMPBasicBlock::SuppressAnnotOnSignChangingAddition(STARSOpndTypePtr DefOp, ++DefInstIter; while (DefInstIter != this->GetLastInst()) { SMPInstr *CurrInst = (*DefInstIter); - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); if (CurrInst->MDIsSmallPositiveAddition()) { UseIter = CurrInst->FindUse(DefOp); if (UseIter != CurrInst->GetLastUse()) { @@ -5466,13 +5445,13 @@ void SMPBasicBlock::AnalyzePrepForNumericAnnotations(void) { if (this->HasCallInstruction()) { vector<SMPInstr *>::iterator InstIter; bool FoundTrustedCall = false; - ea_t FirstTrustedCallAddr = 0xfffffff0; + STARS_ea_t FirstTrustedCallAddr = 0xfffffff0; SMPInstr *CurrInst; - ea_t InstAddr; + STARS_ea_t InstAddr; unsigned int TaintArgPosBits = 0; bool FoundTaintWarningCall = false; - ea_t FirstTaintSensitiveCallAddr; - ea_t SkipOverCallAddr = 0; + STARS_ea_t FirstTaintSensitiveCallAddr; + STARS_ea_t SkipOverCallAddr = 0; string TaintFuncName; // See if we have any calls to system calls that produce trusted output or are taint sensitive. @@ -5543,9 +5522,9 @@ void SMPBasicBlock::AnalyzePrepForNumericAnnotations(void) { if (UseIter != CurrInst->GetLastUse()) { int UseSSANum = UseIter->GetSSANum(); this->GetFunc()->ResetProcessedBlocks(); // prevent infinite recursion in IsOpSourceByteSwap() - ea_t ByteSwapAddr; + STARS_ea_t ByteSwapAddr; if (CurrInst->IsOpSourceByteSwap(ArgSourceOp, UseSSANum, ByteSwapAddr)) { - SMP_fprintf(ZST_AlarmFile, "ALARM: Call to %s at %lx receives user-tainted argument at %lx which was tainted at %lx\n", + SMP_fprintf(global_STARS_program->GetAlarmFile(), "ALARM: Call to %s at %lx receives user-tainted argument at %lx which was tainted at %lx\n", TaintFuncName.c_str(), (unsigned long) FirstTaintSensitiveCallAddr, (unsigned long) InstAddr, (unsigned long) ByteSwapAddr); break; } @@ -5560,7 +5539,7 @@ void SMPBasicBlock::AnalyzePrepForNumericAnnotations(void) { } } // end if block has call else if (STARS_HASH_BLOCK_MIN_INSTRS <= this->InstVec.size()) { - ea_t InstAddr; + STARS_ea_t InstAddr; size_t HashingArithmeticCount = 0; for (vector<SMPInstr *>::iterator InstIter = this->GetFirstInst(); InstIter != this->GetLastInst(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); @@ -5624,7 +5603,7 @@ bool SMPBasicBlock::IsBranchSignednessUnreliable(void) { // UNSIGNED. bool JumpAbove = false; bool JumpBelow = false; - ea_t TargetAddr = BADADDR, BranchAddr = BADADDR; + STARS_ea_t TargetAddr = BADADDR, BranchAddr = BADADDR; SMPInstr *BranchInst; unsigned short opcode; vector<SMPInstr *>::reverse_iterator InstRevIter; @@ -5636,8 +5615,8 @@ bool SMPBasicBlock::IsBranchSignednessUnreliable(void) { BranchInst = (*InstIter); BranchAddr = BranchInst->GetAddr(); opcode = BranchInst->GetIDAOpcode(); - JumpAbove = (opcode == NN_ja); - JumpBelow = (opcode == NN_jb); + JumpAbove = (opcode == STARS_NN_ja); + JumpBelow = (opcode == STARS_NN_jb); if (JumpAbove || JumpBelow) { // We look for the simple pattern of fall-through-only from first block // to second block. @@ -5648,9 +5627,9 @@ bool SMPBasicBlock::IsBranchSignednessUnreliable(void) { BranchInst = (*InstRevIter); opcode = BranchInst->GetIDAOpcode(); if (JumpBelow) - JumpAbove = (opcode == NN_ja); + JumpAbove = (opcode == STARS_NN_ja); else if (JumpAbove) - JumpBelow = (opcode == NN_jb); + JumpBelow = (opcode == STARS_NN_jb); } } } @@ -5660,8 +5639,8 @@ bool SMPBasicBlock::IsBranchSignednessUnreliable(void) { BranchInst = (*InstRevIter); BranchAddr = BranchInst->GetAddr(); opcode = BranchInst->GetIDAOpcode(); - JumpAbove = (opcode == NN_ja); - JumpBelow = (opcode == NN_jb); + JumpAbove = (opcode == STARS_NN_ja); + JumpBelow = (opcode == STARS_NN_jb); if (JumpAbove || JumpBelow) { // We look for the simple pattern of fall-through-only from first block // to second block, plus conditional branch target. @@ -5673,9 +5652,9 @@ bool SMPBasicBlock::IsBranchSignednessUnreliable(void) { BranchInst = (*InstIter); opcode = BranchInst->GetIDAOpcode(); if (JumpBelow) - JumpAbove = (opcode == NN_ja); + JumpAbove = (opcode == STARS_NN_ja); else if (JumpAbove) - JumpBelow = (opcode == NN_jb); + JumpBelow = (opcode == STARS_NN_jb); } } } @@ -5695,7 +5674,7 @@ bool SMPBasicBlock::IsBranchSignednessUnreliable(void) { assert(UseIter != BranchInst->GetLastUse()); int UseSSANum = UseIter->GetSSANum(); bool LocalFlags = this->IsLocalName(UseOp); - ea_t DefAddr = this->GetDefAddrFromUseAddr(UseOp, BranchInst->GetAddr(), UseSSANum, LocalFlags); + STARS_ea_t DefAddr = this->GetDefAddrFromUseAddr(UseOp, BranchInst->GetAddr(), UseSSANum, LocalFlags); // Phi DEFs are rarely or never found as the source of the flags for a branch, so keep it simple. if (!STARS_IsBlockNumPseudoID(DefAddr)) { // DefAddr is an inst, not a Phi DEF. // In order to fit the pattern, we need to see a comparison to a positive immediate constant. @@ -5717,7 +5696,7 @@ bool SMPBasicBlock::IsBranchSignednessUnreliable(void) { UseSSANum = UseIter->GetSSANum(); SMPBasicBlock *CompareBlock = CompareInst->GetBlock(); // just in case it's not this block bool LocalCompName = CompareBlock->IsLocalName(CompareOperand); - ea_t SubtractAddr = CompareBlock->GetDefAddrFromUseAddr(CompareOperand, DefAddr, UseSSANum, LocalCompName); + STARS_ea_t SubtractAddr = CompareBlock->GetDefAddrFromUseAddr(CompareOperand, DefAddr, UseSSANum, LocalCompName); if (!STARS_IsBlockNumPseudoID(SubtractAddr)) { SMPInstr *SubtractInst = this->GetFunc()->GetInstFromAddr(SubtractAddr); STARSOpndTypePtr MinuendOp = nullptr; @@ -5742,11 +5721,11 @@ bool SMPBasicBlock::IsBranchSignednessUnreliable(void) { } // end of SMPBasicBlock::IsBranchSignednessUnreliable() // Find stack adjustment code, if any, after CallAddr. -sval_t SMPBasicBlock::ComputeStackAdjustmentAfterCall(ea_t CallAddr) { +sval_t SMPBasicBlock::ComputeStackAdjustmentAfterCall(STARS_ea_t CallAddr) { sval_t AdjustmentBytes = 0; sval_t PriorAdjustmentBytes = 0; // stack deltas before the call vector<SMPInstr *>::iterator InstIter; - ea_t InstAddr; // for debugging, breakpoints, etc. + STARS_ea_t InstAddr; // for debugging, breakpoints, etc. bool FoundCallInst = false; bool FirstBlock = (this->GetFirstAddr() == this->GetFunc()->GetFirstFuncAddr()); @@ -5824,7 +5803,7 @@ sval_t SMPBasicBlock::ComputeStackAdjustmentAfterCall(ea_t CallAddr) { } // end of SMPBasicBlock::ComputeStackAdjustmentAfterCall() // Is reg DefOp+DefSSANum (popped from WorkList) at DefAddr used as address reg or as source operand in memory write? -bool SMPBasicBlock::IsDefUsedInMemWrite(list<pair<pair<STARSOpndTypePtr, int>, ea_t> > &WorkList, STARSOpndTypePtr DefOp, int DefSSANum, ea_t DefAddr) { +bool SMPBasicBlock::IsDefUsedInMemWrite(list<pair<pair<STARSOpndTypePtr, int>, STARS_ea_t> > &WorkList, STARSOpndTypePtr DefOp, int DefSSANum, STARS_ea_t DefAddr) { #if 0 return true; #else @@ -5873,9 +5852,9 @@ bool SMPBasicBlock::IsDefUsedInMemWrite(list<pair<pair<STARSOpndTypePtr, int>, e if (IsMemOperand(NewDefOp)) { int BaseReg, IndexReg; uint16_t ScaleFactor; - ea_t Offset; + STARS_ea_t Offset; MDExtractAddressFields(NewDefOp, BaseReg, IndexReg, ScaleFactor, Offset); - if ((BaseReg == DefOp->GetReg()) && ((IndexReg == R_none) || (MD_STACK_POINTER_REG == IndexReg))) { + if ((BaseReg == DefOp->GetReg()) && ((IndexReg == STARS_x86_R_none) || (MD_STACK_POINTER_REG == IndexReg))) { // Direct write through DefOp reg. Only danger is the unlikely case that DefOp appears twice, // e.g. mov [eax],eax in which case it is hard to track eax later in memory. DangerousWrite = CurrInst->IsNonAddressReg(DefOp); @@ -5895,7 +5874,7 @@ bool SMPBasicBlock::IsDefUsedInMemWrite(list<pair<pair<STARSOpndTypePtr, int>, e // USEd to create a new DEF by arithmetic or by a copy. int NewDefSSANum = DefIter->GetSSANum(); pair<STARSOpndTypePtr, int> NewSearchItem(NewDefOp, NewDefSSANum); - pair<pair<STARSOpndTypePtr, int>, ea_t> NewWorkListItem(NewSearchItem, CurrInst->GetAddr()); + pair<pair<STARSOpndTypePtr, int>, STARS_ea_t> NewWorkListItem(NewSearchItem, CurrInst->GetAddr()); WorkList.push_back(NewWorkListItem); } } @@ -5917,7 +5896,7 @@ bool SMPBasicBlock::IsDefUsedInMemWrite(list<pair<pair<STARSOpndTypePtr, int>, e while (SuccIter != this->GetLastSucc()) { SMPBasicBlock *SuccBlock = (*SuccIter); if (SuccBlock->IsLiveIn(DefOp)) { - ea_t NewDefAddr = STARS_LIVEIN_PSEUDO_ID; + STARS_ea_t NewDefAddr = STARS_LIVEIN_PSEUDO_ID; FoundMemWriteUse = SuccBlock->IsDefUsedInMemWrite(WorkList, DefOp, DefSSANum, NewDefAddr); if (FoundMemWriteUse) break; diff --git a/src/base/SMPDBInterface.cpp b/src/base/SMPDBInterface.cpp index 9e43fe4b..abdd3aee 100644 --- a/src/base/SMPDBInterface.cpp +++ b/src/base/SMPDBInterface.cpp @@ -54,14 +54,82 @@ #include <intel.hpp> #include <name.hpp> -#include "SMPDBInterface.h" -#include "SMPStaticAnalyzer.h" -#include "SMPDataFlowAnalysis.h" +#include "interfaces/SMPDBInterface.h" +#include "base/SMPDataFlowAnalysis.h" + +// Indentation level when emitting SPARK Ada translation of the RTLs. +unsigned short STARS_SPARK_IndentCount; + +// Debugging counters for analyzing memory usage. +unsigned long UnusedStructCount; +unsigned long UnusedIntCount; + +// Counters for dead metadata analysis. +unsigned long DeadMetadataCount; +unsigned long LiveMetadataCount; + +// Counters for indirect jump resolution. +unsigned long ResolvedIndirectJumpCount; +unsigned long UnresolvedIndirectJumpCount; + +// Counters for measuring SCCP success in finding constant DEFs. +unsigned long ConstantDEFCount; +unsigned long AlwaysTakenBranchCount; +unsigned long NeverTakenBranchCount; + +// Counters for accessing less than machine register width. +unsigned long SubwordRegCount; +unsigned long SubwordMemCount; +unsigned long SubwordAddressRegCount; +unsigned long SPARKOperandCount; // total operands printed + +#if SMP_COUNT_MEMORY_ALLOCATIONS +// Counters for analyzing memory use for allocated and used objects. +unsigned long SMPInstCount; +unsigned long SMPBlockCount; +unsigned long SMPFuncCount; +unsigned long SMPGlobalVarCount; +unsigned long SMPLocalVarCount; +unsigned long SMPDefUseChainCount; +unsigned long SMPInstBytes; +unsigned long SMPDefUseChainBytes; +#endif + +#if SMP_MEASURE_NUMERIC_ANNOTATIONS +unsigned long NumericAnnotationsCount12; // cases 1 and 2 +unsigned long NumericAnnotationsCount3; // case 3 +unsigned long TruncationAnnotationsCount; // case 4 +unsigned long SignednessWithoutTruncationCount; // case 5 +unsigned long LeaInstOverflowCount; // case 6 +unsigned long WidthDoublingTruncationCount; // case 7 +unsigned long BenignOverflowInstCount; +unsigned long BenignOverflowDefCount; +unsigned long SuppressStackPtrOverflowCount; +unsigned long SuppressLiveFlagsOverflowCount; +unsigned long LiveMultiplyBitsCount; +unsigned long BenignTruncationCount; +unsigned long SuppressTruncationRegPiecesAllUsed; +unsigned long SuppressSignednessOnTruncation; +#endif + +#if STARS_SCCP_GATHER_STATISTICS +// Counters for analyzing Sparse Conditional Constant Propagation effectiveness. +unsigned long SCCPFuncsWithArgWriteCount; +unsigned long SCCPFuncsWithConstantArgWriteCount; +unsigned long SCCPOutgoingArgWriteCount; +unsigned long SCCPConstantOutgoingArgWriteCount; +#endif + +// Counter for max # of basic blocks seen in one function. +unsigned long STARS_MaxBlockCount; + +// strings for printing ZST_SysCallType +const char *CallTypeNames[4] = { "Unrestricted", "High-Privilege", "File-Access", "Network-Access" }; #ifdef STARS_IDA_INTERFACE // Get instruction info by address from IDA Pro. -bool SMPGetCmd(STARS_ea_t InstAddr, insn_t &SMPcmd, uint32 &SMPfeatures) { +bool SMPGetCmd(STARS_ea_t InstAddr, insn_t &SMPcmd, uint32_t &SMPfeatures) { bool success = true; // Fill cmd structure with disassembly of instr @@ -86,7 +154,7 @@ bool SMPGetCmd(STARS_ea_t InstAddr, insn_t &SMPcmd, uint32 &SMPfeatures) { for (int i = 0; i < UA_MAXOP; ++i) { SMPcmd.Operands[i].specflag4 = 0; #ifdef __EA64__ - if (STARS_ISA_Bitwidth == 64) { + if (global_STARS_program->GetSTARS_ISA_Bitwidth() == 64) { // Copy the cmd.rex prefix into the op_t.specflag4 field for each operand // that has a SIB byte. SMPcmd.Operands[i].specflag4 = SMPcmd.rex; @@ -99,14 +167,14 @@ bool SMPGetCmd(STARS_ea_t InstAddr, insn_t &SMPcmd, uint32 &SMPfeatures) { } switch (SMPcmd.itype) { - case NN_vgatherdps: - case NN_vgatherdpd: - case NN_vgatherqps: - case NN_vgatherqpd: - case NN_vpgatherdd: - case NN_vpgatherdq: - case NN_vpgatherqd: - case NN_vpgatherqq: + case STARS_NN_vgatherdps: + case STARS_NN_vgatherdpd: + case STARS_NN_vgatherqps: + case STARS_NN_vgatherqpd: + case STARS_NN_vpgatherdd: + case STARS_NN_vpgatherdq: + case STARS_NN_vpgatherqd: + case STARS_NN_vpgatherqq: SMPcmd.Operands[i].specflag4 |= STARS_VSIB; default: ; diff --git a/src/base/SMPDataFlowAnalysis.cpp b/src/base/SMPDataFlowAnalysis.cpp index 0691465f..43760e94 100644 --- a/src/base/SMPDataFlowAnalysis.cpp +++ b/src/base/SMPDataFlowAnalysis.cpp @@ -19,7 +19,7 @@ * e-mail: jwd@virginia.com * URL : http://www.cs.virginia.edu/ * - * Additional copyrights 2010, 2011 by Zephyr Software LLC + * Additional copyrights 2010, 2011, 2012, 2013, 2014, 2015 by Zephyr Software LLC * e-mail: {clc,jwd}@zephyr-software.com * URL : http://www.zephyr-software.com/ * @@ -39,22 +39,23 @@ #include <string> #include <cstring> +#include <cassert> +#if 0 #include <pro.h> -#include <assert.h> +#include <intel.hpp> #include <ida.hpp> #include <idp.hpp> #include <auto.hpp> #include <bytes.hpp> #include <funcs.hpp> -#include <intel.hpp> #include <loader.hpp> #include <lines.hpp> #include <name.hpp> +#endif #include "interfaces/SMPDBInterface.h" #include "base/SMPDataFlowAnalysis.h" -#include "base/SMPStaticAnalyzer.h" #include "base/SMPInstr.h" #include "base/SMPBasicBlock.h" #include "base/SMPFunction.h" @@ -69,11 +70,14 @@ using namespace std; #define STARS_DEBUG_DUMP_IDENTIFY_HIDDEN_OPERANDS 0 // print HIDDEN if operand.showed() is false #if IDA_SDK_VERSION > 560 -#define MAX_IDA_REG R_last +#define MAX_IDA_REG STARS_x86_R_last #else #define MAX_IDA_REG 80 #endif +// Bit masks for extracting bits from a STARSBitSet unsigned char. +const unsigned char STARSBitMasks[8] = { 1, 2, 4, 8, 16, 32, 64, 128 }; + const char *RegNames[MAX_IDA_REG + 1] = { "EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI", "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15", @@ -111,7 +115,7 @@ const unsigned char RegSizes[MAX_IDA_REG + 1] = }; unsigned char GetRegSize(uint16_t RegNum) { - assert(RegNum != ((uint16_t) R_none)); + assert(RegNum != ((uint16_t) STARS_x86_R_none)); return RegSizes[RegNum]; } @@ -144,13 +148,13 @@ const char *LeaSignednessStrings[4] = { "NOFLAGUNKNOWNSIGN", "NOFLAGSIGNED", "NO // Distinguishes subword regs from their parent regs const char *MDGetRegNumName(uint16_t RegNum, uint16_t ByteWidth) { - if ((R_none == RegNum) || (MAX_IDA_REG < RegNum)) + if ((STARS_x86_R_none == RegNum) || (MAX_IDA_REG < RegNum)) return ErrorStrings[0]; - else if ((ByteWidth == 2) && (RegNum >= R_ax) && (RegNum <= R_di)) { + else if ((ByteWidth == 2) && (RegNum >= STARS_x86_R_ax) && (RegNum <= STARS_x86_R_di)) { // 16-bit registers return WordRegStrings[RegNum]; } - else if ((ByteWidth == 8) && (RegNum >= R_ax) && (RegNum <= R_di)) { + else if ((ByteWidth == 8) && (RegNum >= STARS_x86_R_ax) && (RegNum <= STARS_x86_R_di)) { // 64-bit registers return QWordRegStrings[RegNum]; } @@ -170,13 +174,13 @@ const char *MDGetRegName(STARSOpndTypePtr RegOp) { } // Define instruction categories for data flow analysis. -SMPitype DFACategory[NN_last+1]; +SMPitype DFACategory[STARS_NN_last+1]; // Define instruction categories for data type analysis. -int SMPTypeCategory[NN_last+1]; +int SMPTypeCategory[STARS_NN_last+1]; // Define which instructions define and use the CPU flags. -bool SMPDefsFlags[NN_last + 1]; -bool SMPUsesFlags[NN_last + 1]; +bool SMPDefsFlags[STARS_NN_last + 1]; +bool SMPUsesFlags[STARS_NN_last + 1]; // Hash a global name and SSA number into an int, for use in SMPFunction.GlobalDefAddrBySSA map int HashGlobalNameAndSSA(STARSOpndTypePtr DefOp, int SSANum) { @@ -250,7 +254,7 @@ size_t GetOpDataSize(STARSOpndTypePtr DataOp) { SMP_msg("ERROR: unexpected data type %d in GetOpDataSize() :", OpDtyp); PrintOperand(DataOp); SMP_msg("\n"); - DataSize = STARS_ISA_dtyp; + DataSize = global_STARS_program->GetSTARS_ISA_dtyp(); break; } return DataSize; @@ -258,10 +262,10 @@ size_t GetOpDataSize(STARSOpndTypePtr DataOp) { // Get the IDA Pro register size (dtyp) field char GetRegDtyp(uint16 RegNum, bool Has64BitOpnds) { - assert(RegNum != ((uint16_t) R_none)); + assert(RegNum != ((uint16_t) STARS_x86_R_none)); assert(RegNum < MAX_IDA_REG); char RegDtyp = RegDtyps[RegNum]; - if ((STARS_ISA_Bytewidth == 8) && Has64BitOpnds && (RegDtyp == dt_dword) && (RegNum <= R_ip)) { + if ((global_STARS_program->GetSTARS_ISA_Bytewidth() == 8) && Has64BitOpnds && (RegDtyp == dt_dword) && (RegNum <= STARS_x86_R_ip)) { // 32-bit IDA general regs are 64-bit for x86-64 RegDtyp = dt_qword; } @@ -337,87 +341,11 @@ bool MDIsGeneralPurposeReg(STARSOpndTypePtr CurrOp) { if (success) { // intel.hpp defines two ranges that are general purpose regs in enum RegNo. uint16_t CurrReg = CurrOp->GetReg(); - success = (CurrOp->IsRegOp() && ((CurrReg >= R_ax) && (CurrReg <= R_dil))); + success = (CurrOp->IsRegOp() && ((CurrReg >= STARS_x86_R_ax) && (CurrReg <= STARS_x86_R_dil))); } return success; } -// We maintain a list of the caller-saved regs for the current binary's ABI. -// This differs from 32-bit to 64-bit x86 binaries, as well as across other ISAs. -list<uint16> STARS_MDCallerSavedRegs; - -void MDInitializeCallerSavedRegs(void) { - STARS_MDCallerSavedRegs.clear(); - bool x86_64_ISA_flag = false; -#ifdef __EA64__ - x86_64_ISA_flag = (STARS_ISA_Bitwidth == 64); -#endif - if (!x86_64_ISA_flag) { - // 32-bit x86 uses EAX, ECX, EDX as caller-saved. - STARS_MDCallerSavedRegs.push_back(R_ax); - STARS_MDCallerSavedRegs.push_back(R_cx); - STARS_MDCallerSavedRegs.push_back(R_dx); - } - else { - // 64-bit x86 uses EDI, ESI, EDX, ECX, R8 and R9 - // in that order. After six arguments that fit into - // these regs, arguments are passed on the stack. - // In addition, registers EAX, R10 and R11 are caller-saved - // but are not used to pass arguments. - STARS_MDCallerSavedRegs.push_back(R_ax); - STARS_MDCallerSavedRegs.push_back(R_cx); - STARS_MDCallerSavedRegs.push_back(R_dx); - STARS_MDCallerSavedRegs.push_back(R_si); - STARS_MDCallerSavedRegs.push_back(R_di); - STARS_MDCallerSavedRegs.push_back(R_r8); - STARS_MDCallerSavedRegs.push_back(R_r9); - STARS_MDCallerSavedRegs.push_back(R_r10); - STARS_MDCallerSavedRegs.push_back(R_r11); - } - return; -} - -list<uint16>::iterator GetFirstCallerSavedReg(void) { - return STARS_MDCallerSavedRegs.begin(); -} - -list<uint16>::iterator GetLastCallerSavedReg(void) { - return STARS_MDCallerSavedRegs.end(); -} - -// We maintain a list of the argument-passing regs for the current binary's ABI. -// This differs from 32-bit to 64-bit x86 binaries, as well as across other ISAs. -// The list is in order of argument position number. For x86-64, this means EDI, -// ESI, EDX, ECX, R8, R9. -list<uint16> STARS_MDArgumentRegs; - -void MDInitializeArgumentRegs(void) { - bool x86_64_ISA_flag = false; -#ifdef __EA64__ - x86_64_ISA_flag = (STARS_ISA_Bitwidth == 64); -#endif - if (x86_64_ISA_flag) { - STARS_MDArgumentRegs.push_back(R_di); - STARS_MDArgumentRegs.push_back(R_si); - STARS_MDArgumentRegs.push_back(R_dx); - STARS_MDArgumentRegs.push_back(R_cx); - STARS_MDArgumentRegs.push_back(R_r8); - STARS_MDArgumentRegs.push_back(R_r9); - } - else { - STARS_MDArgumentRegs.clear(); - } - return; -} - -list<uint16>::iterator GetFirstArgumentReg(void) { - return STARS_MDArgumentRegs.begin(); -} - -list<uint16>::iterator GetLastArgumentReg(void) { - return STARS_MDArgumentRegs.end(); -} - // Are operands equal? bool IsEqOp(STARSOpndTypePtr Opnd1, STARSOpndTypePtr Opnd2) { if ((nullptr == Opnd1) || (nullptr == Opnd2)) @@ -425,68 +353,46 @@ bool IsEqOp(STARSOpndTypePtr Opnd1, STARSOpndTypePtr Opnd2) { if (Opnd1->GetOpType() != Opnd2->GetOpType()) return false; - switch (Opnd1->GetOpType()) { - case o_void: return true; - case o_reg: return ((Opnd1->GetReg() == Opnd2->GetReg()) && (Opnd1->GetByteWidth() == Opnd2->GetByteWidth())); - case o_mem: return (Opnd1->GetAddr() == Opnd2->GetAddr()); - case o_phrase: if (Opnd1->HasSIBByte() && Opnd2->HasSIBByte()) return ((Opnd1->GetSIB() == Opnd2->GetSIB()) && (Opnd1->GetSpecFlag4() == Opnd2->GetSpecFlag4())); - else if (Opnd1->HasSIBByte() || Opnd2->HasSIBByte()) return false; // no SIB != has SIB - else return (Opnd1->GetReg() == Opnd2->GetReg()); // neither has SIB; compare register, e.g. [ebx] to [edx] - case o_displ: if (Opnd1->HasSIBByte() && Opnd2->HasSIBByte()) + + if (Opnd1->IsVoidOp()) + return true; + if (Opnd1->IsRegOp()) + return ((Opnd1->GetReg() == Opnd2->GetReg()) && (Opnd1->GetByteWidth() == Opnd2->GetByteWidth())); + if (Opnd1->IsStaticMemOp()) + return (Opnd1->GetAddr() == Opnd2->GetAddr()); + if (Opnd1->IsMemNoDisplacementOp()) { + if (Opnd1->HasSIBByte() && Opnd2->HasSIBByte()) return ((Opnd1->GetSIB() == Opnd2->GetSIB()) && (Opnd1->GetSpecFlag4() == Opnd2->GetSpecFlag4())); + else if (Opnd1->HasSIBByte() || Opnd2->HasSIBByte()) return false; // no SIB != has SIB + else return (Opnd1->GetReg() == Opnd2->GetReg()); // neither has SIB; compare register, e.g. [ebx] to [edx] + } + if (Opnd1->IsMemDisplacementOp()) { + if (Opnd1->HasSIBByte() && Opnd2->HasSIBByte()) return ((Opnd1->GetSIB() == Opnd2->GetSIB()) && (Opnd1->GetAddr() == Opnd2->GetAddr()) && (Opnd1->GetSpecFlag4() == Opnd2->GetSpecFlag4())); - else if ((!Opnd1->HasSIBByte()) && (!Opnd2->HasSIBByte())) - return ((Opnd1->GetAddr() == Opnd2->GetAddr()) && (Opnd1->GetReg() == Opnd2->GetReg())); - else return false; // no SIB != has SIB - case o_imm: return (Opnd1->GetImmedValue() == Opnd2->GetImmedValue()); - case o_far: // fall through to o_near case - case o_near: return (Opnd1->GetAddr() == Opnd2->GetAddr()); - case o_trreg: // fall through - case o_dbreg: // fall through - case o_crreg: // fall through - case o_fpreg: // fall through - case o_mmxreg: // fall through - case o_xmmreg: // fall through - case o_ymmreg: return (Opnd1->GetReg() == Opnd2->GetReg()); // no subword regs to deal with - - default: SMP_msg("ERROR: Unknown operand type in IsEqOp.\n"); return false; - }; // end switch (Opnd1.type)} + else if ((!Opnd1->HasSIBByte()) && (!Opnd2->HasSIBByte())) + return ((Opnd1->GetAddr() == Opnd2->GetAddr()) && (Opnd1->GetReg() == Opnd2->GetReg())); + else return false; // no SIB != has SIB + } + if (Opnd1->IsImmedOp()) + return (Opnd1->GetImmedValue() == Opnd2->GetImmedValue()); + if (Opnd1->IsFarPointer() || Opnd1->IsNearPointer()) + return (Opnd1->GetAddr() == Opnd2->GetAddr()); + if (Opnd1->MDIsKnownOpType()) // compare regs for all special-register cases, e.g. MMX, XMM, YMM, debug regs, etc. + return (Opnd1->GetReg() == Opnd2->GetReg()); // no subword regs to deal with + + SMP_msg("ERROR: Unknown operand type in IsEqOp.\n"); + return false; } // end of function IsEqOp() // Are operands equal, ignoring bitwidth differences for register operands? bool IsEqOpIgnoreBitwidth(STARSOpndTypePtr Opnd1, STARSOpndTypePtr Opnd2) { if (Opnd1->GetOpType() != Opnd2->GetOpType()) return false; -#if 1 + if (Opnd1->IsRegOp()) return (Opnd1->GetReg() == Opnd2->GetReg()); // no concern for subword regs; AX == EAX == RAX else return IsEqOp(Opnd1, Opnd2); -#else - switch (Opnd1->GetOpType()) { - case o_void: return true; - case o_reg: return (Opnd1->GetReg() == Opnd2->GetReg()); - case o_mem: return (Opnd1.addr == Opnd2.addr); - case o_phrase: if (Opnd1.hasSIB && Opnd2.hasSIB) return ((Opnd1.sib == Opnd2.sib) && (Opnd1.specflag4 == Opnd2.specflag4)); - else if (Opnd1.hasSIB || Opnd2.hasSIB) return false; // no SIB != has SIB - else return (Opnd1.reg == Opnd2.reg); // neither has SIB; compare register, e.g. [ebx] to [edx] - case o_displ: if (Opnd1.hasSIB && Opnd2.hasSIB) - return ((Opnd1.sib == Opnd2.sib) && (Opnd1.addr == Opnd2.addr) && (Opnd1.specflag4 == Opnd2.specflag4)); - else if ((!Opnd1.hasSIB) && (!Opnd2.hasSIB)) - return ((Opnd1.addr == Opnd2.addr) && (Opnd1.reg == Opnd2.reg)); - else return false; // no SIB != has SIB - case o_imm: return (Opnd1.value == Opnd2.value); - case o_far: // fall through to o_near case - case o_near: return (Opnd1.addr == Opnd2.addr); - case o_trreg: // fall through - case o_dbreg: // fall through - case o_crreg: // fall through - case o_fpreg: // fall through - case o_mmxreg: // fall through - case o_xmmreg: return (Opnd1.reg == Opnd2.reg); // no subword regs to deal with - - default: SMP_msg("ERROR: Unknown operand type in IsEqOpIgnoreBitwidth.\n"); return false; - }; // end switch (Opnd1.type)} -#endif + } // end of function IsEqOpIgnoreBitwidth() // We need to make subword registers equal to their containing registers when we @@ -517,10 +423,10 @@ uint16_t MDCanonicalizeSubReg(const uint16_t Reg1) { if (Subword) { // See enumeration RegNo in intel.hpp. - if (SReg1 < R_ah) // AL, CL, DL or BL - SReg1 -= (R_al - R_ax); + if (SReg1 < STARS_x86_R_ah) // AL, CL, DL or BL + SReg1 -= (STARS_x86_R_al - STARS_x86_R_ax); else // AH, CH, DH, BH, SPL, BPL, SIL, DIL - SReg1 -= (R_ah - R_ax); + SReg1 -= (STARS_x86_R_ah - STARS_x86_R_ax); } return SReg1; } // end of MDCanonicalizeSubReg() @@ -588,9 +494,9 @@ int MD_STARS_sib_base(const STARSOpndTypePtr &x) // get exten return base; } -regnum_t MD_STARS_sib_index(const STARSOpndTypePtr &x) // get extended sib index +short MD_STARS_sib_index(const STARSOpndTypePtr &x) // get extended sib index { - regnum_t index = regnum_t((x->GetSIB() >> 3) & 7); + short index = short((x->GetSIB() >> 3) & 7); #ifdef __EA64__ if ( x->GetSpecFlag4() & REX_X ) index |= 8; @@ -609,7 +515,7 @@ bool MDIsIndirectMemoryOpnd(STARSOpndTypePtr CurrOp, bool UseFP) { if (CurrOp->HasSIBByte()) { int BaseReg = MD_STARS_sib_base(CurrOp); short IndexReg = MD_STARS_sib_index(CurrOp); - if ((R_none != IndexReg) && (MD_STACK_POINTER_REG != IndexReg)) { + if ((STARS_x86_R_none != IndexReg) && (MD_STACK_POINTER_REG != IndexReg)) { if ((MD_FRAME_POINTER_REG == IndexReg) && UseFP) ; else @@ -617,7 +523,7 @@ bool MDIsIndirectMemoryOpnd(STARSOpndTypePtr CurrOp, bool UseFP) { } if (0 != CurrOp->GetSIBScaleFactor()) indirect = true; - if (R_none != BaseReg) { + if (STARS_x86_R_none != BaseReg) { if ((BaseReg == MD_FRAME_POINTER_REG) && CurrOp->IsStaticMemOp()) { ; // EBP ==> no base register for o_mem type } @@ -651,33 +557,33 @@ bool MDIsIndirectMemoryOpnd(STARSOpndTypePtr CurrOp, bool UseFP) { // Extract the base and index registers and scale factor and displacement from the // memory operand. -void MDExtractAddressFields(STARSOpndTypePtr MemOp, int &BaseReg, int &IndexReg, uint16_t &Scale, ea_t &Offset) { +void MDExtractAddressFields(STARSOpndTypePtr MemOp, int &BaseReg, int &IndexReg, uint16_t &Scale, STARS_ea_t &Offset) { assert(MemOp->IsMemOp()); Scale = 0; - BaseReg = R_none; - IndexReg = R_none; + BaseReg = STARS_x86_R_none; + IndexReg = STARS_x86_R_none; Offset = MemOp->GetAddr(); if (MemOp->HasSIBByte()) { BaseReg = MD_STARS_sib_base(MemOp); IndexReg = (int) MD_STARS_sib_index(MemOp); if (MD_STACK_POINTER_REG == IndexReg) // signifies no index register - IndexReg = R_none; - if (R_none != IndexReg) { + IndexReg = STARS_x86_R_none; + if (STARS_x86_R_none != IndexReg) { Scale = (uint16_t) MemOp->GetSIBScaleFactor(); } - if (R_none != BaseReg) { + if (STARS_x86_R_none != BaseReg) { if ((BaseReg == MD_FRAME_POINTER_REG) && MemOp->IsStaticMemOp()) { - BaseReg = R_none; + BaseReg = STARS_x86_R_none; // **!!** BaseReg allowed for o_mem with SIB byte??? } } } else { // no SIB byte; can have base reg but no index reg or scale factor - BaseReg = (int) MemOp->GetReg(); // cannot be R_none for no SIB case + BaseReg = (int) MemOp->GetReg(); // cannot be STARS_x86_R_none for no SIB case if (MemOp->IsStaticMemOp()) { - BaseReg = R_none; // no Base register for o_mem operands + BaseReg = STARS_x86_R_none; // no Base register for o_mem operands } } @@ -704,7 +610,7 @@ bool MDIsStackAccessOpnd(STARSOpndTypePtr CurrOp, bool UseFP) { int BaseReg; int IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; if ((nullptr == CurrOp) || ((!CurrOp->IsMemDisplacementOp()) && (!CurrOp->IsMemNoDisplacementOp()))) { return false; @@ -719,7 +625,7 @@ bool MDIsDirectStackAccessOpnd(STARSOpndTypePtr CurrOp, bool UseFP) { int BaseReg; int IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; if ((nullptr == CurrOp) || ((! CurrOp->IsMemDisplacementOp()) && (! CurrOp->IsMemNoDisplacementOp()))) { return false; @@ -727,7 +633,7 @@ bool MDIsDirectStackAccessOpnd(STARSOpndTypePtr CurrOp, bool UseFP) { MDExtractAddressFields(CurrOp, BaseReg, IndexReg, ScaleFactor, offset); // When the IndexReg is - return (MDIsStackPtrReg(BaseReg, UseFP) && (IndexReg == R_none)); + return (MDIsStackPtrReg(BaseReg, UseFP) && (IndexReg == STARS_x86_R_none)); } // end of MDIsDirectStackAccessOpnd() // MACHINE DEPENDENT: Is operand trackable in data flow analyses (i.e. a direct stack memory access or a register?) @@ -740,14 +646,14 @@ bool MDIsCallerSavedReg(STARSOpndTypePtr CurrOp) { if (! CurrOp->IsRegOp()) return false; uint16_t CurrReg = MDCanonicalizeSubReg(CurrOp->GetReg()); - return ((R_ax == CurrReg) || (R_cx == CurrReg) || (R_dx == CurrReg)); + return ((STARS_x86_R_ax == CurrReg) || (STARS_x86_R_cx == CurrReg) || (STARS_x86_R_dx == CurrReg)); } // end of MDIsCallerSavedReg() // If CurrOp would change when reg is canonicalized, then return CurrOp->clone(), else return CurrOp; STARSOpndTypePtr CloneIfSubwordReg(STARSOpndTypePtr CurrOp) { uint16_t CurrReg = CurrOp->GetReg(); if (CurrOp->IsRegOp()) { - if (STARS_ISA_Bytewidth > CurrOp->GetByteWidth()) { + if (global_STARS_program->GetSTARS_ISA_Bytewidth() > CurrOp->GetByteWidth()) { return CurrOp->clone(); } else { @@ -823,17 +729,17 @@ void PrintSIB(STARSOpndTypePtr Opnd) { int BaseReg; int IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; #define NAME_LEN 5 char BaseName[NAME_LEN] = {'N', 'o', 'n', 'e', '\0'}; char IndexName[NAME_LEN] = {'N', 'o', 'n', 'e', '\0'}; MDExtractAddressFields(Opnd, BaseReg, IndexReg, ScaleFactor, offset); - if (BaseReg != R_none) + if (BaseReg != STARS_x86_R_none) SMP_strncpy(BaseName, RegNames[BaseReg], NAME_LEN - 1); - if (IndexReg != R_none) { + if (IndexReg != STARS_x86_R_none) { SMP_strncpy(IndexName, RegNames[IndexReg], NAME_LEN -1); } SMP_msg(" Base %s Index %s Scale %d Flag4 %d", BaseName, IndexName, ScaleFactor, Opnd->GetSpecFlag4()); @@ -844,7 +750,7 @@ void AnnotPrintSIB(STARSOpndTypePtr Opnd, bool HasOffset, FILE *OutFile) { int BaseReg; int IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; char OutString[MAXSTR] = {'[', '\0'}; char ScaleString[4]; @@ -855,9 +761,9 @@ void AnnotPrintSIB(STARSOpndTypePtr Opnd, bool HasOffset, FILE *OutFile) { (void) SMP_snprintf(ScaleString, 4, "%d", ScaleFactor); } - if (BaseReg != R_none) { + if (BaseReg != STARS_x86_R_none) { (void) SMP_strncat(OutString, MDGetRegNumName(BaseReg, RegSizes[BaseReg]), MAXSTR - 1); - if (IndexReg != R_none) { + if (IndexReg != STARS_x86_R_none) { (void) SMP_strncat(OutString, "+", MAXSTR-1); (void) SMP_strncat(OutString, MDGetRegNumName(IndexReg, RegSizes[IndexReg]), MAXSTR - 1); if (ScaleFactor > 0) { @@ -866,7 +772,7 @@ void AnnotPrintSIB(STARSOpndTypePtr Opnd, bool HasOffset, FILE *OutFile) { } } } - else if (IndexReg != R_none) { + else if (IndexReg != STARS_x86_R_none) { (void) SMP_strncat(OutString, MDGetRegNumName(IndexReg, RegSizes[IndexReg]), MAXSTR - 1); if (ScaleFactor > 0) { (void) SMP_strncat(OutString, "*", MAXSTR-1); @@ -886,7 +792,7 @@ void SPARKAnnotPrintSIB(STARSOpndTypePtr Opnd, bool HasOffset, FILE *OutFile, ui int BaseReg; int IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; char OutString[MAXSTR] = {'(', '\0'}; char ScaleString[4]; @@ -896,7 +802,7 @@ void SPARKAnnotPrintSIB(STARSOpndTypePtr Opnd, bool HasOffset, FILE *OutFile, ui if (SegRegPrefix) { // Emit segment register string unless it is just the stack segment plus a stack operand, // where the stack segment is implied anyway. - if ((SegReg == R_ss) && MDIsStackAccessOpnd(Opnd, UseFP)) { + if ((SegReg == STARS_x86_R_ss) && MDIsStackAccessOpnd(Opnd, UseFP)) { SegRegPrefix = false; } else { @@ -910,20 +816,20 @@ void SPARKAnnotPrintSIB(STARSOpndTypePtr Opnd, bool HasOffset, FILE *OutFile, ui (void) SMP_snprintf(ScaleString, 4, "%d", ScaleFactor); } - if (BaseReg != R_none) { + if (BaseReg != STARS_x86_R_none) { if (SegRegPrefix) { (void) SMP_strncat(OutString, " + ", MAXSTR-1); } (void) SMP_strncat(OutString, "X86.", MAXSTR-1); (void) SMP_strncat(OutString, MDGetRegNumName(BaseReg, RegSizes[BaseReg]), MAXSTR-1); - if (STARS_ISA_Bytewidth > RegSizes[BaseReg]) { + if (global_STARS_program->GetSTARS_ISA_Bytewidth() > RegSizes[BaseReg]) { ++SubwordAddressRegCount; } - if (IndexReg != R_none) { + if (IndexReg != STARS_x86_R_none) { (void) SMP_strncat(OutString, " + ", MAXSTR-1); (void) SMP_strncat(OutString, "X86.", MAXSTR-1); (void) SMP_strncat(OutString, MDGetRegNumName(IndexReg, RegSizes[IndexReg]), MAXSTR-1); - if (STARS_ISA_Bytewidth > RegSizes[IndexReg]) { + if (global_STARS_program->GetSTARS_ISA_Bytewidth() > RegSizes[IndexReg]) { ++SubwordAddressRegCount; } if (ScaleFactor > 0) { @@ -932,13 +838,13 @@ void SPARKAnnotPrintSIB(STARSOpndTypePtr Opnd, bool HasOffset, FILE *OutFile, ui } } } - else if (IndexReg != R_none) { + else if (IndexReg != STARS_x86_R_none) { if (SegRegPrefix) { (void) SMP_strncat(OutString, " + ", MAXSTR-1); } (void) SMP_strncat(OutString, "X86.", MAXSTR-1); (void) SMP_strncat(OutString, MDGetRegNumName(IndexReg, RegSizes[IndexReg]), MAXSTR - 1); - if (STARS_ISA_Bytewidth > RegSizes[IndexReg]) { + if (global_STARS_program->GetSTARS_ISA_Bytewidth() > RegSizes[IndexReg]) { ++SubwordAddressRegCount; } if (ScaleFactor > 0) { @@ -988,7 +894,7 @@ void PrintOperand(STARSOpndTypePtr Opnd) { } else if (Opnd->IsMemDisplacementOp()) { SMP_msg(" Operand: memory displ :"); - ea_t offset = Opnd->GetAddr(); + STARS_ea_t offset = Opnd->GetAddr(); int SignedOffset = (int) offset; if (Opnd->HasSIBByte()) { PrintSIB(Opnd); @@ -1036,7 +942,7 @@ void PrintOperand(STARSOpndTypePtr Opnd) { SMP_msg(" Operand: unknown"); } #if STARS_DEBUG_DUMP_IDENTIFY_HIDDEN_OPERANDS - if (!(Opnd.showed())) + if (!(Opnd->IsVisible())) SMP_msg(" HIDDEN "); #endif return; @@ -1074,7 +980,7 @@ void AnnotPrintOperand(STARSOpndTypePtr Opnd, FILE *OutFile) { } } else if (Opnd->IsMemDisplacementOp()) { - ea_t offset = Opnd->GetAddr(); + STARS_ea_t offset = Opnd->GetAddr(); int SignedOffset = (int) offset; if (Opnd->HasSIBByte()) { AnnotPrintSIB(Opnd, (SignedOffset != 0), OutFile); @@ -1110,343 +1016,343 @@ void AnnotPrintOperand(STARSOpndTypePtr Opnd, FILE *OutFile) { // Print opcode string. void PrintOpcode(uint16 opcode, FILE *OutFile) { switch (opcode) { - case NN_null: // Unknown Operation - case NN_aaa: // ASCII Adjust after Addition - case NN_aad: // ASCII Adjust AX before Division - case NN_aam: // ASCII Adjust AX after Multiply - case NN_aas: // ASCII Adjust AL after Subtraction - case NN_adc: // Add with Carry + case STARS_NN_null: // Unknown Operation + case STARS_NN_aaa: // ASCII Adjust after Addition + case STARS_NN_aad: // ASCII Adjust AX before Division + case STARS_NN_aam: // ASCII Adjust AX after Multiply + case STARS_NN_aas: // ASCII Adjust AL after Subtraction + case STARS_NN_adc: // Add with Carry SMP_fprintf(OutFile, "ERROR"); break; - case NN_add: // Add + case STARS_NN_add: // Add SMP_fprintf(OutFile, "add"); break; - case NN_and: // Logical AND + case STARS_NN_and: // Logical AND SMP_fprintf(OutFile, "and"); break; - case NN_arpl: // Adjust RPL Field of Selector - case NN_bound: // Check Array Index Against Bounds - case NN_bsf: // Bit Scan Forward - case NN_bsr: // Bit Scan Reverse - case NN_bt: // Bit Test - case NN_btc: // Bit Test and Complement - case NN_btr: // Bit Test and Reset - case NN_bts: // Bit Test and Set + case STARS_NN_arpl: // Adjust RPL Field of Selector + case STARS_NN_bound: // Check Array Index Against Bounds + case STARS_NN_bsf: // Bit Scan Forward + case STARS_NN_bsr: // Bit Scan Reverse + case STARS_NN_bt: // Bit Test + case STARS_NN_btc: // Bit Test and Complement + case STARS_NN_btr: // Bit Test and Reset + case STARS_NN_bts: // Bit Test and Set SMP_fprintf(OutFile, "ERROR"); break; - case NN_call: // Call Procedure - case NN_callfi: // Indirect Call Far Procedure - case NN_callni: // Indirect Call Near Procedure + case STARS_NN_call: // Call Procedure + case STARS_NN_callfi: // Indirect Call Far Procedure + case STARS_NN_callni: // Indirect Call Near Procedure SMP_fprintf(OutFile, ""); break; - case NN_cbw: // AL -> AX (with sign) - case NN_cwde: // AX -> EAX (with sign) - case NN_cdqe: // EAX -> RAX (with sign) - case NN_clc: // Clear Carry Flag - case NN_cld: // Clear Direction Flag - case NN_cli: // Clear Interrupt Flag - case NN_clts: // Clear Task-Switched Flag in CR0 - case NN_cmc: // Complement Carry Flag - case NN_cmp: // Compare Two Operands - case NN_cmps: // Compare Strings - case NN_cwd: // AX -> DX:AX (with sign) - case NN_cdq: // EAX -> EDX:EAX (with sign) - case NN_cqo: // RAX -> RDX:RAX (with sign) - case NN_daa: // Decimal Adjust AL after Addition - case NN_das: // Decimal Adjust AL after Subtraction + case STARS_NN_cbw: // AL -> AX (with sign) + case STARS_NN_cwde: // AX -> EAX (with sign) + case STARS_NN_cdqe: // EAX -> RAX (with sign) + case STARS_NN_clc: // Clear Carry Flag + case STARS_NN_cld: // Clear Direction Flag + case STARS_NN_cli: // Clear Interrupt Flag + case STARS_NN_clts: // Clear Task-Switched Flag in CR0 + case STARS_NN_cmc: // Complement Carry Flag + case STARS_NN_cmp: // Compare Two Operands + case STARS_NN_cmps: // Compare Strings + case STARS_NN_cwd: // AX -> DX:AX (with sign) + case STARS_NN_cdq: // EAX -> EDX:EAX (with sign) + case STARS_NN_cqo: // RAX -> RDX:RAX (with sign) + case STARS_NN_daa: // Decimal Adjust AL after Addition + case STARS_NN_das: // Decimal Adjust AL after Subtraction SMP_fprintf(OutFile, "ERROR"); break; - case NN_dec: // Decrement by 1 + case STARS_NN_dec: // Decrement by 1 SMP_fprintf(OutFile, "sub"); break; - case NN_div: // Unsigned Divide + case STARS_NN_div: // Unsigned Divide SMP_fprintf(OutFile, "div"); break; - case NN_enterw: // Make Stack Frame for Procedure Parameters - case NN_enter: // Make Stack Frame for Procedure Parameters - case NN_enterd: // Make Stack Frame for Procedure Parameters - case NN_enterq: // Make Stack Frame for Procedure Parameters + case STARS_NN_enterw: // Make Stack Frame for Procedure Parameters + case STARS_NN_enter: // Make Stack Frame for Procedure Parameters + case STARS_NN_enterd: // Make Stack Frame for Procedure Parameters + case STARS_NN_enterq: // Make Stack Frame for Procedure Parameters SMP_fprintf(OutFile, "ERROR"); break; - case NN_hlt: // Halt + case STARS_NN_hlt: // Halt SMP_fprintf(OutFile, "ERROR"); break; - case NN_idiv: // Signed Divide + case STARS_NN_idiv: // Signed Divide SMP_fprintf(OutFile, "div"); break; - case NN_imul: // Signed Multiply + case STARS_NN_imul: // Signed Multiply SMP_fprintf(OutFile, "mul"); break; - case NN_in: // Input from Port + case STARS_NN_in: // Input from Port SMP_fprintf(OutFile, "ERROR"); break; - case NN_inc: // Increment by 1 + case STARS_NN_inc: // Increment by 1 SMP_fprintf(OutFile, "add"); break; - case NN_ins: // Input Byte(s) from Port to String - case NN_int: // Call to Interrupt Procedure - case NN_into: // Call to Interrupt Procedure if Overflow Flag = 1 - case NN_int3: // Trap to Debugger - case NN_iretw: // Interrupt Return - case NN_iret: // Interrupt Return - case NN_iretd: // Interrupt Return (use32) - case NN_iretq: // Interrupt Return (use64) + case STARS_NN_ins: // Input Byte(s) from Port to String + case STARS_NN_int: // Call to Interrupt Procedure + case STARS_NN_into: // Call to Interrupt Procedure if Overflow Flag = 1 + case STARS_NN_int3: // Trap to Debugger + case STARS_NN_iretw: // Interrupt Return + case STARS_NN_iret: // Interrupt Return + case STARS_NN_iretd: // Interrupt Return (use32) + case STARS_NN_iretq: // Interrupt Return (use64) SMP_fprintf(OutFile, "ERROR"); break; - case NN_ja: // Jump if Above (CF=0 & ZF=0) - case NN_jae: // Jump if Above or Equal (CF=0) - case NN_jb: // Jump if Below (CF=1) - case NN_jbe: // Jump if Below or Equal (CF=1 | ZF=1) - case NN_jc: // Jump if Carry (CF=1) - case NN_jcxz: // Jump if CX is 0 - case NN_jecxz: // Jump if ECX is 0 - case NN_jrcxz: // Jump if RCX is 0 - case NN_je: // Jump if Equal (ZF=1) - case NN_jg: // Jump if Greater (ZF=0 & SF=OF) - case NN_jge: // Jump if Greater or Equal (SF=OF) - case NN_jl: // Jump if Less (SF!=OF) - case NN_jle: // Jump if Less or Equal (ZF=1 | SF!=OF) - case NN_jna: // Jump if Not Above (CF=1 | ZF=1) - case NN_jnae: // Jump if Not Above or Equal (CF=1) - case NN_jnb: // Jump if Not Below (CF=0) - case NN_jnbe: // Jump if Not Below or Equal (CF=0 & ZF=0) - case NN_jnc: // Jump if Not Carry (CF=0) - case NN_jne: // Jump if Not Equal (ZF=0) - case NN_jng: // Jump if Not Greater (ZF=1 | SF!=OF) - case NN_jnge: // Jump if Not Greater or Equal (ZF=1) - case NN_jnl: // Jump if Not Less (SF=OF) - case NN_jnle: // Jump if Not Less or Equal (ZF=0 & SF=OF) - case NN_jno: // Jump if Not Overflow (OF=0) - case NN_jnp: // Jump if Not Parity (PF=0) - case NN_jns: // Jump if Not Sign (SF=0) - case NN_jnz: // Jump if Not Zero (ZF=0) - case NN_jo: // Jump if Overflow (OF=1) - case NN_jp: // Jump if Parity (PF=1) - case NN_jpe: // Jump if Parity Even (PF=1) - case NN_jpo: // Jump if Parity Odd (PF=0) - case NN_js: // Jump if Sign (SF=1) - case NN_jz: // Jump if Zero (ZF=1) - case NN_jmp: // Jump - case NN_jmpfi: // Indirect Far Jump - case NN_jmpni: // Indirect Near Jump - case NN_jmpshort: // Jump Short (not used) + case STARS_NN_ja: // Jump if Above (CF=0 & ZF=0) + case STARS_NN_jae: // Jump if Above or Equal (CF=0) + case STARS_NN_jb: // Jump if Below (CF=1) + case STARS_NN_jbe: // Jump if Below or Equal (CF=1 | ZF=1) + case STARS_NN_jc: // Jump if Carry (CF=1) + case STARS_NN_jcxz: // Jump if CX is 0 + case STARS_NN_jecxz: // Jump if ECX is 0 + case STARS_NN_jrcxz: // Jump if RCX is 0 + case STARS_NN_je: // Jump if Equal (ZF=1) + case STARS_NN_jg: // Jump if Greater (ZF=0 & SF=OF) + case STARS_NN_jge: // Jump if Greater or Equal (SF=OF) + case STARS_NN_jl: // Jump if Less (SF!=OF) + case STARS_NN_jle: // Jump if Less or Equal (ZF=1 | SF!=OF) + case STARS_NN_jna: // Jump if Not Above (CF=1 | ZF=1) + case STARS_NN_jnae: // Jump if Not Above or Equal (CF=1) + case STARS_NN_jnb: // Jump if Not Below (CF=0) + case STARS_NN_jnbe: // Jump if Not Below or Equal (CF=0 & ZF=0) + case STARS_NN_jnc: // Jump if Not Carry (CF=0) + case STARS_NN_jne: // Jump if Not Equal (ZF=0) + case STARS_NN_jng: // Jump if Not Greater (ZF=1 | SF!=OF) + case STARS_NN_jnge: // Jump if Not Greater or Equal (ZF=1) + case STARS_NN_jnl: // Jump if Not Less (SF=OF) + case STARS_NN_jnle: // Jump if Not Less or Equal (ZF=0 & SF=OF) + case STARS_NN_jno: // Jump if Not Overflow (OF=0) + case STARS_NN_jnp: // Jump if Not Parity (PF=0) + case STARS_NN_jns: // Jump if Not Sign (SF=0) + case STARS_NN_jnz: // Jump if Not Zero (ZF=0) + case STARS_NN_jo: // Jump if Overflow (OF=1) + case STARS_NN_jp: // Jump if Parity (PF=1) + case STARS_NN_jpe: // Jump if Parity Even (PF=1) + case STARS_NN_jpo: // Jump if Parity Odd (PF=0) + case STARS_NN_js: // Jump if Sign (SF=1) + case STARS_NN_jz: // Jump if Zero (ZF=1) + case STARS_NN_jmp: // Jump + case STARS_NN_jmpfi: // Indirect Far Jump + case STARS_NN_jmpni: // Indirect Near Jump + case STARS_NN_jmpshort: // Jump Short (not used) SMP_fprintf(OutFile, "ERROR"); break; - case NN_lahf: // Load Flags into AH Register - case NN_lar: // Load Access Right Byte + case STARS_NN_lahf: // Load Flags into AH Register + case STARS_NN_lar: // Load Access Right Byte SMP_fprintf(OutFile, "ERROR"); break; - case NN_lea: // Load Effective Address + case STARS_NN_lea: // Load Effective Address SMP_fprintf(OutFile, "lea"); break; - case NN_leavew: // High Level Procedure Exit - case NN_leave: // High Level Procedure Exit - case NN_leaved: // High Level Procedure Exit - case NN_leaveq: // High Level Procedure Exit + case STARS_NN_leavew: // High Level Procedure Exit + case STARS_NN_leave: // High Level Procedure Exit + case STARS_NN_leaved: // High Level Procedure Exit + case STARS_NN_leaveq: // High Level Procedure Exit SMP_fprintf(OutFile, "ERROR"); break; - case NN_lgdt: // Load Global Descriptor Table Register - case NN_lidt: // Load Interrupt Descriptor Table Register - case NN_lgs: // Load Full Pointer to GS:xx - case NN_lss: // Load Full Pointer to SS:xx - case NN_lds: // Load Full Pointer to DS:xx - case NN_les: // Load Full Pointer to ES:xx - case NN_lfs: // Load Full Pointer to FS:xx - case NN_lldt: // Load Local Descriptor Table Register - case NN_lmsw: // Load Machine Status Word - case NN_lock: // Assert LOCK# Signal Prefix + case STARS_NN_lgdt: // Load Global Descriptor Table Register + case STARS_NN_lidt: // Load Interrupt Descriptor Table Register + case STARS_NN_lgs: // Load Full Pointer to GS:xx + case STARS_NN_lss: // Load Full Pointer to SS:xx + case STARS_NN_lds: // Load Full Pointer to DS:xx + case STARS_NN_les: // Load Full Pointer to ES:xx + case STARS_NN_lfs: // Load Full Pointer to FS:xx + case STARS_NN_lldt: // Load Local Descriptor Table Register + case STARS_NN_lmsw: // Load Machine Status Word + case STARS_NN_lock: // Assert LOCK# Signal Prefix SMP_fprintf(OutFile, "ERROR"); break; - case NN_lods: // Load String + case STARS_NN_lods: // Load String SMP_fprintf(OutFile, "ERROR"); break; - case NN_loopw: // Loop while ECX != 0 - case NN_loop: // Loop while CX != 0 - case NN_loopd: // Loop while ECX != 0 - case NN_loopq: // Loop while RCX != 0 - case NN_loopwe: // Loop while CX != 0 and ZF=1 - case NN_loope: // Loop while rCX != 0 and ZF=1 - case NN_loopde: // Loop while ECX != 0 and ZF=1 - case NN_loopqe: // Loop while RCX != 0 and ZF=1 - case NN_loopwne: // Loop while CX != 0 and ZF=0 - case NN_loopne: // Loop while rCX != 0 and ZF=0 - case NN_loopdne: // Loop while ECX != 0 and ZF=0 - case NN_loopqne: // Loop while RCX != 0 and ZF=0 + case STARS_NN_loopw: // Loop while ECX != 0 + case STARS_NN_loop: // Loop while CX != 0 + case STARS_NN_loopd: // Loop while ECX != 0 + case STARS_NN_loopq: // Loop while RCX != 0 + case STARS_NN_loopwe: // Loop while CX != 0 and ZF=1 + case STARS_NN_loope: // Loop while rCX != 0 and ZF=1 + case STARS_NN_loopde: // Loop while ECX != 0 and ZF=1 + case STARS_NN_loopqe: // Loop while RCX != 0 and ZF=1 + case STARS_NN_loopwne: // Loop while CX != 0 and ZF=0 + case STARS_NN_loopne: // Loop while rCX != 0 and ZF=0 + case STARS_NN_loopdne: // Loop while ECX != 0 and ZF=0 + case STARS_NN_loopqne: // Loop while RCX != 0 and ZF=0 SMP_fprintf(OutFile, "ERROR"); break; - case NN_lsl: // Load Segment Limit - case NN_ltr: // Load Task Register + case STARS_NN_lsl: // Load Segment Limit + case STARS_NN_ltr: // Load Task Register SMP_fprintf(OutFile, "ERROR"); break; - case NN_mov: // Move Data + case STARS_NN_mov: // Move Data SMP_fprintf(OutFile, "mov"); break; - case NN_movsp: // Move to/from Special Registers + case STARS_NN_movsp: // Move to/from Special Registers SMP_fprintf(OutFile, "ERROR"); break; - case NN_movs: // Move Byte(s) from String to String + case STARS_NN_movs: // Move Byte(s) from String to String SMP_fprintf(OutFile, "ERROR"); break; - case NN_movsx: // Move with Sign-Extend + case STARS_NN_movsx: // Move with Sign-Extend SMP_fprintf(OutFile, "movsx"); break; - case NN_movzx: // Move with Zero-Extend + case STARS_NN_movzx: // Move with Zero-Extend SMP_fprintf(OutFile, "movzx"); break; - case NN_mul: // Unsigned Multiplication of AL or AX + case STARS_NN_mul: // Unsigned Multiplication of AL or AX SMP_fprintf(OutFile, "mul"); break; - case NN_neg: // Two's Complement Negation + case STARS_NN_neg: // Two's Complement Negation SMP_fprintf(OutFile, "ERROR"); break; - case NN_nop: // No Operation + case STARS_NN_nop: // No Operation SMP_fprintf(OutFile, ""); break; - case NN_not: // One's Complement Negation + case STARS_NN_not: // One's Complement Negation SMP_fprintf(OutFile, "not"); break; - case NN_or: // Logical Inclusive OR + case STARS_NN_or: // Logical Inclusive OR SMP_fprintf(OutFile, "or"); break; - case NN_out: // Output to Port - case NN_outs: // Output Byte(s) to Port + case STARS_NN_out: // Output to Port + case STARS_NN_outs: // Output Byte(s) to Port SMP_fprintf(OutFile, "ERROR"); break; - case NN_pop: // Pop a word from the Stack + case STARS_NN_pop: // Pop a word from the Stack SMP_fprintf(OutFile, "pop"); break; - case NN_popaw: // Pop all General Registers - case NN_popa: // Pop all General Registers - case NN_popad: // Pop all General Registers (use32) - case NN_popaq: // Pop all General Registers (use64) - case NN_popfw: // Pop Stack into Flags Register - case NN_popf: // Pop Stack into Flags Register - case NN_popfd: // Pop Stack into Eflags Register - case NN_popfq: // Pop Stack into Rflags Register + case STARS_NN_popaw: // Pop all General Registers + case STARS_NN_popa: // Pop all General Registers + case STARS_NN_popad: // Pop all General Registers (use32) + case STARS_NN_popaq: // Pop all General Registers (use64) + case STARS_NN_popfw: // Pop Stack into Flags Register + case STARS_NN_popf: // Pop Stack into Flags Register + case STARS_NN_popfd: // Pop Stack into Eflags Register + case STARS_NN_popfq: // Pop Stack into Rflags Register SMP_fprintf(OutFile, "ERROR"); break; - case NN_push: // Push Operand onto the Stack + case STARS_NN_push: // Push Operand onto the Stack SMP_fprintf(OutFile, "push"); break; - case NN_pushaw: // Push all General Registers - case NN_pusha: // Push all General Registers - case NN_pushad: // Push all General Registers (use32) - case NN_pushaq: // Push all General Registers (use64) - case NN_pushfw: // Push Flags Register onto the Stack - case NN_pushf: // Push Flags Register onto the Stack - case NN_pushfd: // Push Flags Register onto the Stack (use32) - case NN_pushfq: // Push Flags Register onto the Stack (use64) + case STARS_NN_pushaw: // Push all General Registers + case STARS_NN_pusha: // Push all General Registers + case STARS_NN_pushad: // Push all General Registers (use32) + case STARS_NN_pushaq: // Push all General Registers (use64) + case STARS_NN_pushfw: // Push Flags Register onto the Stack + case STARS_NN_pushf: // Push Flags Register onto the Stack + case STARS_NN_pushfd: // Push Flags Register onto the Stack (use32) + case STARS_NN_pushfq: // Push Flags Register onto the Stack (use64) SMP_fprintf(OutFile, "ERROR"); break; - case NN_rcl: // Rotate Through Carry Left - case NN_rcr: // Rotate Through Carry Right - case NN_rol: // Rotate Left - case NN_ror: // Rotate Right + case STARS_NN_rcl: // Rotate Through Carry Left + case STARS_NN_rcr: // Rotate Through Carry Right + case STARS_NN_rol: // Rotate Left + case STARS_NN_ror: // Rotate Right SMP_fprintf(OutFile, "ERROR"); break; - case NN_rep: // Repeat String Operation - case NN_repe: // Repeat String Operation while ZF=1 - case NN_repne: // Repeat String Operation while ZF=0 + case STARS_NN_rep: // Repeat String Operation + case STARS_NN_repe: // Repeat String Operation while ZF=1 + case STARS_NN_repne: // Repeat String Operation while ZF=0 SMP_fprintf(OutFile, "ERROR"); break; - case NN_retn: // Return Near from Procedure - case NN_retf: // Return Far from Procedure + case STARS_NN_retn: // Return Near from Procedure + case STARS_NN_retf: // Return Far from Procedure SMP_fprintf(OutFile, "return"); break; - case NN_sahf: // Store AH into Flags Register + case STARS_NN_sahf: // Store AH into Flags Register SMP_fprintf(OutFile, "ERROR"); break; - case NN_sal: // Shift Arithmetic Left + case STARS_NN_sal: // Shift Arithmetic Left SMP_fprintf(OutFile, "sal"); break; - case NN_sar: // Shift Arithmetic Right + case STARS_NN_sar: // Shift Arithmetic Right SMP_fprintf(OutFile, "sar"); break; - case NN_shl: // Shift Logical Left + case STARS_NN_shl: // Shift Logical Left SMP_fprintf(OutFile, "shl"); break; - case NN_shr: // Shift Logical Right + case STARS_NN_shr: // Shift Logical Right SMP_fprintf(OutFile, "shr"); break; - case NN_sbb: // Integer Subtraction with Borrow + case STARS_NN_sbb: // Integer Subtraction with Borrow SMP_fprintf(OutFile, "ERROR"); break; - case NN_scas: // Compare String + case STARS_NN_scas: // Compare String SMP_fprintf(OutFile, "ERROR"); break; - case NN_seta: // Set Byte if Above (CF=0 & ZF=0) - case NN_setae: // Set Byte if Above or Equal (CF=0) - case NN_setb: // Set Byte if Below (CF=1) - case NN_setbe: // Set Byte if Below or Equal (CF=1 | ZF=1) - case NN_setc: // Set Byte if Carry (CF=1) - case NN_sete: // Set Byte if Equal (ZF=1) - case NN_setg: // Set Byte if Greater (ZF=0 & SF=OF) - case NN_setge: // Set Byte if Greater or Equal (SF=OF) - case NN_setl: // Set Byte if Less (SF!=OF) - case NN_setle: // Set Byte if Less or Equal (ZF=1 | SF!=OF) - case NN_setna: // Set Byte if Not Above (CF=1 | ZF=1) - case NN_setnae: // Set Byte if Not Above or Equal (CF=1) - case NN_setnb: // Set Byte if Not Below (CF=0) - case NN_setnbe: // Set Byte if Not Below or Equal (CF=0 & ZF=0) - case NN_setnc: // Set Byte if Not Carry (CF=0) - case NN_setne: // Set Byte if Not Equal (ZF=0) - case NN_setng: // Set Byte if Not Greater (ZF=1 | SF!=OF) - case NN_setnge: // Set Byte if Not Greater or Equal (ZF=1) - case NN_setnl: // Set Byte if Not Less (SF=OF) - case NN_setnle: // Set Byte if Not Less or Equal (ZF=0 & SF=OF) - case NN_setno: // Set Byte if Not Overflow (OF=0) - case NN_setnp: // Set Byte if Not Parity (PF=0) - case NN_setns: // Set Byte if Not Sign (SF=0) - case NN_setnz: // Set Byte if Not Zero (ZF=0) - case NN_seto: // Set Byte if Overflow (OF=1) - case NN_setp: // Set Byte if Parity (PF=1) - case NN_setpe: // Set Byte if Parity Even (PF=1) - case NN_setpo: // Set Byte if Parity Odd (PF=0) - case NN_sets: // Set Byte if Sign (SF=1) - case NN_setz: // Set Byte if Zero (ZF=1) + case STARS_NN_seta: // Set Byte if Above (CF=0 & ZF=0) + case STARS_NN_setae: // Set Byte if Above or Equal (CF=0) + case STARS_NN_setb: // Set Byte if Below (CF=1) + case STARS_NN_setbe: // Set Byte if Below or Equal (CF=1 | ZF=1) + case STARS_NN_setc: // Set Byte if Carry (CF=1) + case STARS_NN_sete: // Set Byte if Equal (ZF=1) + case STARS_NN_setg: // Set Byte if Greater (ZF=0 & SF=OF) + case STARS_NN_setge: // Set Byte if Greater or Equal (SF=OF) + case STARS_NN_setl: // Set Byte if Less (SF!=OF) + case STARS_NN_setle: // Set Byte if Less or Equal (ZF=1 | SF!=OF) + case STARS_NN_setna: // Set Byte if Not Above (CF=1 | ZF=1) + case STARS_NN_setnae: // Set Byte if Not Above or Equal (CF=1) + case STARS_NN_setnb: // Set Byte if Not Below (CF=0) + case STARS_NN_setnbe: // Set Byte if Not Below or Equal (CF=0 & ZF=0) + case STARS_NN_setnc: // Set Byte if Not Carry (CF=0) + case STARS_NN_setne: // Set Byte if Not Equal (ZF=0) + case STARS_NN_setng: // Set Byte if Not Greater (ZF=1 | SF!=OF) + case STARS_NN_setnge: // Set Byte if Not Greater or Equal (ZF=1) + case STARS_NN_setnl: // Set Byte if Not Less (SF=OF) + case STARS_NN_setnle: // Set Byte if Not Less or Equal (ZF=0 & SF=OF) + case STARS_NN_setno: // Set Byte if Not Overflow (OF=0) + case STARS_NN_setnp: // Set Byte if Not Parity (PF=0) + case STARS_NN_setns: // Set Byte if Not Sign (SF=0) + case STARS_NN_setnz: // Set Byte if Not Zero (ZF=0) + case STARS_NN_seto: // Set Byte if Overflow (OF=1) + case STARS_NN_setp: // Set Byte if Parity (PF=1) + case STARS_NN_setpe: // Set Byte if Parity Even (PF=1) + case STARS_NN_setpo: // Set Byte if Parity Odd (PF=0) + case STARS_NN_sets: // Set Byte if Sign (SF=1) + case STARS_NN_setz: // Set Byte if Zero (ZF=1) SMP_fprintf(OutFile, "ERROR"); break; - case NN_sgdt: // Store Global Descriptor Table Register - case NN_sidt: // Store Interrupt Descriptor Table Register + case STARS_NN_sgdt: // Store Global Descriptor Table Register + case STARS_NN_sidt: // Store Interrupt Descriptor Table Register SMP_fprintf(OutFile, "ERROR"); break; - case NN_shld: // Double Precision Shift Left - case NN_shrd: // Double Precision Shift Right + case STARS_NN_shld: // Double Precision Shift Left + case STARS_NN_shrd: // Double Precision Shift Right SMP_fprintf(OutFile, "ERROR"); break; - case NN_sldt: // Store Local Descriptor Table Register - case NN_smsw: // Store Machine Status Word - case NN_stc: // Set Carry Flag - case NN_std: // Set Direction Flag - case NN_sti: // Set Interrupt Flag + case STARS_NN_sldt: // Store Local Descriptor Table Register + case STARS_NN_smsw: // Store Machine Status Word + case STARS_NN_stc: // Set Carry Flag + case STARS_NN_std: // Set Direction Flag + case STARS_NN_sti: // Set Interrupt Flag SMP_fprintf(OutFile, "ERROR"); break; - case NN_stos: // Store String - case NN_str: // Store Task Register + case STARS_NN_stos: // Store String + case STARS_NN_str: // Store Task Register SMP_fprintf(OutFile, "ERROR"); break; - case NN_sub: // Integer Subtraction + case STARS_NN_sub: // Integer Subtraction SMP_fprintf(OutFile, "sub"); break; - case NN_test: // Logical Compare + case STARS_NN_test: // Logical Compare SMP_fprintf(OutFile, "test"); break; - case NN_verr: // Verify a Segment for Reading - case NN_verw: // Verify a Segment for Writing - case NN_wait: // Wait until BUSY# Pin is Inactive (HIGH) + case STARS_NN_verr: // Verify a Segment for Reading + case STARS_NN_verw: // Verify a Segment for Writing + case STARS_NN_wait: // Wait until BUSY# Pin is Inactive (HIGH) SMP_fprintf(OutFile, "ERROR"); break; - case NN_xchg: // Exchange Register/Memory with Register - case NN_xlat: // Table Lookup Translation + case STARS_NN_xchg: // Exchange Register/Memory with Register + case STARS_NN_xlat: // Table Lookup Translation SMP_fprintf(OutFile, "ERROR"); break; - case NN_xor: // Logical Exclusive OR + case STARS_NN_xor: // Logical Exclusive OR SMP_fprintf(OutFile, "xor"); break; @@ -1454,12 +1360,12 @@ void PrintOpcode(uint16 opcode, FILE *OutFile) { // 486 instructions // - case NN_cmpxchg: // Compare and Exchange - case NN_bswap: // Swap bits in EAX - case NN_xadd: // t<-dest; dest<-src+dest; src<-t - case NN_invd: // Invalidate Data Cache - case NN_wbinvd: // Invalidate Data Cache (write changes) - case NN_invlpg: // Invalidate TLB entry + case STARS_NN_cmpxchg: // Compare and Exchange + case STARS_NN_bswap: // Swap bits in EAX + case STARS_NN_xadd: // t<-dest; dest<-src+dest; src<-t + case STARS_NN_invd: // Invalidate Data Cache + case STARS_NN_wbinvd: // Invalidate Data Cache (write changes) + case STARS_NN_invlpg: // Invalidate TLB entry SMP_fprintf(OutFile, "ERROR"); break; @@ -1467,12 +1373,12 @@ void PrintOpcode(uint16 opcode, FILE *OutFile) { // Pentium instructions // - case NN_rdmsr: // Read Machine Status Register - case NN_wrmsr: // Write Machine Status Register - case NN_cpuid: // Get CPU ID - case NN_cmpxchg8b: // Compare and Exchange Eight Bytes - case NN_rdtsc: // Read Time Stamp Counter - case NN_rsm: // Resume from System Management Mode + case STARS_NN_rdmsr: // Read Machine Status Register + case STARS_NN_wrmsr: // Write Machine Status Register + case STARS_NN_cpuid: // Get CPU ID + case STARS_NN_cmpxchg8b: // Compare and Exchange Eight Bytes + case STARS_NN_rdtsc: // Read Time Stamp Counter + case STARS_NN_rsm: // Resume from System Management Mode SMP_fprintf(OutFile, "ERROR"); break; @@ -1480,35 +1386,35 @@ void PrintOpcode(uint16 opcode, FILE *OutFile) { // Pentium Pro instructions // - case NN_cmova: // Move if Above (CF=0 & ZF=0) - case NN_cmovb: // Move if Below (CF=1) - case NN_cmovbe: // Move if Below or Equal (CF=1 | ZF=1) - case NN_cmovg: // Move if Greater (ZF=0 & SF=OF) - case NN_cmovge: // Move if Greater or Equal (SF=OF) - case NN_cmovl: // Move if Less (SF!=OF) - case NN_cmovle: // Move if Less or Equal (ZF=1 | SF!=OF) - case NN_cmovnb: // Move if Not Below (CF=0) - case NN_cmovno: // Move if Not Overflow (OF=0) - case NN_cmovnp: // Move if Not Parity (PF=0) - case NN_cmovns: // Move if Not Sign (SF=0) - case NN_cmovnz: // Move if Not Zero (ZF=0) - case NN_cmovo: // Move if Overflow (OF=1) - case NN_cmovp: // Move if Parity (PF=1) - case NN_cmovs: // Move if Sign (SF=1) - case NN_cmovz: // Move if Zero (ZF=1) - case NN_fcmovb: // Floating Move if Below - case NN_fcmove: // Floating Move if Equal - case NN_fcmovbe: // Floating Move if Below or Equal - case NN_fcmovu: // Floating Move if Unordered - case NN_fcmovnb: // Floating Move if Not Below - case NN_fcmovne: // Floating Move if Not Equal - case NN_fcmovnbe: // Floating Move if Not Below or Equal - case NN_fcmovnu: // Floating Move if Not Unordered - case NN_fcomi: // FP Compare, result in EFLAGS - case NN_fucomi: // FP Unordered Compare, result in EFLAGS - case NN_fcomip: // FP Compare, result in EFLAGS, pop stack - case NN_fucomip: // FP Unordered Compare, result in EFLAGS, pop stack - case NN_rdpmc: // Read Performance Monitor Counter + case STARS_NN_cmova: // Move if Above (CF=0 & ZF=0) + case STARS_NN_cmovb: // Move if Below (CF=1) + case STARS_NN_cmovbe: // Move if Below or Equal (CF=1 | ZF=1) + case STARS_NN_cmovg: // Move if Greater (ZF=0 & SF=OF) + case STARS_NN_cmovge: // Move if Greater or Equal (SF=OF) + case STARS_NN_cmovl: // Move if Less (SF!=OF) + case STARS_NN_cmovle: // Move if Less or Equal (ZF=1 | SF!=OF) + case STARS_NN_cmovnb: // Move if Not Below (CF=0) + case STARS_NN_cmovno: // Move if Not Overflow (OF=0) + case STARS_NN_cmovnp: // Move if Not Parity (PF=0) + case STARS_NN_cmovns: // Move if Not Sign (SF=0) + case STARS_NN_cmovnz: // Move if Not Zero (ZF=0) + case STARS_NN_cmovo: // Move if Overflow (OF=1) + case STARS_NN_cmovp: // Move if Parity (PF=1) + case STARS_NN_cmovs: // Move if Sign (SF=1) + case STARS_NN_cmovz: // Move if Zero (ZF=1) + case STARS_NN_fcmovb: // Floating Move if Below + case STARS_NN_fcmove: // Floating Move if Equal + case STARS_NN_fcmovbe: // Floating Move if Below or Equal + case STARS_NN_fcmovu: // Floating Move if Unordered + case STARS_NN_fcmovnb: // Floating Move if Not Below + case STARS_NN_fcmovne: // Floating Move if Not Equal + case STARS_NN_fcmovnbe: // Floating Move if Not Below or Equal + case STARS_NN_fcmovnu: // Floating Move if Not Unordered + case STARS_NN_fcomi: // FP Compare, result in EFLAGS + case STARS_NN_fucomi: // FP Unordered Compare, result in EFLAGS + case STARS_NN_fcomip: // FP Compare, result in EFLAGS, pop stack + case STARS_NN_fucomip: // FP Unordered Compare, result in EFLAGS, pop stack + case STARS_NN_rdpmc: // Read Performance Monitor Counter SMP_fprintf(OutFile, "ERROR"); break; @@ -1516,83 +1422,83 @@ void PrintOpcode(uint16 opcode, FILE *OutFile) { // FPP instructions // - case NN_fld: // Load Real - case NN_fst: // Store Real - case NN_fstp: // Store Real and Pop - case NN_fxch: // Exchange Registers - case NN_fild: // Load Integer - case NN_fist: // Store Integer - case NN_fistp: // Store Integer and Pop - case NN_fbld: // Load BCD - case NN_fbstp: // Store BCD and Pop - case NN_fadd: // Add Real - case NN_faddp: // Add Real and Pop - case NN_fiadd: // Add Integer - case NN_fsub: // Subtract Real - case NN_fsubp: // Subtract Real and Pop - case NN_fisub: // Subtract Integer - case NN_fsubr: // Subtract Real Reversed - case NN_fsubrp: // Subtract Real Reversed and Pop - case NN_fisubr: // Subtract Integer Reversed - case NN_fmul: // Multiply Real - case NN_fmulp: // Multiply Real and Pop - case NN_fimul: // Multiply Integer - case NN_fdiv: // Divide Real - case NN_fdivp: // Divide Real and Pop - case NN_fidiv: // Divide Integer - case NN_fdivr: // Divide Real Reversed - case NN_fdivrp: // Divide Real Reversed and Pop - case NN_fidivr: // Divide Integer Reversed - case NN_fsqrt: // Square Root - case NN_fscale: // Scale: st(0) <- st(0) * 2^st(1) - case NN_fprem: // Partial Remainder - case NN_frndint: // Round to Integer - case NN_fxtract: // Extract exponent and significand - case NN_fabs: // Absolute value - case NN_fchs: // Change Sign - case NN_fcom: // Compare Real - case NN_fcomp: // Compare Real and Pop - case NN_fcompp: // Compare Real and Pop Twice - case NN_ficom: // Compare Integer - case NN_ficomp: // Compare Integer and Pop - case NN_ftst: // Test - case NN_fxam: // Examine - case NN_fptan: // Partial tangent - case NN_fpatan: // Partial arctangent - case NN_f2xm1: // 2^x - 1 - case NN_fyl2x: // Y * lg2(X) - case NN_fyl2xp1: // Y * lg2(X+1) - case NN_fldz: // Load +0.0 - case NN_fld1: // Load +1.0 - case NN_fldpi: // Load PI=3.14... - case NN_fldl2t: // Load lg2(10) - case NN_fldl2e: // Load lg2(e) - case NN_fldlg2: // Load lg10(2) - case NN_fldln2: // Load ln(2) - case NN_finit: // Initialize Processor - case NN_fninit: // Initialize Processor (no wait) - case NN_fsetpm: // Set Protected Mode - case NN_fldcw: // Load Control Word - case NN_fstcw: // Store Control Word - case NN_fnstcw: // Store Control Word (no wait) - case NN_fstsw: // Store Status Word - case NN_fnstsw: // Store Status Word (no wait) - case NN_fclex: // Clear Exceptions - case NN_fnclex: // Clear Exceptions (no wait) - case NN_fstenv: // Store Environment - case NN_fnstenv: // Store Environment (no wait) - case NN_fldenv: // Load Environment - case NN_fsave: // Save State - case NN_fnsave: // Save State (no wait) - case NN_frstor: // Restore State - case NN_fincstp: // Increment Stack Pointer - case NN_fdecstp: // Decrement Stack Pointer - case NN_ffree: // Free Register - case NN_fnop: // No Operation - case NN_feni: // (8087 only) - case NN_fneni: // (no wait) (8087 only) - case NN_fdisi: // (8087 only) - case NN_fndisi: // (no wait) (8087 only) + case STARS_NN_fld: // Load Real + case STARS_NN_fst: // Store Real + case STARS_NN_fstp: // Store Real and Pop + case STARS_NN_fxch: // Exchange Registers + case STARS_NN_fild: // Load Integer + case STARS_NN_fist: // Store Integer + case STARS_NN_fistp: // Store Integer and Pop + case STARS_NN_fbld: // Load BCD + case STARS_NN_fbstp: // Store BCD and Pop + case STARS_NN_fadd: // Add Real + case STARS_NN_faddp: // Add Real and Pop + case STARS_NN_fiadd: // Add Integer + case STARS_NN_fsub: // Subtract Real + case STARS_NN_fsubp: // Subtract Real and Pop + case STARS_NN_fisub: // Subtract Integer + case STARS_NN_fsubr: // Subtract Real Reversed + case STARS_NN_fsubrp: // Subtract Real Reversed and Pop + case STARS_NN_fisubr: // Subtract Integer Reversed + case STARS_NN_fmul: // Multiply Real + case STARS_NN_fmulp: // Multiply Real and Pop + case STARS_NN_fimul: // Multiply Integer + case STARS_NN_fdiv: // Divide Real + case STARS_NN_fdivp: // Divide Real and Pop + case STARS_NN_fidiv: // Divide Integer + case STARS_NN_fdivr: // Divide Real Reversed + case STARS_NN_fdivrp: // Divide Real Reversed and Pop + case STARS_NN_fidivr: // Divide Integer Reversed + case STARS_NN_fsqrt: // Square Root + case STARS_NN_fscale: // Scale: st(0) <- st(0) * 2^st(1) + case STARS_NN_fprem: // Partial Remainder + case STARS_NN_frndint: // Round to Integer + case STARS_NN_fxtract: // Extract exponent and significand + case STARS_NN_fabs: // Absolute value + case STARS_NN_fchs: // Change Sign + case STARS_NN_fcom: // Compare Real + case STARS_NN_fcomp: // Compare Real and Pop + case STARS_NN_fcompp: // Compare Real and Pop Twice + case STARS_NN_ficom: // Compare Integer + case STARS_NN_ficomp: // Compare Integer and Pop + case STARS_NN_ftst: // Test + case STARS_NN_fxam: // Examine + case STARS_NN_fptan: // Partial tangent + case STARS_NN_fpatan: // Partial arctangent + case STARS_NN_f2xm1: // 2^x - 1 + case STARS_NN_fyl2x: // Y * lg2(X) + case STARS_NN_fyl2xp1: // Y * lg2(X+1) + case STARS_NN_fldz: // Load +0.0 + case STARS_NN_fld1: // Load +1.0 + case STARS_NN_fldpi: // Load PI=3.14... + case STARS_NN_fldl2t: // Load lg2(10) + case STARS_NN_fldl2e: // Load lg2(e) + case STARS_NN_fldlg2: // Load lg10(2) + case STARS_NN_fldln2: // Load ln(2) + case STARS_NN_finit: // Initialize Processor + case STARS_NN_fninit: // Initialize Processor (no wait) + case STARS_NN_fsetpm: // Set Protected Mode + case STARS_NN_fldcw: // Load Control Word + case STARS_NN_fstcw: // Store Control Word + case STARS_NN_fnstcw: // Store Control Word (no wait) + case STARS_NN_fstsw: // Store Status Word + case STARS_NN_fnstsw: // Store Status Word (no wait) + case STARS_NN_fclex: // Clear Exceptions + case STARS_NN_fnclex: // Clear Exceptions (no wait) + case STARS_NN_fstenv: // Store Environment + case STARS_NN_fnstenv: // Store Environment (no wait) + case STARS_NN_fldenv: // Load Environment + case STARS_NN_fsave: // Save State + case STARS_NN_fnsave: // Save State (no wait) + case STARS_NN_frstor: // Restore State + case STARS_NN_fincstp: // Increment Stack Pointer + case STARS_NN_fdecstp: // Decrement Stack Pointer + case STARS_NN_ffree: // Free Register + case STARS_NN_fnop: // No Operation + case STARS_NN_feni: // (8087 only) + case STARS_NN_fneni: // (no wait) (8087 only) + case STARS_NN_fdisi: // (8087 only) + case STARS_NN_fndisi: // (no wait) (8087 only) SMP_fprintf(OutFile, "ERROR"); break; @@ -1600,13 +1506,13 @@ void PrintOpcode(uint16 opcode, FILE *OutFile) { // 80387 instructions // - case NN_fprem1: // Partial Remainder ( < half ) - case NN_fsincos: // t<-cos(st); st<-sin(st); push t - case NN_fsin: // Sine - case NN_fcos: // Cosine - case NN_fucom: // Compare Unordered Real - case NN_fucomp: // Compare Unordered Real and Pop - case NN_fucompp: // Compare Unordered Real and Pop Twice + case STARS_NN_fprem1: // Partial Remainder ( < half ) + case STARS_NN_fsincos: // t<-cos(st); st<-sin(st); push t + case STARS_NN_fsin: // Sine + case STARS_NN_fcos: // Cosine + case STARS_NN_fucom: // Compare Unordered Real + case STARS_NN_fucomp: // Compare Unordered Real and Pop + case STARS_NN_fucompp: // Compare Unordered Real and Pop Twice SMP_fprintf(OutFile, "ERROR"); break; @@ -1614,15 +1520,15 @@ void PrintOpcode(uint16 opcode, FILE *OutFile) { // Instructions added 28.02.96 // - case NN_setalc: // Set AL to Carry Flag - case NN_svdc: // Save Register and Descriptor - case NN_rsdc: // Restore Register and Descriptor - case NN_svldt: // Save LDTR and Descriptor - case NN_rsldt: // Restore LDTR and Descriptor - case NN_svts: // Save TR and Descriptor - case NN_rsts: // Restore TR and Descriptor - case NN_icebp: // ICE Break Point - case NN_loadall: // Load the entire CPU state from ES:EDI + case STARS_NN_setalc: // Set AL to Carry Flag + case STARS_NN_svdc: // Save Register and Descriptor + case STARS_NN_rsdc: // Restore Register and Descriptor + case STARS_NN_svldt: // Save LDTR and Descriptor + case STARS_NN_rsldt: // Restore LDTR and Descriptor + case STARS_NN_svts: // Save TR and Descriptor + case STARS_NN_rsts: // Restore TR and Descriptor + case STARS_NN_icebp: // ICE Break Point + case STARS_NN_loadall: // Load the entire CPU state from ES:EDI SMP_fprintf(OutFile, "ERROR"); break; @@ -1630,53 +1536,53 @@ void PrintOpcode(uint16 opcode, FILE *OutFile) { // MMX instructions // - case NN_emms: // Empty MMX state - case NN_movd: // Move 32 bits - case NN_movq: // Move 64 bits - case NN_packsswb: // Pack with Signed Saturation (Word->Byte) - case NN_packssdw: // Pack with Signed Saturation (Dword->Word) - case NN_packuswb: // Pack with Unsigned Saturation (Word->Byte) - case NN_paddb: // Packed Add Byte - case NN_paddw: // Packed Add Word - case NN_paddd: // Packed Add Dword - case NN_paddsb: // Packed Add with Saturation (Byte) - case NN_paddsw: // Packed Add with Saturation (Word) - case NN_paddusb: // Packed Add Unsigned with Saturation (Byte) - case NN_paddusw: // Packed Add Unsigned with Saturation (Word) - case NN_pand: // Bitwise Logical And - case NN_pandn: // Bitwise Logical And Not - case NN_pcmpeqb: // Packed Compare for Equal (Byte) - case NN_pcmpeqw: // Packed Compare for Equal (Word) - case NN_pcmpeqd: // Packed Compare for Equal (Dword) - case NN_pcmpgtb: // Packed Compare for Greater Than (Byte) - case NN_pcmpgtw: // Packed Compare for Greater Than (Word) - case NN_pcmpgtd: // Packed Compare for Greater Than (Dword) - case NN_pmaddwd: // Packed Multiply and Add - case NN_pmulhw: // Packed Multiply High - case NN_pmullw: // Packed Multiply Low - case NN_por: // Bitwise Logical Or - case NN_psllw: // Packed Shift Left Logical (Word) - case NN_pslld: // Packed Shift Left Logical (Dword) - case NN_psllq: // Packed Shift Left Logical (Qword) - case NN_psraw: // Packed Shift Right Arithmetic (Word) - case NN_psrad: // Packed Shift Right Arithmetic (Dword) - case NN_psrlw: // Packed Shift Right Logical (Word) - case NN_psrld: // Packed Shift Right Logical (Dword) - case NN_psrlq: // Packed Shift Right Logical (Qword) - case NN_psubb: // Packed Subtract Byte - case NN_psubw: // Packed Subtract Word - case NN_psubd: // Packed Subtract Dword - case NN_psubsb: // Packed Subtract with Saturation (Byte) - case NN_psubsw: // Packed Subtract with Saturation (Word) - case NN_psubusb: // Packed Subtract Unsigned with Saturation (Byte) - case NN_psubusw: // Packed Subtract Unsigned with Saturation (Word) - case NN_punpckhbw: // Unpack High Packed Data (Byte->Word) - case NN_punpckhwd: // Unpack High Packed Data (Word->Dword) - case NN_punpckhdq: // Unpack High Packed Data (Dword->Qword) - case NN_punpcklbw: // Unpack Low Packed Data (Byte->Word) - case NN_punpcklwd: // Unpack Low Packed Data (Word->Dword) - case NN_punpckldq: // Unpack Low Packed Data (Dword->Qword) - case NN_pxor: // Bitwise Logical Exclusive Or + case STARS_NN_emms: // Empty MMX state + case STARS_NN_movd: // Move 32 bits + case STARS_NN_movq: // Move 64 bits + case STARS_NN_packsswb: // Pack with Signed Saturation (Word->Byte) + case STARS_NN_packssdw: // Pack with Signed Saturation (Dword->Word) + case STARS_NN_packuswb: // Pack with Unsigned Saturation (Word->Byte) + case STARS_NN_paddb: // Packed Add Byte + case STARS_NN_paddw: // Packed Add Word + case STARS_NN_paddd: // Packed Add Dword + case STARS_NN_paddsb: // Packed Add with Saturation (Byte) + case STARS_NN_paddsw: // Packed Add with Saturation (Word) + case STARS_NN_paddusb: // Packed Add Unsigned with Saturation (Byte) + case STARS_NN_paddusw: // Packed Add Unsigned with Saturation (Word) + case STARS_NN_pand: // Bitwise Logical And + case STARS_NN_pandn: // Bitwise Logical And Not + case STARS_NN_pcmpeqb: // Packed Compare for Equal (Byte) + case STARS_NN_pcmpeqw: // Packed Compare for Equal (Word) + case STARS_NN_pcmpeqd: // Packed Compare for Equal (Dword) + case STARS_NN_pcmpgtb: // Packed Compare for Greater Than (Byte) + case STARS_NN_pcmpgtw: // Packed Compare for Greater Than (Word) + case STARS_NN_pcmpgtd: // Packed Compare for Greater Than (Dword) + case STARS_NN_pmaddwd: // Packed Multiply and Add + case STARS_NN_pmulhw: // Packed Multiply High + case STARS_NN_pmullw: // Packed Multiply Low + case STARS_NN_por: // Bitwise Logical Or + case STARS_NN_psllw: // Packed Shift Left Logical (Word) + case STARS_NN_pslld: // Packed Shift Left Logical (Dword) + case STARS_NN_psllq: // Packed Shift Left Logical (Qword) + case STARS_NN_psraw: // Packed Shift Right Arithmetic (Word) + case STARS_NN_psrad: // Packed Shift Right Arithmetic (Dword) + case STARS_NN_psrlw: // Packed Shift Right Logical (Word) + case STARS_NN_psrld: // Packed Shift Right Logical (Dword) + case STARS_NN_psrlq: // Packed Shift Right Logical (Qword) + case STARS_NN_psubb: // Packed Subtract Byte + case STARS_NN_psubw: // Packed Subtract Word + case STARS_NN_psubd: // Packed Subtract Dword + case STARS_NN_psubsb: // Packed Subtract with Saturation (Byte) + case STARS_NN_psubsw: // Packed Subtract with Saturation (Word) + case STARS_NN_psubusb: // Packed Subtract Unsigned with Saturation (Byte) + case STARS_NN_psubusw: // Packed Subtract Unsigned with Saturation (Word) + case STARS_NN_punpckhbw: // Unpack High Packed Data (Byte->Word) + case STARS_NN_punpckhwd: // Unpack High Packed Data (Word->Dword) + case STARS_NN_punpckhdq: // Unpack High Packed Data (Dword->Qword) + case STARS_NN_punpcklbw: // Unpack Low Packed Data (Byte->Word) + case STARS_NN_punpcklwd: // Unpack Low Packed Data (Word->Dword) + case STARS_NN_punpckldq: // Unpack Low Packed Data (Dword->Qword) + case STARS_NN_pxor: // Bitwise Logical Exclusive Or SMP_fprintf(OutFile, "ERROR"); break; @@ -1684,923 +1590,923 @@ void PrintOpcode(uint16 opcode, FILE *OutFile) { // Undocumented Deschutes processor instructions // - case NN_fxsave: // Fast save FP context - case NN_fxrstor: // Fast restore FP context + case STARS_NN_fxsave: // Fast save FP context + case STARS_NN_fxrstor: // Fast restore FP context SMP_fprintf(OutFile, "ERROR"); break; // Pentium II instructions - case NN_sysenter: // Fast Transition to System Call Entry Point - case NN_sysexit: // Fast Transition from System Call Entry Point + case STARS_NN_sysenter: // Fast Transition to System Call Entry Point + case STARS_NN_sysexit: // Fast Transition from System Call Entry Point SMP_fprintf(OutFile, "ERROR"); break; // 3DNow! instructions - case NN_pavgusb: // Packed 8-bit Unsigned Integer Averaging - case NN_pfadd: // Packed Floating-Point Addition - case NN_pfsub: // Packed Floating-Point Subtraction - case NN_pfsubr: // Packed Floating-Point Reverse Subtraction - case NN_pfacc: // Packed Floating-Point Accumulate - case NN_pfcmpge: // Packed Floating-Point Comparison, Greater or Equal - case NN_pfcmpgt: // Packed Floating-Point Comparison, Greater - case NN_pfcmpeq: // Packed Floating-Point Comparison, Equal - case NN_pfmin: // Packed Floating-Point Minimum - case NN_pfmax: // Packed Floating-Point Maximum - case NN_pi2fd: // Packed 32-bit Integer to Floating-Point - case NN_pf2id: // Packed Floating-Point to 32-bit Integer - case NN_pfrcp: // Packed Floating-Point Reciprocal Approximation - case NN_pfrsqrt: // Packed Floating-Point Reciprocal Square Root Approximation - case NN_pfmul: // Packed Floating-Point Multiplication - case NN_pfrcpit1: // Packed Floating-Point Reciprocal First Iteration Step - case NN_pfrsqit1: // Packed Floating-Point Reciprocal Square Root First Iteration Step - case NN_pfrcpit2: // Packed Floating-Point Reciprocal Second Iteration Step - case NN_pmulhrw: // Packed Floating-Point 16-bit Integer Multiply with rounding - case NN_femms: // Faster entry/exit of the MMX or floating-point state - case NN_prefetch: // Prefetch at least a 32-byte line into L1 data cache - case NN_prefetchw: // Prefetch processor cache line into L1 data cache (mark as modified) + case STARS_NN_pavgusb: // Packed 8-bit Unsigned Integer Averaging + case STARS_NN_pfadd: // Packed Floating-Point Addition + case STARS_NN_pfsub: // Packed Floating-Point Subtraction + case STARS_NN_pfsubr: // Packed Floating-Point Reverse Subtraction + case STARS_NN_pfacc: // Packed Floating-Point Accumulate + case STARS_NN_pfcmpge: // Packed Floating-Point Comparison, Greater or Equal + case STARS_NN_pfcmpgt: // Packed Floating-Point Comparison, Greater + case STARS_NN_pfcmpeq: // Packed Floating-Point Comparison, Equal + case STARS_NN_pfmin: // Packed Floating-Point Minimum + case STARS_NN_pfmax: // Packed Floating-Point Maximum + case STARS_NN_pi2fd: // Packed 32-bit Integer to Floating-Point + case STARS_NN_pf2id: // Packed Floating-Point to 32-bit Integer + case STARS_NN_pfrcp: // Packed Floating-Point Reciprocal Approximation + case STARS_NN_pfrsqrt: // Packed Floating-Point Reciprocal Square Root Approximation + case STARS_NN_pfmul: // Packed Floating-Point Multiplication + case STARS_NN_pfrcpit1: // Packed Floating-Point Reciprocal First Iteration Step + case STARS_NN_pfrsqit1: // Packed Floating-Point Reciprocal Square Root First Iteration Step + case STARS_NN_pfrcpit2: // Packed Floating-Point Reciprocal Second Iteration Step + case STARS_NN_pmulhrw: // Packed Floating-Point 16-bit Integer Multiply with rounding + case STARS_NN_femms: // Faster entry/exit of the MMX or floating-point state + case STARS_NN_prefetch: // Prefetch at least a 32-byte line into L1 data cache + case STARS_NN_prefetchw: // Prefetch processor cache line into L1 data cache (mark as modified) SMP_fprintf(OutFile, "ERROR"); break; // Pentium III instructions - case NN_addps: // Packed Single-FP Add - case NN_addss: // Scalar Single-FP Add - case NN_andnps: // Bitwise Logical And Not for Single-FP - case NN_andps: // Bitwise Logical And for Single-FP - case NN_cmpps: // Packed Single-FP Compare - case NN_cmpss: // Scalar Single-FP Compare - case NN_comiss: // Scalar Ordered Single-FP Compare and Set EFLAGS - case NN_cvtpi2ps: // Packed signed INT32 to Packed Single-FP conversion - case NN_cvtps2pi: // Packed Single-FP to Packed INT32 conversion - case NN_cvtsi2ss: // Scalar signed INT32 to Single-FP conversion - case NN_cvtss2si: // Scalar Single-FP to signed INT32 conversion - case NN_cvttps2pi: // Packed Single-FP to Packed INT32 conversion (truncate) - case NN_cvttss2si: // Scalar Single-FP to signed INT32 conversion (truncate) - case NN_divps: // Packed Single-FP Divide - case NN_divss: // Scalar Single-FP Divide - case NN_ldmxcsr: // Load Streaming SIMD Extensions Technology Control/Status Register - case NN_maxps: // Packed Single-FP Maximum - case NN_maxss: // Scalar Single-FP Maximum - case NN_minps: // Packed Single-FP Minimum - case NN_minss: // Scalar Single-FP Minimum - case NN_movaps: // Move Aligned Four Packed Single-FP - case NN_movhlps: // Move High to Low Packed Single-FP - case NN_movhps: // Move High Packed Single-FP - case NN_movlhps: // Move Low to High Packed Single-FP - case NN_movlps: // Move Low Packed Single-FP - case NN_movmskps: // Move Mask to Register - case NN_movss: // Move Scalar Single-FP - case NN_movups: // Move Unaligned Four Packed Single-FP - case NN_mulps: // Packed Single-FP Multiply - case NN_mulss: // Scalar Single-FP Multiply - case NN_orps: // Bitwise Logical OR for Single-FP Data - case NN_rcpps: // Packed Single-FP Reciprocal - case NN_rcpss: // Scalar Single-FP Reciprocal - case NN_rsqrtps: // Packed Single-FP Square Root Reciprocal - case NN_rsqrtss: // Scalar Single-FP Square Root Reciprocal - case NN_shufps: // Shuffle Single-FP - case NN_sqrtps: // Packed Single-FP Square Root - case NN_sqrtss: // Scalar Single-FP Square Root - case NN_stmxcsr: // Store Streaming SIMD Extensions Technology Control/Status Register - case NN_subps: // Packed Single-FP Subtract - case NN_subss: // Scalar Single-FP Subtract - case NN_ucomiss: // Scalar Unordered Single-FP Compare and Set EFLAGS - case NN_unpckhps: // Unpack High Packed Single-FP Data - case NN_unpcklps: // Unpack Low Packed Single-FP Data - case NN_xorps: // Bitwise Logical XOR for Single-FP Data - case NN_pavgb: // Packed Average (Byte) - case NN_pavgw: // Packed Average (Word) - case NN_pextrw: // Extract Word - case NN_pinsrw: // Insert Word - case NN_pmaxsw: // Packed Signed Integer Word Maximum - case NN_pmaxub: // Packed Unsigned Integer Byte Maximum - case NN_pminsw: // Packed Signed Integer Word Minimum - case NN_pminub: // Packed Unsigned Integer Byte Minimum - case NN_pmovmskb: // Move Byte Mask to Integer - case NN_pmulhuw: // Packed Multiply High Unsigned - case NN_psadbw: // Packed Sum of Absolute Differences - case NN_pshufw: // Packed Shuffle Word - case NN_maskmovq: // Byte Mask write - case NN_movntps: // Move Aligned Four Packed Single-FP Non Temporal - case NN_movntq: // Move 64 Bits Non Temporal - case NN_prefetcht0: // Prefetch to all cache levels - case NN_prefetcht1: // Prefetch to all cache levels - case NN_prefetcht2: // Prefetch to L2 cache - case NN_prefetchnta: // Prefetch to L1 cache - case NN_sfence: // Store Fence + case STARS_NN_addps: // Packed Single-FP Add + case STARS_NN_addss: // Scalar Single-FP Add + case STARS_NN_andnps: // Bitwise Logical And Not for Single-FP + case STARS_NN_andps: // Bitwise Logical And for Single-FP + case STARS_NN_cmpps: // Packed Single-FP Compare + case STARS_NN_cmpss: // Scalar Single-FP Compare + case STARS_NN_comiss: // Scalar Ordered Single-FP Compare and Set EFLAGS + case STARS_NN_cvtpi2ps: // Packed signed INT32 to Packed Single-FP conversion + case STARS_NN_cvtps2pi: // Packed Single-FP to Packed INT32 conversion + case STARS_NN_cvtsi2ss: // Scalar signed INT32 to Single-FP conversion + case STARS_NN_cvtss2si: // Scalar Single-FP to signed INT32 conversion + case STARS_NN_cvttps2pi: // Packed Single-FP to Packed INT32 conversion (truncate) + case STARS_NN_cvttss2si: // Scalar Single-FP to signed INT32 conversion (truncate) + case STARS_NN_divps: // Packed Single-FP Divide + case STARS_NN_divss: // Scalar Single-FP Divide + case STARS_NN_ldmxcsr: // Load Streaming SIMD Extensions Technology Control/Status Register + case STARS_NN_maxps: // Packed Single-FP Maximum + case STARS_NN_maxss: // Scalar Single-FP Maximum + case STARS_NN_minps: // Packed Single-FP Minimum + case STARS_NN_minss: // Scalar Single-FP Minimum + case STARS_NN_movaps: // Move Aligned Four Packed Single-FP + case STARS_NN_movhlps: // Move High to Low Packed Single-FP + case STARS_NN_movhps: // Move High Packed Single-FP + case STARS_NN_movlhps: // Move Low to High Packed Single-FP + case STARS_NN_movlps: // Move Low Packed Single-FP + case STARS_NN_movmskps: // Move Mask to Register + case STARS_NN_movss: // Move Scalar Single-FP + case STARS_NN_movups: // Move Unaligned Four Packed Single-FP + case STARS_NN_mulps: // Packed Single-FP Multiply + case STARS_NN_mulss: // Scalar Single-FP Multiply + case STARS_NN_orps: // Bitwise Logical OR for Single-FP Data + case STARS_NN_rcpps: // Packed Single-FP Reciprocal + case STARS_NN_rcpss: // Scalar Single-FP Reciprocal + case STARS_NN_rsqrtps: // Packed Single-FP Square Root Reciprocal + case STARS_NN_rsqrtss: // Scalar Single-FP Square Root Reciprocal + case STARS_NN_shufps: // Shuffle Single-FP + case STARS_NN_sqrtps: // Packed Single-FP Square Root + case STARS_NN_sqrtss: // Scalar Single-FP Square Root + case STARS_NN_stmxcsr: // Store Streaming SIMD Extensions Technology Control/Status Register + case STARS_NN_subps: // Packed Single-FP Subtract + case STARS_NN_subss: // Scalar Single-FP Subtract + case STARS_NN_ucomiss: // Scalar Unordered Single-FP Compare and Set EFLAGS + case STARS_NN_unpckhps: // Unpack High Packed Single-FP Data + case STARS_NN_unpcklps: // Unpack Low Packed Single-FP Data + case STARS_NN_xorps: // Bitwise Logical XOR for Single-FP Data + case STARS_NN_pavgb: // Packed Average (Byte) + case STARS_NN_pavgw: // Packed Average (Word) + case STARS_NN_pextrw: // Extract Word + case STARS_NN_pinsrw: // Insert Word + case STARS_NN_pmaxsw: // Packed Signed Integer Word Maximum + case STARS_NN_pmaxub: // Packed Unsigned Integer Byte Maximum + case STARS_NN_pminsw: // Packed Signed Integer Word Minimum + case STARS_NN_pminub: // Packed Unsigned Integer Byte Minimum + case STARS_NN_pmovmskb: // Move Byte Mask to Integer + case STARS_NN_pmulhuw: // Packed Multiply High Unsigned + case STARS_NN_psadbw: // Packed Sum of Absolute Differences + case STARS_NN_pshufw: // Packed Shuffle Word + case STARS_NN_maskmovq: // Byte Mask write + case STARS_NN_movntps: // Move Aligned Four Packed Single-FP Non Temporal + case STARS_NN_movntq: // Move 64 Bits Non Temporal + case STARS_NN_prefetcht0: // Prefetch to all cache levels + case STARS_NN_prefetcht1: // Prefetch to all cache levels + case STARS_NN_prefetcht2: // Prefetch to L2 cache + case STARS_NN_prefetchnta: // Prefetch to L1 cache + case STARS_NN_sfence: // Store Fence SMP_fprintf(OutFile, "ERROR"); break; // Pentium III Pseudo instructions - case NN_cmpeqps: // Packed Single-FP Compare EQ - case NN_cmpltps: // Packed Single-FP Compare LT - case NN_cmpleps: // Packed Single-FP Compare LE - case NN_cmpunordps: // Packed Single-FP Compare UNORD - case NN_cmpneqps: // Packed Single-FP Compare NOT EQ - case NN_cmpnltps: // Packed Single-FP Compare NOT LT - case NN_cmpnleps: // Packed Single-FP Compare NOT LE - case NN_cmpordps: // Packed Single-FP Compare ORDERED - case NN_cmpeqss: // Scalar Single-FP Compare EQ - case NN_cmpltss: // Scalar Single-FP Compare LT - case NN_cmpless: // Scalar Single-FP Compare LE - case NN_cmpunordss: // Scalar Single-FP Compare UNORD - case NN_cmpneqss: // Scalar Single-FP Compare NOT EQ - case NN_cmpnltss: // Scalar Single-FP Compare NOT LT - case NN_cmpnless: // Scalar Single-FP Compare NOT LE - case NN_cmpordss: // Scalar Single-FP Compare ORDERED + case STARS_NN_cmpeqps: // Packed Single-FP Compare EQ + case STARS_NN_cmpltps: // Packed Single-FP Compare LT + case STARS_NN_cmpleps: // Packed Single-FP Compare LE + case STARS_NN_cmpunordps: // Packed Single-FP Compare UNORD + case STARS_NN_cmpneqps: // Packed Single-FP Compare NOT EQ + case STARS_NN_cmpnltps: // Packed Single-FP Compare NOT LT + case STARS_NN_cmpnleps: // Packed Single-FP Compare NOT LE + case STARS_NN_cmpordps: // Packed Single-FP Compare ORDERED + case STARS_NN_cmpeqss: // Scalar Single-FP Compare EQ + case STARS_NN_cmpltss: // Scalar Single-FP Compare LT + case STARS_NN_cmpless: // Scalar Single-FP Compare LE + case STARS_NN_cmpunordss: // Scalar Single-FP Compare UNORD + case STARS_NN_cmpneqss: // Scalar Single-FP Compare NOT EQ + case STARS_NN_cmpnltss: // Scalar Single-FP Compare NOT LT + case STARS_NN_cmpnless: // Scalar Single-FP Compare NOT LE + case STARS_NN_cmpordss: // Scalar Single-FP Compare ORDERED SMP_fprintf(OutFile, "ERROR"); break; // AMD K7 instructions - case NN_pf2iw: // Packed Floating-Point to Integer with Sign Extend - case NN_pfnacc: // Packed Floating-Point Negative Accumulate - case NN_pfpnacc: // Packed Floating-Point Mixed Positive-Negative Accumulate - case NN_pi2fw: // Packed 16-bit Integer to Floating-Point - case NN_pswapd: // Packed Swap Double Word + case STARS_NN_pf2iw: // Packed Floating-Point to Integer with Sign Extend + case STARS_NN_pfnacc: // Packed Floating-Point Negative Accumulate + case STARS_NN_pfpnacc: // Packed Floating-Point Mixed Positive-Negative Accumulate + case STARS_NN_pi2fw: // Packed 16-bit Integer to Floating-Point + case STARS_NN_pswapd: // Packed Swap Double Word SMP_fprintf(OutFile, "ERROR"); break; // Undocumented FP instructions (thanks to norbert.juffa@adm.com) - case NN_fstp1: // Alias of Store Real and Pop - case NN_fcom2: // Alias of Compare Real - case NN_fcomp3: // Alias of Compare Real and Pop - case NN_fxch4: // Alias of Exchange Registers - case NN_fcomp5: // Alias of Compare Real and Pop - case NN_ffreep: // Free Register and Pop - case NN_fxch7: // Alias of Exchange Registers - case NN_fstp8: // Alias of Store Real and Pop - case NN_fstp9: // Alias of Store Real and Pop + case STARS_NN_fstp1: // Alias of Store Real and Pop + case STARS_NN_fcom2: // Alias of Compare Real + case STARS_NN_fcomp3: // Alias of Compare Real and Pop + case STARS_NN_fxch4: // Alias of Exchange Registers + case STARS_NN_fcomp5: // Alias of Compare Real and Pop + case STARS_NN_ffreep: // Free Register and Pop + case STARS_NN_fxch7: // Alias of Exchange Registers + case STARS_NN_fstp8: // Alias of Store Real and Pop + case STARS_NN_fstp9: // Alias of Store Real and Pop SMP_fprintf(OutFile, "ERROR"); break; // Pentium 4 instructions - case NN_addpd: // Add Packed Double-Precision Floating-Point Values - case NN_addsd: // Add Scalar Double-Precision Floating-Point Values - case NN_andnpd: // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values - case NN_andpd: // Bitwise Logical AND of Packed Double-Precision Floating-Point Values - case NN_clflush: // Flush Cache Line - case NN_cmppd: // Compare Packed Double-Precision Floating-Point Values - case NN_cmpsd: // Compare Scalar Double-Precision Floating-Point Values - case NN_comisd: // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS - case NN_cvtdq2pd: // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values - case NN_cvtdq2ps: // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values - case NN_cvtpd2dq: // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers - case NN_cvtpd2pi: // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers - case NN_cvtpd2ps: // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values - case NN_cvtpi2pd: // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values - case NN_cvtps2dq: // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers - case NN_cvtps2pd: // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values - case NN_cvtsd2si: // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer - case NN_cvtsd2ss: // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value - case NN_cvtsi2sd: // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value - case NN_cvtss2sd: // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value - case NN_cvttpd2dq: // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers - case NN_cvttpd2pi: // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers - case NN_cvttps2dq: // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers - case NN_cvttsd2si: // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer - case NN_divpd: // Divide Packed Double-Precision Floating-Point Values - case NN_divsd: // Divide Scalar Double-Precision Floating-Point Values - case NN_lfence: // Load Fence - case NN_maskmovdqu: // Store Selected Bytes of Double Quadword - case NN_maxpd: // Return Maximum Packed Double-Precision Floating-Point Values - case NN_maxsd: // Return Maximum Scalar Double-Precision Floating-Point Value - case NN_mfence: // Memory Fence - case NN_minpd: // Return Minimum Packed Double-Precision Floating-Point Values - case NN_minsd: // Return Minimum Scalar Double-Precision Floating-Point Value - case NN_movapd: // Move Aligned Packed Double-Precision Floating-Point Values - case NN_movdq2q: // Move Quadword from XMM to MMX Register - case NN_movdqa: // Move Aligned Double Quadword - case NN_movdqu: // Move Unaligned Double Quadword - case NN_movhpd: // Move High Packed Double-Precision Floating-Point Values - case NN_movlpd: // Move Low Packed Double-Precision Floating-Point Values - case NN_movmskpd: // Extract Packed Double-Precision Floating-Point Sign Mask - case NN_movntdq: // Store Double Quadword Using Non-Temporal Hint - case NN_movnti: // Store Doubleword Using Non-Temporal Hint - case NN_movntpd: // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint - case NN_movq2dq: // Move Quadword from MMX to XMM Register - case NN_movsd: // Move Scalar Double-Precision Floating-Point Values - case NN_movupd: // Move Unaligned Packed Double-Precision Floating-Point Values - case NN_mulpd: // Multiply Packed Double-Precision Floating-Point Values - case NN_mulsd: // Multiply Scalar Double-Precision Floating-Point Values - case NN_orpd: // Bitwise Logical OR of Double-Precision Floating-Point Values - case NN_paddq: // Add Packed Quadword Integers - case NN_pause: // Spin Loop Hint - case NN_pmuludq: // Multiply Packed Unsigned Doubleword Integers - case NN_pshufd: // Shuffle Packed Doublewords - case NN_pshufhw: // Shuffle Packed High Words - case NN_pshuflw: // Shuffle Packed Low Words - case NN_pslldq: // Shift Double Quadword Left Logical - case NN_psrldq: // Shift Double Quadword Right Logical - case NN_psubq: // Subtract Packed Quadword Integers - case NN_punpckhqdq: // Unpack High Data - case NN_punpcklqdq: // Unpack Low Data - case NN_shufpd: // Shuffle Packed Double-Precision Floating-Point Values - case NN_sqrtpd: // Compute Square Roots of Packed Double-Precision Floating-Point Values - case NN_sqrtsd: // Compute Square Rootof Scalar Double-Precision Floating-Point Value - case NN_subpd: // Subtract Packed Double-Precision Floating-Point Values - case NN_subsd: // Subtract Scalar Double-Precision Floating-Point Values - case NN_ucomisd: // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS - case NN_unpckhpd: // Unpack and Interleave High Packed Double-Precision Floating-Point Values - case NN_unpcklpd: // Unpack and Interleave Low Packed Double-Precision Floating-Point Values - case NN_xorpd: // Bitwise Logical OR of Double-Precision Floating-Point Values + case STARS_NN_addpd: // Add Packed Double-Precision Floating-Point Values + case STARS_NN_addsd: // Add Scalar Double-Precision Floating-Point Values + case STARS_NN_andnpd: // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values + case STARS_NN_andpd: // Bitwise Logical AND of Packed Double-Precision Floating-Point Values + case STARS_NN_clflush: // Flush Cache Line + case STARS_NN_cmppd: // Compare Packed Double-Precision Floating-Point Values + case STARS_NN_cmpsd: // Compare Scalar Double-Precision Floating-Point Values + case STARS_NN_comisd: // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + case STARS_NN_cvtdq2pd: // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values + case STARS_NN_cvtdq2ps: // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + case STARS_NN_cvtpd2dq: // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_cvtpd2pi: // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_cvtpd2ps: // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values + case STARS_NN_cvtpi2pd: // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + case STARS_NN_cvtps2dq: // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_cvtps2pd: // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values + case STARS_NN_cvtsd2si: // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer + case STARS_NN_cvtsd2ss: // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value + case STARS_NN_cvtsi2sd: // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value + case STARS_NN_cvtss2sd: // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value + case STARS_NN_cvttpd2dq: // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_cvttpd2pi: // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_cvttps2dq: // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_cvttsd2si: // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer + case STARS_NN_divpd: // Divide Packed Double-Precision Floating-Point Values + case STARS_NN_divsd: // Divide Scalar Double-Precision Floating-Point Values + case STARS_NN_lfence: // Load Fence + case STARS_NN_maskmovdqu: // Store Selected Bytes of Double Quadword + case STARS_NN_maxpd: // Return Maximum Packed Double-Precision Floating-Point Values + case STARS_NN_maxsd: // Return Maximum Scalar Double-Precision Floating-Point Value + case STARS_NN_mfence: // Memory Fence + case STARS_NN_minpd: // Return Minimum Packed Double-Precision Floating-Point Values + case STARS_NN_minsd: // Return Minimum Scalar Double-Precision Floating-Point Value + case STARS_NN_movapd: // Move Aligned Packed Double-Precision Floating-Point Values + case STARS_NN_movdq2q: // Move Quadword from XMM to MMX Register + case STARS_NN_movdqa: // Move Aligned Double Quadword + case STARS_NN_movdqu: // Move Unaligned Double Quadword + case STARS_NN_movhpd: // Move High Packed Double-Precision Floating-Point Values + case STARS_NN_movlpd: // Move Low Packed Double-Precision Floating-Point Values + case STARS_NN_movmskpd: // Extract Packed Double-Precision Floating-Point Sign Mask + case STARS_NN_movntdq: // Store Double Quadword Using Non-Temporal Hint + case STARS_NN_movnti: // Store Doubleword Using Non-Temporal Hint + case STARS_NN_movntpd: // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint + case STARS_NN_movq2dq: // Move Quadword from MMX to XMM Register + case STARS_NN_movsd: // Move Scalar Double-Precision Floating-Point Values + case STARS_NN_movupd: // Move Unaligned Packed Double-Precision Floating-Point Values + case STARS_NN_mulpd: // Multiply Packed Double-Precision Floating-Point Values + case STARS_NN_mulsd: // Multiply Scalar Double-Precision Floating-Point Values + case STARS_NN_orpd: // Bitwise Logical OR of Double-Precision Floating-Point Values + case STARS_NN_paddq: // Add Packed Quadword Integers + case STARS_NN_pause: // Spin Loop Hint + case STARS_NN_pmuludq: // Multiply Packed Unsigned Doubleword Integers + case STARS_NN_pshufd: // Shuffle Packed Doublewords + case STARS_NN_pshufhw: // Shuffle Packed High Words + case STARS_NN_pshuflw: // Shuffle Packed Low Words + case STARS_NN_pslldq: // Shift Double Quadword Left Logical + case STARS_NN_psrldq: // Shift Double Quadword Right Logical + case STARS_NN_psubq: // Subtract Packed Quadword Integers + case STARS_NN_punpckhqdq: // Unpack High Data + case STARS_NN_punpcklqdq: // Unpack Low Data + case STARS_NN_shufpd: // Shuffle Packed Double-Precision Floating-Point Values + case STARS_NN_sqrtpd: // Compute Square Roots of Packed Double-Precision Floating-Point Values + case STARS_NN_sqrtsd: // Compute Square Rootof Scalar Double-Precision Floating-Point Value + case STARS_NN_subpd: // Subtract Packed Double-Precision Floating-Point Values + case STARS_NN_subsd: // Subtract Scalar Double-Precision Floating-Point Values + case STARS_NN_ucomisd: // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + case STARS_NN_unpckhpd: // Unpack and Interleave High Packed Double-Precision Floating-Point Values + case STARS_NN_unpcklpd: // Unpack and Interleave Low Packed Double-Precision Floating-Point Values + case STARS_NN_xorpd: // Bitwise Logical OR of Double-Precision Floating-Point Values SMP_fprintf(OutFile, "ERROR"); break; // AMD syscall/sysret instructions - case NN_syscall: // Low latency system call - case NN_sysret: // Return from system call + case STARS_NN_syscall: // Low latency system call + case STARS_NN_sysret: // Return from system call SMP_fprintf(OutFile, "ERROR"); break; // AMD64 instructions - case NN_swapgs: // Exchange GS base with KernelGSBase MSR + case STARS_NN_swapgs: // Exchange GS base with KernelGSBase MSR SMP_fprintf(OutFile, "ERROR"); break; // New Pentium instructions (SSE3) - case NN_movddup: // Move One Double-FP and Duplicate - case NN_movshdup: // Move Packed Single-FP High and Duplicate - case NN_movsldup: // Move Packed Single-FP Low and Duplicate + case STARS_NN_movddup: // Move One Double-FP and Duplicate + case STARS_NN_movshdup: // Move Packed Single-FP High and Duplicate + case STARS_NN_movsldup: // Move Packed Single-FP Low and Duplicate SMP_fprintf(OutFile, "ERROR"); break; // Missing AMD64 instructions - case NN_movsxd: // Move with Sign-Extend Doubleword - case NN_cmpxchg16b: // Compare and Exchange 16 Bytes + case STARS_NN_movsxd: // Move with Sign-Extend Doubleword + case STARS_NN_cmpxchg16b: // Compare and Exchange 16 Bytes SMP_fprintf(OutFile, "ERROR"); break; // SSE3 instructions - case NN_addsubpd: // Add /Sub packed DP FP numbers - case NN_addsubps: // Add /Sub packed SP FP numbers - case NN_haddpd: // Add horizontally packed DP FP numbers - case NN_haddps: // Add horizontally packed SP FP numbers - case NN_hsubpd: // Sub horizontally packed DP FP numbers - case NN_hsubps: // Sub horizontally packed SP FP numbers - case NN_monitor: // Set up a linear address range to be monitored by hardware - case NN_mwait: // Wait until write-back store performed within the range specified by the MONITOR instruction - case NN_fisttp: // Store ST in intXX (chop) and pop - case NN_lddqu: // Load unaligned integer 128-bit + case STARS_NN_addsubpd: // Add /Sub packed DP FP numbers + case STARS_NN_addsubps: // Add /Sub packed SP FP numbers + case STARS_NN_haddpd: // Add horizontally packed DP FP numbers + case STARS_NN_haddps: // Add horizontally packed SP FP numbers + case STARS_NN_hsubpd: // Sub horizontally packed DP FP numbers + case STARS_NN_hsubps: // Sub horizontally packed SP FP numbers + case STARS_NN_monitor: // Set up a linear address range to be monitored by hardware + case STARS_NN_mwait: // Wait until write-back store performed within the range specified by the MONITOR instruction + case STARS_NN_fisttp: // Store ST in intXX (chop) and pop + case STARS_NN_lddqu: // Load unaligned integer 128-bit SMP_fprintf(OutFile, "ERROR"); break; // SSSE3 instructions - case NN_psignb: // Packed SIGN Byte - case NN_psignw: // Packed SIGN Word - case NN_psignd: // Packed SIGN Doubleword - case NN_pshufb: // Packed Shuffle Bytes - case NN_pmulhrsw: // Packed Multiply High with Round and Scale - case NN_pmaddubsw: // Multiply and Add Packed Signed and Unsigned Bytes - case NN_phsubsw: // Packed Horizontal Subtract and Saturate - case NN_phaddsw: // Packed Horizontal Add and Saturate - case NN_phaddw: // Packed Horizontal Add Word - case NN_phaddd: // Packed Horizontal Add Doubleword - case NN_phsubw: // Packed Horizontal Subtract Word - case NN_phsubd: // Packed Horizontal Subtract Doubleword - case NN_palignr: // Packed Align Right - case NN_pabsb: // Packed Absolute Value Byte - case NN_pabsw: // Packed Absolute Value Word - case NN_pabsd: // Packed Absolute Value Doubleword + case STARS_NN_psignb: // Packed SIGN Byte + case STARS_NN_psignw: // Packed SIGN Word + case STARS_NN_psignd: // Packed SIGN Doubleword + case STARS_NN_pshufb: // Packed Shuffle Bytes + case STARS_NN_pmulhrsw: // Packed Multiply High with Round and Scale + case STARS_NN_pmaddubsw: // Multiply and Add Packed Signed and Unsigned Bytes + case STARS_NN_phsubsw: // Packed Horizontal Subtract and Saturate + case STARS_NN_phaddsw: // Packed Horizontal Add and Saturate + case STARS_NN_phaddw: // Packed Horizontal Add Word + case STARS_NN_phaddd: // Packed Horizontal Add Doubleword + case STARS_NN_phsubw: // Packed Horizontal Subtract Word + case STARS_NN_phsubd: // Packed Horizontal Subtract Doubleword + case STARS_NN_palignr: // Packed Align Right + case STARS_NN_pabsb: // Packed Absolute Value Byte + case STARS_NN_pabsw: // Packed Absolute Value Word + case STARS_NN_pabsd: // Packed Absolute Value Doubleword SMP_fprintf(OutFile, "ERROR"); break; // VMX instructions - case NN_vmcall: // Call to VM Monitor - case NN_vmclear: // Clear Virtual Machine Control Structure - case NN_vmlaunch: // Launch Virtual Machine - case NN_vmresume: // Resume Virtual Machine - case NN_vmptrld: // Load Pointer to Virtual Machine Control Structure - case NN_vmptrst: // Store Pointer to Virtual Machine Control Structure - case NN_vmread: // Read Field from Virtual Machine Control Structure - case NN_vmwrite: // Write Field from Virtual Machine Control Structure - case NN_vmxoff: // Leave VMX Operation - case NN_vmxon: // Enter VMX Operation + case STARS_NN_vmcall: // Call to VM Monitor + case STARS_NN_vmclear: // Clear Virtual Machine Control Structure + case STARS_NN_vmlaunch: // Launch Virtual Machine + case STARS_NN_vmresume: // Resume Virtual Machine + case STARS_NN_vmptrld: // Load Pointer to Virtual Machine Control Structure + case STARS_NN_vmptrst: // Store Pointer to Virtual Machine Control Structure + case STARS_NN_vmread: // Read Field from Virtual Machine Control Structure + case STARS_NN_vmwrite: // Write Field from Virtual Machine Control Structure + case STARS_NN_vmxoff: // Leave VMX Operation + case STARS_NN_vmxon: // Enter VMX Operation SMP_fprintf(OutFile, "ERROR"); break; // Undefined Instruction - case NN_ud2: // Undefined Instruction + case STARS_NN_ud2: // Undefined Instruction SMP_fprintf(OutFile, "ERROR"); break; // Added with x86-64 - case NN_rdtscp: // Read Time-Stamp Counter and Processor ID + case STARS_NN_rdtscp: // Read Time-Stamp Counter and Processor ID SMP_fprintf(OutFile, "ERROR"); break; // Geode LX 3DNow! extensions - case NN_pfrcpv: // Reciprocal Approximation for a Pair of 32-bit Floats - case NN_pfrsqrtv: // Reciprocal Square Root Approximation for a Pair of 32-bit Floats + case STARS_NN_pfrcpv: // Reciprocal Approximation for a Pair of 32-bit Floats + case STARS_NN_pfrsqrtv: // Reciprocal Square Root Approximation for a Pair of 32-bit Floats SMP_fprintf(OutFile, "ERROR"); break; // SSE2 pseudoinstructions - case NN_cmpeqpd: // Packed Double-FP Compare EQ - case NN_cmpltpd: // Packed Double-FP Compare LT - case NN_cmplepd: // Packed Double-FP Compare LE - case NN_cmpunordpd: // Packed Double-FP Compare UNORD - case NN_cmpneqpd: // Packed Double-FP Compare NOT EQ - case NN_cmpnltpd: // Packed Double-FP Compare NOT LT - case NN_cmpnlepd: // Packed Double-FP Compare NOT LE - case NN_cmpordpd: // Packed Double-FP Compare ORDERED - case NN_cmpeqsd: // Scalar Double-FP Compare EQ - case NN_cmpltsd: // Scalar Double-FP Compare LT - case NN_cmplesd: // Scalar Double-FP Compare LE - case NN_cmpunordsd: // Scalar Double-FP Compare UNORD - case NN_cmpneqsd: // Scalar Double-FP Compare NOT EQ - case NN_cmpnltsd: // Scalar Double-FP Compare NOT LT - case NN_cmpnlesd: // Scalar Double-FP Compare NOT LE - case NN_cmpordsd: // Scalar Double-FP Compare ORDERED + case STARS_NN_cmpeqpd: // Packed Double-FP Compare EQ + case STARS_NN_cmpltpd: // Packed Double-FP Compare LT + case STARS_NN_cmplepd: // Packed Double-FP Compare LE + case STARS_NN_cmpunordpd: // Packed Double-FP Compare UNORD + case STARS_NN_cmpneqpd: // Packed Double-FP Compare NOT EQ + case STARS_NN_cmpnltpd: // Packed Double-FP Compare NOT LT + case STARS_NN_cmpnlepd: // Packed Double-FP Compare NOT LE + case STARS_NN_cmpordpd: // Packed Double-FP Compare ORDERED + case STARS_NN_cmpeqsd: // Scalar Double-FP Compare EQ + case STARS_NN_cmpltsd: // Scalar Double-FP Compare LT + case STARS_NN_cmplesd: // Scalar Double-FP Compare LE + case STARS_NN_cmpunordsd: // Scalar Double-FP Compare UNORD + case STARS_NN_cmpneqsd: // Scalar Double-FP Compare NOT EQ + case STARS_NN_cmpnltsd: // Scalar Double-FP Compare NOT LT + case STARS_NN_cmpnlesd: // Scalar Double-FP Compare NOT LE + case STARS_NN_cmpordsd: // Scalar Double-FP Compare ORDERED SMP_fprintf(OutFile, "ERROR"); break; // SSSE4.1 instructions - case NN_blendpd: // Blend Packed Double Precision Floating-Point Values - case NN_blendps: // Blend Packed Single Precision Floating-Point Values - case NN_blendvpd: // Variable Blend Packed Double Precision Floating-Point Values - case NN_blendvps: // Variable Blend Packed Single Precision Floating-Point Values - case NN_dppd: // Dot Product of Packed Double Precision Floating-Point Values - case NN_dpps: // Dot Product of Packed Single Precision Floating-Point Values - case NN_extractps: // Extract Packed Single Precision Floating-Point Value - case NN_insertps: // Insert Packed Single Precision Floating-Point Value - case NN_movntdqa: // Load Double Quadword Non-Temporal Aligned Hint - case NN_mpsadbw: // Compute Multiple Packed Sums of Absolute Difference - case NN_packusdw: // Pack with Unsigned Saturation - case NN_pblendvb: // Variable Blend Packed Bytes - case NN_pblendw: // Blend Packed Words - case NN_pcmpeqq: // Compare Packed Qword Data for Equal - case NN_pextrb: // Extract Byte - case NN_pextrd: // Extract Dword - case NN_pextrq: // Extract Qword - case NN_phminposuw: // Packed Horizontal Word Minimum - case NN_pinsrb: // Insert Byte - case NN_pinsrd: // Insert Dword - case NN_pinsrq: // Insert Qword - case NN_pmaxsb: // Maximum of Packed Signed Byte Integers - case NN_pmaxsd: // Maximum of Packed Signed Dword Integers - case NN_pmaxud: // Maximum of Packed Unsigned Dword Integers - case NN_pmaxuw: // Maximum of Packed Word Integers - case NN_pminsb: // Minimum of Packed Signed Byte Integers - case NN_pminsd: // Minimum of Packed Signed Dword Integers - case NN_pminud: // Minimum of Packed Unsigned Dword Integers - case NN_pminuw: // Minimum of Packed Word Integers - case NN_pmovsxbw: // Packed Move with Sign Extend - case NN_pmovsxbd: // Packed Move with Sign Extend - case NN_pmovsxbq: // Packed Move with Sign Extend - case NN_pmovsxwd: // Packed Move with Sign Extend - case NN_pmovsxwq: // Packed Move with Sign Extend - case NN_pmovsxdq: // Packed Move with Sign Extend - case NN_pmovzxbw: // Packed Move with Zero Extend - case NN_pmovzxbd: // Packed Move with Zero Extend - case NN_pmovzxbq: // Packed Move with Zero Extend - case NN_pmovzxwd: // Packed Move with Zero Extend - case NN_pmovzxwq: // Packed Move with Zero Extend - case NN_pmovzxdq: // Packed Move with Zero Extend - case NN_pmuldq: // Multiply Packed Signed Dword Integers - case NN_pmulld: // Multiply Packed Signed Dword Integers and Store Low Result - case NN_ptest: // Logical Compare - case NN_roundpd: // Round Packed Double Precision Floating-Point Values - case NN_roundps: // Round Packed Single Precision Floating-Point Values - case NN_roundsd: // Round Scalar Double Precision Floating-Point Values - case NN_roundss: // Round Scalar Single Precision Floating-Point Values + case STARS_NN_blendpd: // Blend Packed Double Precision Floating-Point Values + case STARS_NN_blendps: // Blend Packed Single Precision Floating-Point Values + case STARS_NN_blendvpd: // Variable Blend Packed Double Precision Floating-Point Values + case STARS_NN_blendvps: // Variable Blend Packed Single Precision Floating-Point Values + case STARS_NN_dppd: // Dot Product of Packed Double Precision Floating-Point Values + case STARS_NN_dpps: // Dot Product of Packed Single Precision Floating-Point Values + case STARS_NN_extractps: // Extract Packed Single Precision Floating-Point Value + case STARS_NN_insertps: // Insert Packed Single Precision Floating-Point Value + case STARS_NN_movntdqa: // Load Double Quadword Non-Temporal Aligned Hint + case STARS_NN_mpsadbw: // Compute Multiple Packed Sums of Absolute Difference + case STARS_NN_packusdw: // Pack with Unsigned Saturation + case STARS_NN_pblendvb: // Variable Blend Packed Bytes + case STARS_NN_pblendw: // Blend Packed Words + case STARS_NN_pcmpeqq: // Compare Packed Qword Data for Equal + case STARS_NN_pextrb: // Extract Byte + case STARS_NN_pextrd: // Extract Dword + case STARS_NN_pextrq: // Extract Qword + case STARS_NN_phminposuw: // Packed Horizontal Word Minimum + case STARS_NN_pinsrb: // Insert Byte + case STARS_NN_pinsrd: // Insert Dword + case STARS_NN_pinsrq: // Insert Qword + case STARS_NN_pmaxsb: // Maximum of Packed Signed Byte Integers + case STARS_NN_pmaxsd: // Maximum of Packed Signed Dword Integers + case STARS_NN_pmaxud: // Maximum of Packed Unsigned Dword Integers + case STARS_NN_pmaxuw: // Maximum of Packed Word Integers + case STARS_NN_pminsb: // Minimum of Packed Signed Byte Integers + case STARS_NN_pminsd: // Minimum of Packed Signed Dword Integers + case STARS_NN_pminud: // Minimum of Packed Unsigned Dword Integers + case STARS_NN_pminuw: // Minimum of Packed Word Integers + case STARS_NN_pmovsxbw: // Packed Move with Sign Extend + case STARS_NN_pmovsxbd: // Packed Move with Sign Extend + case STARS_NN_pmovsxbq: // Packed Move with Sign Extend + case STARS_NN_pmovsxwd: // Packed Move with Sign Extend + case STARS_NN_pmovsxwq: // Packed Move with Sign Extend + case STARS_NN_pmovsxdq: // Packed Move with Sign Extend + case STARS_NN_pmovzxbw: // Packed Move with Zero Extend + case STARS_NN_pmovzxbd: // Packed Move with Zero Extend + case STARS_NN_pmovzxbq: // Packed Move with Zero Extend + case STARS_NN_pmovzxwd: // Packed Move with Zero Extend + case STARS_NN_pmovzxwq: // Packed Move with Zero Extend + case STARS_NN_pmovzxdq: // Packed Move with Zero Extend + case STARS_NN_pmuldq: // Multiply Packed Signed Dword Integers + case STARS_NN_pmulld: // Multiply Packed Signed Dword Integers and Store Low Result + case STARS_NN_ptest: // Logical Compare + case STARS_NN_roundpd: // Round Packed Double Precision Floating-Point Values + case STARS_NN_roundps: // Round Packed Single Precision Floating-Point Values + case STARS_NN_roundsd: // Round Scalar Double Precision Floating-Point Values + case STARS_NN_roundss: // Round Scalar Single Precision Floating-Point Values SMP_fprintf(OutFile, "ERROR"); break; // SSSE4.2 instructions - case NN_crc32: // Accumulate CRC32 Value - case NN_pcmpestri: // Packed Compare Explicit Length Strings: Return Index - case NN_pcmpestrm: // Packed Compare Explicit Length Strings: Return Mask - case NN_pcmpistri: // Packed Compare Implicit Length Strings: Return Index - case NN_pcmpistrm: // Packed Compare Implicit Length Strings: Return Mask - case NN_pcmpgtq: // Compare Packed Data for Greater Than - case NN_popcnt: // Return the Count of Number of Bits Set to 1 + case STARS_NN_crc32: // Accumulate CRC32 Value + case STARS_NN_pcmpestri: // Packed Compare Explicit Length Strings: Return Index + case STARS_NN_pcmpestrm: // Packed Compare Explicit Length Strings: Return Mask + case STARS_NN_pcmpistri: // Packed Compare Implicit Length Strings: Return Index + case STARS_NN_pcmpistrm: // Packed Compare Implicit Length Strings: Return Mask + case STARS_NN_pcmpgtq: // Compare Packed Data for Greater Than + case STARS_NN_popcnt: // Return the Count of Number of Bits Set to 1 SMP_fprintf(OutFile, "ERROR"); break; // AMD SSE4a instructions - case NN_extrq: // Extract Field From Register - case NN_insertq: // Insert Field - case NN_movntsd: // Move Non-Temporal Scalar Double-Precision Floating-Point - case NN_movntss: // Move Non-Temporal Scalar Single-Precision Floating-Point - case NN_lzcnt: // Leading Zero Count + case STARS_NN_extrq: // Extract Field From Register + case STARS_NN_insertq: // Insert Field + case STARS_NN_movntsd: // Move Non-Temporal Scalar Double-Precision Floating-Point + case STARS_NN_movntss: // Move Non-Temporal Scalar Single-Precision Floating-Point + case STARS_NN_lzcnt: // Leading Zero Count SMP_fprintf(OutFile, "ERROR"); break; // xsave/xrstor instructions - case NN_xgetbv: // Get Value of Extended Control Register - case NN_xrstor: // Restore Processor Extended States - case NN_xsave: // Save Processor Extended States - case NN_xsetbv: // Set Value of Extended Control Register + case STARS_NN_xgetbv: // Get Value of Extended Control Register + case STARS_NN_xrstor: // Restore Processor Extended States + case STARS_NN_xsave: // Save Processor Extended States + case STARS_NN_xsetbv: // Set Value of Extended Control Register SMP_fprintf(OutFile, "ERROR"); break; // Intel Safer Mode Extensions (SMX) - case NN_getsec: // Safer Mode Extensions (SMX) Instruction + case STARS_NN_getsec: // Safer Mode Extensions (SMX) Instruction SMP_fprintf(OutFile, "ERROR"); break; // AMD-V Virtualization ISA Extension - case NN_clgi: // Clear Global Interrupt Flag - case NN_invlpga: // Invalidate TLB Entry in a Specified ASID - case NN_skinit: // Secure Init and Jump with Attestation - case NN_stgi: // Set Global Interrupt Flag - case NN_vmexit: // Stop Executing Guest: Begin Executing Host - case NN_vmload: // Load State from VMCB - case NN_vmmcall: // Call VMM - case NN_vmrun: // Run Virtual Machine - case NN_vmsave: // Save State to VMCB + case STARS_NN_clgi: // Clear Global Interrupt Flag + case STARS_NN_invlpga: // Invalidate TLB Entry in a Specified ASID + case STARS_NN_skinit: // Secure Init and Jump with Attestation + case STARS_NN_stgi: // Set Global Interrupt Flag + case STARS_NN_vmexit: // Stop Executing Guest: Begin Executing Host + case STARS_NN_vmload: // Load State from VMCB + case STARS_NN_vmmcall: // Call VMM + case STARS_NN_vmrun: // Run Virtual Machine + case STARS_NN_vmsave: // Save State to VMCB SMP_fprintf(OutFile, "ERROR"); break; // VMX+ instructions - case NN_invept: // Invalidate Translations Derived from EPT - case NN_invvpid: // Invalidate Translations Based on VPID + case STARS_NN_invept: // Invalidate Translations Derived from EPT + case STARS_NN_invvpid: // Invalidate Translations Based on VPID SMP_fprintf(OutFile, "ERROR"); break; // Intel Atom instructions - case NN_movbe: // Move Data After Swapping Bytes + case STARS_NN_movbe: // Move Data After Swapping Bytes SMP_fprintf(OutFile, "ERROR"); break; // Intel AES instructions - case NN_aesenc: // Perform One Round of an AES Encryption Flow - case NN_aesenclast: // Perform the Last Round of an AES Encryption Flow - case NN_aesdec: // Perform One Round of an AES Decryption Flow - case NN_aesdeclast: // Perform the Last Round of an AES Decryption Flow - case NN_aesimc: // Perform the AES InvMixColumn Transformation - case NN_aeskeygenassist: // AES Round Key Generation Assist + case STARS_NN_aesenc: // Perform One Round of an AES Encryption Flow + case STARS_NN_aesenclast: // Perform the Last Round of an AES Encryption Flow + case STARS_NN_aesdec: // Perform One Round of an AES Decryption Flow + case STARS_NN_aesdeclast: // Perform the Last Round of an AES Decryption Flow + case STARS_NN_aesimc: // Perform the AES InvMixColumn Transformation + case STARS_NN_aeskeygenassist: // AES Round Key Generation Assist SMP_fprintf(OutFile, "ERROR"); break; // Carryless multiplication - case NN_pclmulqdq: // Carry-Less Multiplication Quadword + case STARS_NN_pclmulqdq: // Carry-Less Multiplication Quadword SMP_fprintf(OutFile, "ERROR"); break; // Returns modifies by operand size prefixes - case NN_retnw: // Return Near from Procedure (use16) - case NN_retnd: // Return Near from Procedure (use32) - case NN_retnq: // Return Near from Procedure (use64) - case NN_retfw: // Return Far from Procedure (use16) - case NN_retfd: // Return Far from Procedure (use32) - case NN_retfq: // Return Far from Procedure (use64) + case STARS_NN_retnw: // Return Near from Procedure (use16) + case STARS_NN_retnd: // Return Near from Procedure (use32) + case STARS_NN_retnq: // Return Near from Procedure (use64) + case STARS_NN_retfw: // Return Far from Procedure (use16) + case STARS_NN_retfd: // Return Far from Procedure (use32) + case STARS_NN_retfq: // Return Far from Procedure (use64) SMP_fprintf(OutFile, "return"); break; // RDRAND support - case NN_rdrand: // Read Random Number + case STARS_NN_rdrand: // Read Random Number SMP_fprintf(OutFile, "ERROR"); break; // new GPR instructions - case NN_adcx: // Unsigned Integer Addition of Two Operands with Carry Flag - case NN_adox: // Unsigned Integer Addition of Two Operands with Overflow Flag - case NN_andn: // Logical AND NOT - case NN_bextr: // Bit Field Extract - case NN_blsi: // Extract Lowest Set Isolated Bit - case NN_blsmsk: // Get Mask Up to Lowest Set Bit - case NN_blsr: // Reset Lowest Set Bit - case NN_bzhi: // Zero High Bits Starting with Specified Bit Position - case NN_clac: // Clear AC Flag in EFLAGS Register - case NN_mulx: // Unsigned Multiply Without Affecting Flags - case NN_pdep: // Parallel Bits Deposit - case NN_pext: // Parallel Bits Extract - case NN_rorx: // Rotate Right Logical Without Affecting Flags - case NN_sarx: // Shift Arithmetically Right Without Affecting Flags - case NN_shlx: // Shift Logically Left Without Affecting Flags - case NN_shrx: // Shift Logically Right Without Affecting Flags - case NN_stac: // Set AC Flag in EFLAGS Register - case NN_tzcnt: // Count the Number of Trailing Zero Bits - case NN_xsaveopt: // Save Processor Extended States Optimized - case NN_invpcid: // Invalidate Processor Context ID - case NN_rdseed: // Read Random Seed - case NN_rdfsbase: // Read FS Segment Base - case NN_rdgsbase: // Read GS Segment Base - case NN_wrfsbase: // Write FS Segment Base - case NN_wrgsbase: // Write GS Segment Base + case STARS_NN_adcx: // Unsigned Integer Addition of Two Operands with Carry Flag + case STARS_NN_adox: // Unsigned Integer Addition of Two Operands with Overflow Flag + case STARS_NN_andn: // Logical AND NOT + case STARS_NN_bextr: // Bit Field Extract + case STARS_NN_blsi: // Extract Lowest Set Isolated Bit + case STARS_NN_blsmsk: // Get Mask Up to Lowest Set Bit + case STARS_NN_blsr: // Reset Lowest Set Bit + case STARS_NN_bzhi: // Zero High Bits Starting with Specified Bit Position + case STARS_NN_clac: // Clear AC Flag in EFLAGS Register + case STARS_NN_mulx: // Unsigned Multiply Without Affecting Flags + case STARS_NN_pdep: // Parallel Bits Deposit + case STARS_NN_pext: // Parallel Bits Extract + case STARS_NN_rorx: // Rotate Right Logical Without Affecting Flags + case STARS_NN_sarx: // Shift Arithmetically Right Without Affecting Flags + case STARS_NN_shlx: // Shift Logically Left Without Affecting Flags + case STARS_NN_shrx: // Shift Logically Right Without Affecting Flags + case STARS_NN_stac: // Set AC Flag in EFLAGS Register + case STARS_NN_tzcnt: // Count the Number of Trailing Zero Bits + case STARS_NN_xsaveopt: // Save Processor Extended States Optimized + case STARS_NN_invpcid: // Invalidate Processor Context ID + case STARS_NN_rdseed: // Read Random Seed + case STARS_NN_rdfsbase: // Read FS Segment Base + case STARS_NN_rdgsbase: // Read GS Segment Base + case STARS_NN_wrfsbase: // Write FS Segment Base + case STARS_NN_wrgsbase: // Write GS Segment Base SMP_fprintf(OutFile, "ERROR"); break; // new AVX instructions - case NN_vaddpd: // Add Packed Double-Precision Floating-Point Values - case NN_vaddps: // Packed Single-FP Add - case NN_vaddsd: // Add Scalar Double-Precision Floating-Point Values - case NN_vaddss: // Scalar Single-FP Add - case NN_vaddsubpd: // Add /Sub packed DP FP numbers - case NN_vaddsubps: // Add /Sub packed SP FP numbers - case NN_vaesdec: // Perform One Round of an AES Decryption Flow - case NN_vaesdeclast: // Perform the Last Round of an AES Decryption Flow - case NN_vaesenc: // Perform One Round of an AES Encryption Flow - case NN_vaesenclast: // Perform the Last Round of an AES Encryption Flow - case NN_vaesimc: // Perform the AES InvMixColumn Transformation - case NN_vaeskeygenassist: // AES Round Key Generation Assist - case NN_vandnpd: // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values - case NN_vandnps: // Bitwise Logical And Not for Single-FP - case NN_vandpd: // Bitwise Logical AND of Packed Double-Precision Floating-Point Values - case NN_vandps: // Bitwise Logical And for Single-FP - case NN_vblendpd: // Blend Packed Double Precision Floating-Point Values - case NN_vblendps: // Blend Packed Single Precision Floating-Point Values - case NN_vblendvpd: // Variable Blend Packed Double Precision Floating-Point Values - case NN_vblendvps: // Variable Blend Packed Single Precision Floating-Point Values - case NN_vbroadcastf128: // Broadcast 128 Bits of Floating-Point Data - case NN_vbroadcasti128: // Broadcast 128 Bits of Integer Data - case NN_vbroadcastsd: // Broadcast Double-Precision Floating-Point Element - case NN_vbroadcastss: // Broadcast Single-Precision Floating-Point Element - case NN_vcmppd: // Compare Packed Double-Precision Floating-Point Values - case NN_vcmpps: // Packed Single-FP Compare - case NN_vcmpsd: // Compare Scalar Double-Precision Floating-Point Values - case NN_vcmpss: // Scalar Single-FP Compare - case NN_vcomisd: // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS - case NN_vcomiss: // Scalar Ordered Single-FP Compare and Set EFLAGS - case NN_vcvtdq2pd: // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values - case NN_vcvtdq2ps: // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values - case NN_vcvtpd2dq: // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers - case NN_vcvtpd2ps: // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values - case NN_vcvtph2ps: // Convert 16-bit FP Values to Single-Precision FP Values - case NN_vcvtps2dq: // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers - case NN_vcvtps2pd: // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values - case NN_vcvtps2ph: // Convert Single-Precision FP value to 16-bit FP value - case NN_vcvtsd2si: // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer - case NN_vcvtsd2ss: // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value - case NN_vcvtsi2sd: // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value - case NN_vcvtsi2ss: // Scalar signed INT32 to Single-FP conversion - case NN_vcvtss2sd: // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value - case NN_vcvtss2si: // Scalar Single-FP to signed INT32 conversion - case NN_vcvttpd2dq: // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers - case NN_vcvttps2dq: // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers - case NN_vcvttsd2si: // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer - case NN_vcvttss2si: // Scalar Single-FP to signed INT32 conversion (truncate) - case NN_vdivpd: // Divide Packed Double-Precision Floating-Point Values - case NN_vdivps: // Packed Single-FP Divide - case NN_vdivsd: // Divide Scalar Double-Precision Floating-Point Values - case NN_vdivss: // Scalar Single-FP Divide - case NN_vdppd: // Dot Product of Packed Double Precision Floating-Point Values - case NN_vdpps: // Dot Product of Packed Single Precision Floating-Point Values - case NN_vextractf128: // Extract Packed Floating-Point Values - case NN_vextracti128: // Extract Packed Integer Values - case NN_vextractps: // Extract Packed Floating-Point Values - case NN_vfmadd132pd: // Fused Multiply-Add of Packed Double-Precision Floating-Point Values - case NN_vfmadd132ps: // Fused Multiply-Add of Packed Single-Precision Floating-Point Values - case NN_vfmadd132sd: // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values - case NN_vfmadd132ss: // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values - case NN_vfmadd213pd: // Fused Multiply-Add of Packed Double-Precision Floating-Point Values - case NN_vfmadd213ps: // Fused Multiply-Add of Packed Single-Precision Floating-Point Values - case NN_vfmadd213sd: // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values - case NN_vfmadd213ss: // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values - case NN_vfmadd231pd: // Fused Multiply-Add of Packed Double-Precision Floating-Point Values - case NN_vfmadd231ps: // Fused Multiply-Add of Packed Single-Precision Floating-Point Values - case NN_vfmadd231sd: // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values - case NN_vfmadd231ss: // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values - case NN_vfmaddsub132pd: // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values - case NN_vfmaddsub132ps: // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values - case NN_vfmaddsub213pd: // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values - case NN_vfmaddsub213ps: // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values - case NN_vfmaddsub231pd: // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values - case NN_vfmaddsub231ps: // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values - case NN_vfmsub132pd: // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values - case NN_vfmsub132ps: // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values - case NN_vfmsub132sd: // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values - case NN_vfmsub132ss: // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values - case NN_vfmsub213pd: // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values - case NN_vfmsub213ps: // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values - case NN_vfmsub213sd: // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values - case NN_vfmsub213ss: // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values - case NN_vfmsub231pd: // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values - case NN_vfmsub231ps: // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values - case NN_vfmsub231sd: // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values - case NN_vfmsub231ss: // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values - case NN_vfmsubadd132pd: // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values - case NN_vfmsubadd132ps: // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values - case NN_vfmsubadd213pd: // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values - case NN_vfmsubadd213ps: // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values - case NN_vfmsubadd231pd: // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values - case NN_vfmsubadd231ps: // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values - case NN_vfnmadd132pd: // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values - case NN_vfnmadd132ps: // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values - case NN_vfnmadd132sd: // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values - case NN_vfnmadd132ss: // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values - case NN_vfnmadd213pd: // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values - case NN_vfnmadd213ps: // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values - case NN_vfnmadd213sd: // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values - case NN_vfnmadd213ss: // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values - case NN_vfnmadd231pd: // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values - case NN_vfnmadd231ps: // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values - case NN_vfnmadd231sd: // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values - case NN_vfnmadd231ss: // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values - case NN_vfnmsub132pd: // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values - case NN_vfnmsub132ps: // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values - case NN_vfnmsub132sd: // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values - case NN_vfnmsub132ss: // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values - case NN_vfnmsub213pd: // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values - case NN_vfnmsub213ps: // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values - case NN_vfnmsub213sd: // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values - case NN_vfnmsub213ss: // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values - case NN_vfnmsub231pd: // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values - case NN_vfnmsub231ps: // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values - case NN_vfnmsub231sd: // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values - case NN_vfnmsub231ss: // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values - case NN_vgatherdps: // Gather Packed SP FP Values Using Signed Dword Indices - case NN_vgatherdpd: // Gather Packed DP FP Values Using Signed Dword Indices - case NN_vgatherqps: // Gather Packed SP FP Values Using Signed Qword Indices - case NN_vgatherqpd: // Gather Packed DP FP Values Using Signed Qword Indices - case NN_vhaddpd: // Add horizontally packed DP FP numbers - case NN_vhaddps: // Add horizontally packed SP FP numbers - case NN_vhsubpd: // Sub horizontally packed DP FP numbers - case NN_vhsubps: // Sub horizontally packed SP FP numbers - case NN_vinsertf128: // Insert Packed Floating-Point Values - case NN_vinserti128: // Insert Packed Integer Values - case NN_vinsertps: // Insert Packed Single Precision Floating-Point Value - case NN_vlddqu: // Load Unaligned Packed Integer Values - case NN_vldmxcsr: // Load Streaming SIMD Extensions Technology Control/Status Register - case NN_vmaskmovdqu: // Store Selected Bytes of Double Quadword with NT Hint - case NN_vmaskmovpd: // Conditionally Load Packed Double-Precision Floating-Point Values - case NN_vmaskmovps: // Conditionally Load Packed Single-Precision Floating-Point Values - case NN_vmaxpd: // Return Maximum Packed Double-Precision Floating-Point Values - case NN_vmaxps: // Packed Single-FP Maximum - case NN_vmaxsd: // Return Maximum Scalar Double-Precision Floating-Point Value - case NN_vmaxss: // Scalar Single-FP Maximum - case NN_vminpd: // Return Minimum Packed Double-Precision Floating-Point Values - case NN_vminps: // Packed Single-FP Minimum - case NN_vminsd: // Return Minimum Scalar Double-Precision Floating-Point Value - case NN_vminss: // Scalar Single-FP Minimum - case NN_vmovapd: // Move Aligned Packed Double-Precision Floating-Point Values - case NN_vmovaps: // Move Aligned Four Packed Single-FP - case NN_vmovd: // Move 32 bits - case NN_vmovddup: // Move One Double-FP and Duplicate - case NN_vmovdqa: // Move Aligned Double Quadword - case NN_vmovdqu: // Move Unaligned Double Quadword - case NN_vmovhlps: // Move High to Low Packed Single-FP - case NN_vmovhpd: // Move High Packed Double-Precision Floating-Point Values - case NN_vmovhps: // Move High Packed Single-FP - case NN_vmovlhps: // Move Low to High Packed Single-FP - case NN_vmovlpd: // Move Low Packed Double-Precision Floating-Point Values - case NN_vmovlps: // Move Low Packed Single-FP - case NN_vmovmskpd: // Extract Packed Double-Precision Floating-Point Sign Mask - case NN_vmovmskps: // Move Mask to Register - case NN_vmovntdq: // Store Double Quadword Using Non-Temporal Hint - case NN_vmovntdqa: // Load Double Quadword Non-Temporal Aligned Hint - case NN_vmovntpd: // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint - case NN_vmovntps: // Move Aligned Four Packed Single-FP Non Temporal - case NN_vmovntsd: // Move Non-Temporal Scalar Double-Precision Floating-Point - case NN_vmovntss: // Move Non-Temporal Scalar Single-Precision Floating-Point - case NN_vmovq: // Move 64 bits - case NN_vmovsd: // Move Scalar Double-Precision Floating-Point Values - case NN_vmovshdup: // Move Packed Single-FP High and Duplicate - case NN_vmovsldup: // Move Packed Single-FP Low and Duplicate - case NN_vmovss: // Move Scalar Single-FP - case NN_vmovupd: // Move Unaligned Packed Double-Precision Floating-Point Values - case NN_vmovups: // Move Unaligned Four Packed Single-FP - case NN_vmpsadbw: // Compute Multiple Packed Sums of Absolute Difference - case NN_vmulpd: // Multiply Packed Double-Precision Floating-Point Values - case NN_vmulps: // Packed Single-FP Multiply - case NN_vmulsd: // Multiply Scalar Double-Precision Floating-Point Values - case NN_vmulss: // Scalar Single-FP Multiply - case NN_vorpd: // Bitwise Logical OR of Double-Precision Floating-Point Values - case NN_vorps: // Bitwise Logical OR for Single-FP Data - case NN_vpabsb: // Packed Absolute Value Byte - case NN_vpabsd: // Packed Absolute Value Doubleword - case NN_vpabsw: // Packed Absolute Value Word - case NN_vpackssdw: // Pack with Signed Saturation (Dword->Word) - case NN_vpacksswb: // Pack with Signed Saturation (Word->Byte) - case NN_vpackusdw: // Pack with Unsigned Saturation - case NN_vpackuswb: // Pack with Unsigned Saturation (Word->Byte) - case NN_vpaddb: // Packed Add Byte - case NN_vpaddd: // Packed Add Dword - case NN_vpaddq: // Add Packed Quadword Integers - case NN_vpaddsb: // Packed Add with Saturation (Byte) - case NN_vpaddsw: // Packed Add with Saturation (Word) - case NN_vpaddusb: // Packed Add Unsigned with Saturation (Byte) - case NN_vpaddusw: // Packed Add Unsigned with Saturation (Word) - case NN_vpaddw: // Packed Add Word - case NN_vpalignr: // Packed Align Right - case NN_vpand: // Bitwise Logical And - case NN_vpandn: // Bitwise Logical And Not - case NN_vpavgb: // Packed Average (Byte) - case NN_vpavgw: // Packed Average (Word) - case NN_vpblendd: // Blend Packed Dwords - case NN_vpblendvb: // Variable Blend Packed Bytes - case NN_vpblendw: // Blend Packed Words - case NN_vpbroadcastb: // Broadcast a Byte Integer - case NN_vpbroadcastd: // Broadcast a Dword Integer - case NN_vpbroadcastq: // Broadcast a Qword Integer - case NN_vpbroadcastw: // Broadcast a Word Integer - case NN_vpclmulqdq: // Carry-Less Multiplication Quadword - case NN_vpcmpeqb: // Packed Compare for Equal (Byte) - case NN_vpcmpeqd: // Packed Compare for Equal (Dword) - case NN_vpcmpeqq: // Compare Packed Qword Data for Equal - case NN_vpcmpeqw: // Packed Compare for Equal (Word) - case NN_vpcmpestri: // Packed Compare Explicit Length Strings: Return Index - case NN_vpcmpestrm: // Packed Compare Explicit Length Strings: Return Mask - case NN_vpcmpgtb: // Packed Compare for Greater Than (Byte) - case NN_vpcmpgtd: // Packed Compare for Greater Than (Dword) - case NN_vpcmpgtq: // Compare Packed Data for Greater Than - case NN_vpcmpgtw: // Packed Compare for Greater Than (Word) - case NN_vpcmpistri: // Packed Compare Implicit Length Strings: Return Index - case NN_vpcmpistrm: // Packed Compare Implicit Length Strings: Return Mask - case NN_vperm2f128: // Permute Floating-Point Values - case NN_vperm2i128: // Permute Integer Values - case NN_vpermd: // Full Doublewords Element Permutation - case NN_vpermilpd: // Permute Double-Precision Floating-Point Values - case NN_vpermilps: // Permute Single-Precision Floating-Point Values - case NN_vpermpd: // Permute Double-Precision Floating-Point Elements - case NN_vpermps: // Permute Single-Precision Floating-Point Elements - case NN_vpermq: // Qwords Element Permutation - case NN_vpextrb: // Extract Byte - case NN_vpextrd: // Extract Dword - case NN_vpextrq: // Extract Qword - case NN_vpextrw: // Extract Word - case NN_vpgatherdd: // Gather Packed Dword Values Using Signed Dword Indices - case NN_vpgatherdq: // Gather Packed Qword Values Using Signed Dword Indices - case NN_vpgatherqd: // Gather Packed Dword Values Using Signed Qword Indices - case NN_vpgatherqq: // Gather Packed Qword Values Using Signed Qword Indices - case NN_vphaddd: // Packed Horizontal Add Doubleword - case NN_vphaddsw: // Packed Horizontal Add and Saturate - case NN_vphaddw: // Packed Horizontal Add Word - case NN_vphminposuw: // Packed Horizontal Word Minimum - case NN_vphsubd: // Packed Horizontal Subtract Doubleword - case NN_vphsubsw: // Packed Horizontal Subtract and Saturate - case NN_vphsubw: // Packed Horizontal Subtract Word - case NN_vpinsrb: // Insert Byte - case NN_vpinsrd: // Insert Dword - case NN_vpinsrq: // Insert Qword - case NN_vpinsrw: // Insert Word - case NN_vpmaddubsw: // Multiply and Add Packed Signed and Unsigned Bytes - case NN_vpmaddwd: // Packed Multiply and Add - case NN_vpmaskmovd: // Conditionally Store Dword Values Using Mask - case NN_vpmaskmovq: // Conditionally Store Qword Values Using Mask - case NN_vpmaxsb: // Maximum of Packed Signed Byte Integers - case NN_vpmaxsd: // Maximum of Packed Signed Dword Integers - case NN_vpmaxsw: // Packed Signed Integer Word Maximum - case NN_vpmaxub: // Packed Unsigned Integer Byte Maximum - case NN_vpmaxud: // Maximum of Packed Unsigned Dword Integers - case NN_vpmaxuw: // Maximum of Packed Word Integers - case NN_vpminsb: // Minimum of Packed Signed Byte Integers - case NN_vpminsd: // Minimum of Packed Signed Dword Integers - case NN_vpminsw: // Packed Signed Integer Word Minimum - case NN_vpminub: // Packed Unsigned Integer Byte Minimum - case NN_vpminud: // Minimum of Packed Unsigned Dword Integers - case NN_vpminuw: // Minimum of Packed Word Integers - case NN_vpmovmskb: // Move Byte Mask to Integer - case NN_vpmovsxbd: // Packed Move with Sign Extend - case NN_vpmovsxbq: // Packed Move with Sign Extend - case NN_vpmovsxbw: // Packed Move with Sign Extend - case NN_vpmovsxdq: // Packed Move with Sign Extend - case NN_vpmovsxwd: // Packed Move with Sign Extend - case NN_vpmovsxwq: // Packed Move with Sign Extend - case NN_vpmovzxbd: // Packed Move with Zero Extend - case NN_vpmovzxbq: // Packed Move with Zero Extend - case NN_vpmovzxbw: // Packed Move with Zero Extend - case NN_vpmovzxdq: // Packed Move with Zero Extend - case NN_vpmovzxwd: // Packed Move with Zero Extend - case NN_vpmovzxwq: // Packed Move with Zero Extend - case NN_vpmuldq: // Multiply Packed Signed Dword Integers - case NN_vpmulhrsw: // Packed Multiply High with Round and Scale - case NN_vpmulhuw: // Packed Multiply High Unsigned - case NN_vpmulhw: // Packed Multiply High - case NN_vpmulld: // Multiply Packed Signed Dword Integers and Store Low Result - case NN_vpmullw: // Packed Multiply Low - case NN_vpmuludq: // Multiply Packed Unsigned Doubleword Integers - case NN_vpor: // Bitwise Logical Or - case NN_vpsadbw: // Packed Sum of Absolute Differences - case NN_vpshufb: // Packed Shuffle Bytes - case NN_vpshufd: // Shuffle Packed Doublewords - case NN_vpshufhw: // Shuffle Packed High Words - case NN_vpshuflw: // Shuffle Packed Low Words - case NN_vpsignb: // Packed SIGN Byte - case NN_vpsignd: // Packed SIGN Doubleword - case NN_vpsignw: // Packed SIGN Word - case NN_vpslld: // Packed Shift Left Logical (Dword) - case NN_vpslldq: // Shift Double Quadword Left Logical - case NN_vpsllq: // Packed Shift Left Logical (Qword) - case NN_vpsllvd: // Variable Bit Shift Left Logical (Dword) - case NN_vpsllvq: // Variable Bit Shift Left Logical (Qword) - case NN_vpsllw: // Packed Shift Left Logical (Word) - case NN_vpsrad: // Packed Shift Right Arithmetic (Dword) - case NN_vpsravd: // Variable Bit Shift Right Arithmetic - case NN_vpsraw: // Packed Shift Right Arithmetic (Word) - case NN_vpsrld: // Packed Shift Right Logical (Dword) - case NN_vpsrldq: // Shift Double Quadword Right Logical (Qword) - case NN_vpsrlq: // Packed Shift Right Logical (Qword) - case NN_vpsrlvd: // Variable Bit Shift Right Logical (Dword) - case NN_vpsrlvq: // Variable Bit Shift Right Logical (Qword) - case NN_vpsrlw: // Packed Shift Right Logical (Word) - case NN_vpsubb: // Packed Subtract Byte - case NN_vpsubd: // Packed Subtract Dword - case NN_vpsubq: // Subtract Packed Quadword Integers - case NN_vpsubsb: // Packed Subtract with Saturation (Byte) - case NN_vpsubsw: // Packed Subtract with Saturation (Word) - case NN_vpsubusb: // Packed Subtract Unsigned with Saturation (Byte) - case NN_vpsubusw: // Packed Subtract Unsigned with Saturation (Word) - case NN_vpsubw: // Packed Subtract Word - case NN_vptest: // Logical Compare - case NN_vpunpckhbw: // Unpack High Packed Data (Byte->Word) - case NN_vpunpckhdq: // Unpack High Packed Data (Dword->Qword) - case NN_vpunpckhqdq: // Unpack High Packed Data (Qword->Xmmword) - case NN_vpunpckhwd: // Unpack High Packed Data (Word->Dword) - case NN_vpunpcklbw: // Unpack Low Packed Data (Byte->Word) - case NN_vpunpckldq: // Unpack Low Packed Data (Dword->Qword) - case NN_vpunpcklqdq: // Unpack Low Packed Data (Qword->Xmmword) - case NN_vpunpcklwd: // Unpack Low Packed Data (Word->Dword) - case NN_vpxor: // Bitwise Logical Exclusive Or - case NN_vrcpps: // Packed Single-FP Reciprocal - case NN_vrcpss: // Scalar Single-FP Reciprocal - case NN_vroundpd: // Round Packed Double Precision Floating-Point Values - case NN_vroundps: // Round Packed Single Precision Floating-Point Values - case NN_vroundsd: // Round Scalar Double Precision Floating-Point Values - case NN_vroundss: // Round Scalar Single Precision Floating-Point Values - case NN_vrsqrtps: // Packed Single-FP Square Root Reciprocal - case NN_vrsqrtss: // Scalar Single-FP Square Root Reciprocal - case NN_vshufpd: // Shuffle Packed Double-Precision Floating-Point Values - case NN_vshufps: // Shuffle Single-FP - case NN_vsqrtpd: // Compute Square Roots of Packed Double-Precision Floating-Point Values - case NN_vsqrtps: // Packed Single-FP Square Root - case NN_vsqrtsd: // Compute Square Rootof Scalar Double-Precision Floating-Point Value - case NN_vsqrtss: // Scalar Single-FP Square Root - case NN_vstmxcsr: // Store Streaming SIMD Extensions Technology Control/Status Register - case NN_vsubpd: // Subtract Packed Double-Precision Floating-Point Values - case NN_vsubps: // Packed Single-FP Subtract - case NN_vsubsd: // Subtract Scalar Double-Precision Floating-Point Values - case NN_vsubss: // Scalar Single-FP Subtract - case NN_vtestpd: // Packed Double-Precision Floating-Point Bit Test - case NN_vtestps: // Packed Single-Precision Floating-Point Bit Test - case NN_vucomisd: // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS - case NN_vucomiss: // Scalar Unordered Single-FP Compare and Set EFLAGS - case NN_vunpckhpd: // Unpack and Interleave High Packed Double-Precision Floating-Point Values - case NN_vunpckhps: // Unpack High Packed Single-FP Data - case NN_vunpcklpd: // Unpack and Interleave Low Packed Double-Precision Floating-Point Values - case NN_vunpcklps: // Unpack Low Packed Single-FP Data - case NN_vxorpd: // Bitwise Logical OR of Double-Precision Floating-Point Values - case NN_vxorps: // Bitwise Logical XOR for Single-FP Data - case NN_vzeroall: // Zero All YMM Registers - case NN_vzeroupper: // Zero Upper Bits of YMM Registers + case STARS_NN_vaddpd: // Add Packed Double-Precision Floating-Point Values + case STARS_NN_vaddps: // Packed Single-FP Add + case STARS_NN_vaddsd: // Add Scalar Double-Precision Floating-Point Values + case STARS_NN_vaddss: // Scalar Single-FP Add + case STARS_NN_vaddsubpd: // Add /Sub packed DP FP numbers + case STARS_NN_vaddsubps: // Add /Sub packed SP FP numbers + case STARS_NN_vaesdec: // Perform One Round of an AES Decryption Flow + case STARS_NN_vaesdeclast: // Perform the Last Round of an AES Decryption Flow + case STARS_NN_vaesenc: // Perform One Round of an AES Encryption Flow + case STARS_NN_vaesenclast: // Perform the Last Round of an AES Encryption Flow + case STARS_NN_vaesimc: // Perform the AES InvMixColumn Transformation + case STARS_NN_vaeskeygenassist: // AES Round Key Generation Assist + case STARS_NN_vandnpd: // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values + case STARS_NN_vandnps: // Bitwise Logical And Not for Single-FP + case STARS_NN_vandpd: // Bitwise Logical AND of Packed Double-Precision Floating-Point Values + case STARS_NN_vandps: // Bitwise Logical And for Single-FP + case STARS_NN_vblendpd: // Blend Packed Double Precision Floating-Point Values + case STARS_NN_vblendps: // Blend Packed Single Precision Floating-Point Values + case STARS_NN_vblendvpd: // Variable Blend Packed Double Precision Floating-Point Values + case STARS_NN_vblendvps: // Variable Blend Packed Single Precision Floating-Point Values + case STARS_NN_vbroadcastf128: // Broadcast 128 Bits of Floating-Point Data + case STARS_NN_vbroadcasti128: // Broadcast 128 Bits of Integer Data + case STARS_NN_vbroadcastsd: // Broadcast Double-Precision Floating-Point Element + case STARS_NN_vbroadcastss: // Broadcast Single-Precision Floating-Point Element + case STARS_NN_vcmppd: // Compare Packed Double-Precision Floating-Point Values + case STARS_NN_vcmpps: // Packed Single-FP Compare + case STARS_NN_vcmpsd: // Compare Scalar Double-Precision Floating-Point Values + case STARS_NN_vcmpss: // Scalar Single-FP Compare + case STARS_NN_vcomisd: // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + case STARS_NN_vcomiss: // Scalar Ordered Single-FP Compare and Set EFLAGS + case STARS_NN_vcvtdq2pd: // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values + case STARS_NN_vcvtdq2ps: // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + case STARS_NN_vcvtpd2dq: // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_vcvtpd2ps: // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values + case STARS_NN_vcvtph2ps: // Convert 16-bit FP Values to Single-Precision FP Values + case STARS_NN_vcvtps2dq: // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_vcvtps2pd: // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values + case STARS_NN_vcvtps2ph: // Convert Single-Precision FP value to 16-bit FP value + case STARS_NN_vcvtsd2si: // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer + case STARS_NN_vcvtsd2ss: // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value + case STARS_NN_vcvtsi2sd: // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value + case STARS_NN_vcvtsi2ss: // Scalar signed INT32 to Single-FP conversion + case STARS_NN_vcvtss2sd: // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value + case STARS_NN_vcvtss2si: // Scalar Single-FP to signed INT32 conversion + case STARS_NN_vcvttpd2dq: // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_vcvttps2dq: // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_vcvttsd2si: // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer + case STARS_NN_vcvttss2si: // Scalar Single-FP to signed INT32 conversion (truncate) + case STARS_NN_vdivpd: // Divide Packed Double-Precision Floating-Point Values + case STARS_NN_vdivps: // Packed Single-FP Divide + case STARS_NN_vdivsd: // Divide Scalar Double-Precision Floating-Point Values + case STARS_NN_vdivss: // Scalar Single-FP Divide + case STARS_NN_vdppd: // Dot Product of Packed Double Precision Floating-Point Values + case STARS_NN_vdpps: // Dot Product of Packed Single Precision Floating-Point Values + case STARS_NN_vextractf128: // Extract Packed Floating-Point Values + case STARS_NN_vextracti128: // Extract Packed Integer Values + case STARS_NN_vextractps: // Extract Packed Floating-Point Values + case STARS_NN_vfmadd132pd: // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmadd132ps: // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmadd132sd: // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfmadd132ss: // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfmadd213pd: // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmadd213ps: // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmadd213sd: // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfmadd213ss: // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfmadd231pd: // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmadd231ps: // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmadd231sd: // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfmadd231ss: // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfmaddsub132pd: // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmaddsub132ps: // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmaddsub213pd: // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmaddsub213ps: // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmaddsub231pd: // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmaddsub231ps: // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmsub132pd: // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmsub132ps: // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmsub132sd: // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfmsub132ss: // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfmsub213pd: // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmsub213ps: // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmsub213sd: // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfmsub213ss: // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfmsub231pd: // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmsub231ps: // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmsub231sd: // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfmsub231ss: // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfmsubadd132pd: // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmsubadd132ps: // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmsubadd213pd: // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmsubadd213ps: // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmsubadd231pd: // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmsubadd231ps: // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfnmadd132pd: // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfnmadd132ps: // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfnmadd132sd: // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfnmadd132ss: // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfnmadd213pd: // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfnmadd213ps: // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfnmadd213sd: // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfnmadd213ss: // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfnmadd231pd: // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfnmadd231ps: // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfnmadd231sd: // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfnmadd231ss: // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfnmsub132pd: // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfnmsub132ps: // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfnmsub132sd: // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfnmsub132ss: // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfnmsub213pd: // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfnmsub213ps: // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfnmsub213sd: // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfnmsub213ss: // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfnmsub231pd: // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfnmsub231ps: // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfnmsub231sd: // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfnmsub231ss: // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + case STARS_NN_vgatherdps: // Gather Packed SP FP Values Using Signed Dword Indices + case STARS_NN_vgatherdpd: // Gather Packed DP FP Values Using Signed Dword Indices + case STARS_NN_vgatherqps: // Gather Packed SP FP Values Using Signed Qword Indices + case STARS_NN_vgatherqpd: // Gather Packed DP FP Values Using Signed Qword Indices + case STARS_NN_vhaddpd: // Add horizontally packed DP FP numbers + case STARS_NN_vhaddps: // Add horizontally packed SP FP numbers + case STARS_NN_vhsubpd: // Sub horizontally packed DP FP numbers + case STARS_NN_vhsubps: // Sub horizontally packed SP FP numbers + case STARS_NN_vinsertf128: // Insert Packed Floating-Point Values + case STARS_NN_vinserti128: // Insert Packed Integer Values + case STARS_NN_vinsertps: // Insert Packed Single Precision Floating-Point Value + case STARS_NN_vlddqu: // Load Unaligned Packed Integer Values + case STARS_NN_vldmxcsr: // Load Streaming SIMD Extensions Technology Control/Status Register + case STARS_NN_vmaskmovdqu: // Store Selected Bytes of Double Quadword with NT Hint + case STARS_NN_vmaskmovpd: // Conditionally Load Packed Double-Precision Floating-Point Values + case STARS_NN_vmaskmovps: // Conditionally Load Packed Single-Precision Floating-Point Values + case STARS_NN_vmaxpd: // Return Maximum Packed Double-Precision Floating-Point Values + case STARS_NN_vmaxps: // Packed Single-FP Maximum + case STARS_NN_vmaxsd: // Return Maximum Scalar Double-Precision Floating-Point Value + case STARS_NN_vmaxss: // Scalar Single-FP Maximum + case STARS_NN_vminpd: // Return Minimum Packed Double-Precision Floating-Point Values + case STARS_NN_vminps: // Packed Single-FP Minimum + case STARS_NN_vminsd: // Return Minimum Scalar Double-Precision Floating-Point Value + case STARS_NN_vminss: // Scalar Single-FP Minimum + case STARS_NN_vmovapd: // Move Aligned Packed Double-Precision Floating-Point Values + case STARS_NN_vmovaps: // Move Aligned Four Packed Single-FP + case STARS_NN_vmovd: // Move 32 bits + case STARS_NN_vmovddup: // Move One Double-FP and Duplicate + case STARS_NN_vmovdqa: // Move Aligned Double Quadword + case STARS_NN_vmovdqu: // Move Unaligned Double Quadword + case STARS_NN_vmovhlps: // Move High to Low Packed Single-FP + case STARS_NN_vmovhpd: // Move High Packed Double-Precision Floating-Point Values + case STARS_NN_vmovhps: // Move High Packed Single-FP + case STARS_NN_vmovlhps: // Move Low to High Packed Single-FP + case STARS_NN_vmovlpd: // Move Low Packed Double-Precision Floating-Point Values + case STARS_NN_vmovlps: // Move Low Packed Single-FP + case STARS_NN_vmovmskpd: // Extract Packed Double-Precision Floating-Point Sign Mask + case STARS_NN_vmovmskps: // Move Mask to Register + case STARS_NN_vmovntdq: // Store Double Quadword Using Non-Temporal Hint + case STARS_NN_vmovntdqa: // Load Double Quadword Non-Temporal Aligned Hint + case STARS_NN_vmovntpd: // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint + case STARS_NN_vmovntps: // Move Aligned Four Packed Single-FP Non Temporal + case STARS_NN_vmovntsd: // Move Non-Temporal Scalar Double-Precision Floating-Point + case STARS_NN_vmovntss: // Move Non-Temporal Scalar Single-Precision Floating-Point + case STARS_NN_vmovq: // Move 64 bits + case STARS_NN_vmovsd: // Move Scalar Double-Precision Floating-Point Values + case STARS_NN_vmovshdup: // Move Packed Single-FP High and Duplicate + case STARS_NN_vmovsldup: // Move Packed Single-FP Low and Duplicate + case STARS_NN_vmovss: // Move Scalar Single-FP + case STARS_NN_vmovupd: // Move Unaligned Packed Double-Precision Floating-Point Values + case STARS_NN_vmovups: // Move Unaligned Four Packed Single-FP + case STARS_NN_vmpsadbw: // Compute Multiple Packed Sums of Absolute Difference + case STARS_NN_vmulpd: // Multiply Packed Double-Precision Floating-Point Values + case STARS_NN_vmulps: // Packed Single-FP Multiply + case STARS_NN_vmulsd: // Multiply Scalar Double-Precision Floating-Point Values + case STARS_NN_vmulss: // Scalar Single-FP Multiply + case STARS_NN_vorpd: // Bitwise Logical OR of Double-Precision Floating-Point Values + case STARS_NN_vorps: // Bitwise Logical OR for Single-FP Data + case STARS_NN_vpabsb: // Packed Absolute Value Byte + case STARS_NN_vpabsd: // Packed Absolute Value Doubleword + case STARS_NN_vpabsw: // Packed Absolute Value Word + case STARS_NN_vpackssdw: // Pack with Signed Saturation (Dword->Word) + case STARS_NN_vpacksswb: // Pack with Signed Saturation (Word->Byte) + case STARS_NN_vpackusdw: // Pack with Unsigned Saturation + case STARS_NN_vpackuswb: // Pack with Unsigned Saturation (Word->Byte) + case STARS_NN_vpaddb: // Packed Add Byte + case STARS_NN_vpaddd: // Packed Add Dword + case STARS_NN_vpaddq: // Add Packed Quadword Integers + case STARS_NN_vpaddsb: // Packed Add with Saturation (Byte) + case STARS_NN_vpaddsw: // Packed Add with Saturation (Word) + case STARS_NN_vpaddusb: // Packed Add Unsigned with Saturation (Byte) + case STARS_NN_vpaddusw: // Packed Add Unsigned with Saturation (Word) + case STARS_NN_vpaddw: // Packed Add Word + case STARS_NN_vpalignr: // Packed Align Right + case STARS_NN_vpand: // Bitwise Logical And + case STARS_NN_vpandn: // Bitwise Logical And Not + case STARS_NN_vpavgb: // Packed Average (Byte) + case STARS_NN_vpavgw: // Packed Average (Word) + case STARS_NN_vpblendd: // Blend Packed Dwords + case STARS_NN_vpblendvb: // Variable Blend Packed Bytes + case STARS_NN_vpblendw: // Blend Packed Words + case STARS_NN_vpbroadcastb: // Broadcast a Byte Integer + case STARS_NN_vpbroadcastd: // Broadcast a Dword Integer + case STARS_NN_vpbroadcastq: // Broadcast a Qword Integer + case STARS_NN_vpbroadcastw: // Broadcast a Word Integer + case STARS_NN_vpclmulqdq: // Carry-Less Multiplication Quadword + case STARS_NN_vpcmpeqb: // Packed Compare for Equal (Byte) + case STARS_NN_vpcmpeqd: // Packed Compare for Equal (Dword) + case STARS_NN_vpcmpeqq: // Compare Packed Qword Data for Equal + case STARS_NN_vpcmpeqw: // Packed Compare for Equal (Word) + case STARS_NN_vpcmpestri: // Packed Compare Explicit Length Strings: Return Index + case STARS_NN_vpcmpestrm: // Packed Compare Explicit Length Strings: Return Mask + case STARS_NN_vpcmpgtb: // Packed Compare for Greater Than (Byte) + case STARS_NN_vpcmpgtd: // Packed Compare for Greater Than (Dword) + case STARS_NN_vpcmpgtq: // Compare Packed Data for Greater Than + case STARS_NN_vpcmpgtw: // Packed Compare for Greater Than (Word) + case STARS_NN_vpcmpistri: // Packed Compare Implicit Length Strings: Return Index + case STARS_NN_vpcmpistrm: // Packed Compare Implicit Length Strings: Return Mask + case STARS_NN_vperm2f128: // Permute Floating-Point Values + case STARS_NN_vperm2i128: // Permute Integer Values + case STARS_NN_vpermd: // Full Doublewords Element Permutation + case STARS_NN_vpermilpd: // Permute Double-Precision Floating-Point Values + case STARS_NN_vpermilps: // Permute Single-Precision Floating-Point Values + case STARS_NN_vpermpd: // Permute Double-Precision Floating-Point Elements + case STARS_NN_vpermps: // Permute Single-Precision Floating-Point Elements + case STARS_NN_vpermq: // Qwords Element Permutation + case STARS_NN_vpextrb: // Extract Byte + case STARS_NN_vpextrd: // Extract Dword + case STARS_NN_vpextrq: // Extract Qword + case STARS_NN_vpextrw: // Extract Word + case STARS_NN_vpgatherdd: // Gather Packed Dword Values Using Signed Dword Indices + case STARS_NN_vpgatherdq: // Gather Packed Qword Values Using Signed Dword Indices + case STARS_NN_vpgatherqd: // Gather Packed Dword Values Using Signed Qword Indices + case STARS_NN_vpgatherqq: // Gather Packed Qword Values Using Signed Qword Indices + case STARS_NN_vphaddd: // Packed Horizontal Add Doubleword + case STARS_NN_vphaddsw: // Packed Horizontal Add and Saturate + case STARS_NN_vphaddw: // Packed Horizontal Add Word + case STARS_NN_vphminposuw: // Packed Horizontal Word Minimum + case STARS_NN_vphsubd: // Packed Horizontal Subtract Doubleword + case STARS_NN_vphsubsw: // Packed Horizontal Subtract and Saturate + case STARS_NN_vphsubw: // Packed Horizontal Subtract Word + case STARS_NN_vpinsrb: // Insert Byte + case STARS_NN_vpinsrd: // Insert Dword + case STARS_NN_vpinsrq: // Insert Qword + case STARS_NN_vpinsrw: // Insert Word + case STARS_NN_vpmaddubsw: // Multiply and Add Packed Signed and Unsigned Bytes + case STARS_NN_vpmaddwd: // Packed Multiply and Add + case STARS_NN_vpmaskmovd: // Conditionally Store Dword Values Using Mask + case STARS_NN_vpmaskmovq: // Conditionally Store Qword Values Using Mask + case STARS_NN_vpmaxsb: // Maximum of Packed Signed Byte Integers + case STARS_NN_vpmaxsd: // Maximum of Packed Signed Dword Integers + case STARS_NN_vpmaxsw: // Packed Signed Integer Word Maximum + case STARS_NN_vpmaxub: // Packed Unsigned Integer Byte Maximum + case STARS_NN_vpmaxud: // Maximum of Packed Unsigned Dword Integers + case STARS_NN_vpmaxuw: // Maximum of Packed Word Integers + case STARS_NN_vpminsb: // Minimum of Packed Signed Byte Integers + case STARS_NN_vpminsd: // Minimum of Packed Signed Dword Integers + case STARS_NN_vpminsw: // Packed Signed Integer Word Minimum + case STARS_NN_vpminub: // Packed Unsigned Integer Byte Minimum + case STARS_NN_vpminud: // Minimum of Packed Unsigned Dword Integers + case STARS_NN_vpminuw: // Minimum of Packed Word Integers + case STARS_NN_vpmovmskb: // Move Byte Mask to Integer + case STARS_NN_vpmovsxbd: // Packed Move with Sign Extend + case STARS_NN_vpmovsxbq: // Packed Move with Sign Extend + case STARS_NN_vpmovsxbw: // Packed Move with Sign Extend + case STARS_NN_vpmovsxdq: // Packed Move with Sign Extend + case STARS_NN_vpmovsxwd: // Packed Move with Sign Extend + case STARS_NN_vpmovsxwq: // Packed Move with Sign Extend + case STARS_NN_vpmovzxbd: // Packed Move with Zero Extend + case STARS_NN_vpmovzxbq: // Packed Move with Zero Extend + case STARS_NN_vpmovzxbw: // Packed Move with Zero Extend + case STARS_NN_vpmovzxdq: // Packed Move with Zero Extend + case STARS_NN_vpmovzxwd: // Packed Move with Zero Extend + case STARS_NN_vpmovzxwq: // Packed Move with Zero Extend + case STARS_NN_vpmuldq: // Multiply Packed Signed Dword Integers + case STARS_NN_vpmulhrsw: // Packed Multiply High with Round and Scale + case STARS_NN_vpmulhuw: // Packed Multiply High Unsigned + case STARS_NN_vpmulhw: // Packed Multiply High + case STARS_NN_vpmulld: // Multiply Packed Signed Dword Integers and Store Low Result + case STARS_NN_vpmullw: // Packed Multiply Low + case STARS_NN_vpmuludq: // Multiply Packed Unsigned Doubleword Integers + case STARS_NN_vpor: // Bitwise Logical Or + case STARS_NN_vpsadbw: // Packed Sum of Absolute Differences + case STARS_NN_vpshufb: // Packed Shuffle Bytes + case STARS_NN_vpshufd: // Shuffle Packed Doublewords + case STARS_NN_vpshufhw: // Shuffle Packed High Words + case STARS_NN_vpshuflw: // Shuffle Packed Low Words + case STARS_NN_vpsignb: // Packed SIGN Byte + case STARS_NN_vpsignd: // Packed SIGN Doubleword + case STARS_NN_vpsignw: // Packed SIGN Word + case STARS_NN_vpslld: // Packed Shift Left Logical (Dword) + case STARS_NN_vpslldq: // Shift Double Quadword Left Logical + case STARS_NN_vpsllq: // Packed Shift Left Logical (Qword) + case STARS_NN_vpsllvd: // Variable Bit Shift Left Logical (Dword) + case STARS_NN_vpsllvq: // Variable Bit Shift Left Logical (Qword) + case STARS_NN_vpsllw: // Packed Shift Left Logical (Word) + case STARS_NN_vpsrad: // Packed Shift Right Arithmetic (Dword) + case STARS_NN_vpsravd: // Variable Bit Shift Right Arithmetic + case STARS_NN_vpsraw: // Packed Shift Right Arithmetic (Word) + case STARS_NN_vpsrld: // Packed Shift Right Logical (Dword) + case STARS_NN_vpsrldq: // Shift Double Quadword Right Logical (Qword) + case STARS_NN_vpsrlq: // Packed Shift Right Logical (Qword) + case STARS_NN_vpsrlvd: // Variable Bit Shift Right Logical (Dword) + case STARS_NN_vpsrlvq: // Variable Bit Shift Right Logical (Qword) + case STARS_NN_vpsrlw: // Packed Shift Right Logical (Word) + case STARS_NN_vpsubb: // Packed Subtract Byte + case STARS_NN_vpsubd: // Packed Subtract Dword + case STARS_NN_vpsubq: // Subtract Packed Quadword Integers + case STARS_NN_vpsubsb: // Packed Subtract with Saturation (Byte) + case STARS_NN_vpsubsw: // Packed Subtract with Saturation (Word) + case STARS_NN_vpsubusb: // Packed Subtract Unsigned with Saturation (Byte) + case STARS_NN_vpsubusw: // Packed Subtract Unsigned with Saturation (Word) + case STARS_NN_vpsubw: // Packed Subtract Word + case STARS_NN_vptest: // Logical Compare + case STARS_NN_vpunpckhbw: // Unpack High Packed Data (Byte->Word) + case STARS_NN_vpunpckhdq: // Unpack High Packed Data (Dword->Qword) + case STARS_NN_vpunpckhqdq: // Unpack High Packed Data (Qword->Xmmword) + case STARS_NN_vpunpckhwd: // Unpack High Packed Data (Word->Dword) + case STARS_NN_vpunpcklbw: // Unpack Low Packed Data (Byte->Word) + case STARS_NN_vpunpckldq: // Unpack Low Packed Data (Dword->Qword) + case STARS_NN_vpunpcklqdq: // Unpack Low Packed Data (Qword->Xmmword) + case STARS_NN_vpunpcklwd: // Unpack Low Packed Data (Word->Dword) + case STARS_NN_vpxor: // Bitwise Logical Exclusive Or + case STARS_NN_vrcpps: // Packed Single-FP Reciprocal + case STARS_NN_vrcpss: // Scalar Single-FP Reciprocal + case STARS_NN_vroundpd: // Round Packed Double Precision Floating-Point Values + case STARS_NN_vroundps: // Round Packed Single Precision Floating-Point Values + case STARS_NN_vroundsd: // Round Scalar Double Precision Floating-Point Values + case STARS_NN_vroundss: // Round Scalar Single Precision Floating-Point Values + case STARS_NN_vrsqrtps: // Packed Single-FP Square Root Reciprocal + case STARS_NN_vrsqrtss: // Scalar Single-FP Square Root Reciprocal + case STARS_NN_vshufpd: // Shuffle Packed Double-Precision Floating-Point Values + case STARS_NN_vshufps: // Shuffle Single-FP + case STARS_NN_vsqrtpd: // Compute Square Roots of Packed Double-Precision Floating-Point Values + case STARS_NN_vsqrtps: // Packed Single-FP Square Root + case STARS_NN_vsqrtsd: // Compute Square Rootof Scalar Double-Precision Floating-Point Value + case STARS_NN_vsqrtss: // Scalar Single-FP Square Root + case STARS_NN_vstmxcsr: // Store Streaming SIMD Extensions Technology Control/Status Register + case STARS_NN_vsubpd: // Subtract Packed Double-Precision Floating-Point Values + case STARS_NN_vsubps: // Packed Single-FP Subtract + case STARS_NN_vsubsd: // Subtract Scalar Double-Precision Floating-Point Values + case STARS_NN_vsubss: // Scalar Single-FP Subtract + case STARS_NN_vtestpd: // Packed Double-Precision Floating-Point Bit Test + case STARS_NN_vtestps: // Packed Single-Precision Floating-Point Bit Test + case STARS_NN_vucomisd: // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + case STARS_NN_vucomiss: // Scalar Unordered Single-FP Compare and Set EFLAGS + case STARS_NN_vunpckhpd: // Unpack and Interleave High Packed Double-Precision Floating-Point Values + case STARS_NN_vunpckhps: // Unpack High Packed Single-FP Data + case STARS_NN_vunpcklpd: // Unpack and Interleave Low Packed Double-Precision Floating-Point Values + case STARS_NN_vunpcklps: // Unpack Low Packed Single-FP Data + case STARS_NN_vxorpd: // Bitwise Logical OR of Double-Precision Floating-Point Values + case STARS_NN_vxorps: // Bitwise Logical XOR for Single-FP Data + case STARS_NN_vzeroall: // Zero All YMM Registers + case STARS_NN_vzeroupper: // Zero Upper Bits of YMM Registers SMP_fprintf(OutFile, "ERROR"); break; // Transactional Synchronization Extensions - case NN_xabort: // Transaction Abort - case NN_xbegin: // Transaction Begin - case NN_xend: // Transaction End - case NN_xtest: // Test If In Transactional Execution + case STARS_NN_xabort: // Transaction Abort + case STARS_NN_xbegin: // Transaction Begin + case STARS_NN_xend: // Transaction End + case STARS_NN_xtest: // Test If In Transactional Execution SMP_fprintf(OutFile, "ERROR"); break; // Virtual PC synthetic instructions - case NN_vmgetinfo: // Virtual PC - Get VM Information - case NN_vmsetinfo: // Virtual PC - Set VM Information - case NN_vmdxdsbl: // Virtual PC - Disable Direct Execution - case NN_vmdxenbl: // Virtual PC - Enable Direct Execution - case NN_vmcpuid: // Virtual PC - Virtualized CPU Information - case NN_vmhlt: // Virtual PC - Halt - case NN_vmsplaf: // Virtual PC - Spin Lock Acquisition Failed - case NN_vmpushfd: // Virtual PC - Push virtualized flags register - case NN_vmpopfd: // Virtual PC - Pop virtualized flags register - case NN_vmcli: // Virtual PC - Clear Interrupt Flag - case NN_vmsti: // Virtual PC - Set Interrupt Flag - case NN_vmiretd: // Virtual PC - Return From Interrupt - case NN_vmsgdt: // Virtual PC - Store Global Descriptor Table - case NN_vmsidt: // Virtual PC - Store Interrupt Descriptor Table - case NN_vmsldt: // Virtual PC - Store Local Descriptor Table - case NN_vmstr: // Virtual PC - Store Task Register - case NN_vmsdte: // Virtual PC - Store to Descriptor Table Entry - case NN_vpcext: // Virtual PC - ISA extension + case STARS_NN_vmgetinfo: // Virtual PC - Get VM Information + case STARS_NN_vmsetinfo: // Virtual PC - Set VM Information + case STARS_NN_vmdxdsbl: // Virtual PC - Disable Direct Execution + case STARS_NN_vmdxenbl: // Virtual PC - Enable Direct Execution + case STARS_NN_vmcpuid: // Virtual PC - Virtualized CPU Information + case STARS_NN_vmhlt: // Virtual PC - Halt + case STARS_NN_vmsplaf: // Virtual PC - Spin Lock Acquisition Failed + case STARS_NN_vmpushfd: // Virtual PC - Push virtualized flags register + case STARS_NN_vmpopfd: // Virtual PC - Pop virtualized flags register + case STARS_NN_vmcli: // Virtual PC - Clear Interrupt Flag + case STARS_NN_vmsti: // Virtual PC - Set Interrupt Flag + case STARS_NN_vmiretd: // Virtual PC - Return From Interrupt + case STARS_NN_vmsgdt: // Virtual PC - Store Global Descriptor Table + case STARS_NN_vmsidt: // Virtual PC - Store Interrupt Descriptor Table + case STARS_NN_vmsldt: // Virtual PC - Store Local Descriptor Table + case STARS_NN_vmstr: // Virtual PC - Store Task Register + case STARS_NN_vmsdte: // Virtual PC - Store to Descriptor Table Entry + case STARS_NN_vpcext: // Virtual PC - ISA extension SMP_fprintf(OutFile, "ERROR"); break; - case NN_last: + case STARS_NN_last: SMP_fprintf(OutFile, "ERROR"); break; @@ -2615,7 +2521,7 @@ void PrintOpcode(uint16 opcode, FILE *OutFile) { // MACHINE DEPENDENT: Is operand type a known type that we want to analyze? bool MDKnownOperandType(STARSOpndTypePtr TempOp) { - bool GoodOpType = (nullptr != TempOp) && ((TempOp->GetOpType() >= o_reg) && (TempOp->GetOpType() <= o_ymmreg)); + bool GoodOpType = (nullptr != TempOp) && TempOp->MDIsKnownOpType(); #if SMP_DEBUG_OPERAND_TYPES if (!GoodOpType && (! TempOp->IsVoidOp())) { SMP_msg("WARNING: Operand type %d \n", TempOp->GetOpType()); @@ -2683,7 +2589,7 @@ DisAsmString::DisAsmString(void) { return; } -char *DisAsmString::GetDisAsm(ea_t InstAddr, bool MarkerInst) { +char *DisAsmString::GetDisAsm(STARS_ea_t InstAddr, bool MarkerInst) { if (InstAddr != this->CurrAddr) { this->CurrAddr = InstAddr; if (MarkerInst) { @@ -2710,7 +2616,7 @@ char *DisAsmString::GetDisAsm(ea_t InstAddr, bool MarkerInst) { // Set the disasm text for the SSA marker instructions, which have no IDA Pro disasm because // they are pseudo-instructions that we add at the top of each function to hold LiveIn name info. -void DisAsmString::SetMarkerInstText(ea_t InstAddr) { +void DisAsmString::SetMarkerInstText(STARS_ea_t InstAddr) { if (InstAddr != this->CurrAddr) { this->CurrAddr = InstAddr; SMP_strncpy(this->CachedDisAsm, "\tfnop\t; Top of function SSA marker for SMP", @@ -2720,6 +2626,8 @@ void DisAsmString::SetMarkerInstText(ea_t InstAddr) { return; } // end of DisAsmString::SetMarkerInstText() +DisAsmString DisAsmText; + // ***************************************************************** // Class DefOrUse // ***************************************************************** @@ -3187,7 +3095,7 @@ SMPOperandType SMPPhiFunction::ConditionalMeetType(SMPBasicBlock *CurrBlock) con bool FoundNEGATEDPTR = false; // any USE type NEGATEDPTR? bool ProfilerDerived = false; // was any USE type Profiler-derived? list<size_t> ZeroConstIndices; - ea_t BlockStartAddr = CurrBlock->GetFirstAddr(); // for debugging + STARS_ea_t BlockStartAddr = CurrBlock->GetFirstAddr(); // for debugging STARSOpndTypePtr PhiOp = this->GetAnyOp(); for (size_t index = 0; index < this->GetPhiListSize(); ++index) { @@ -3199,7 +3107,7 @@ SMPOperandType SMPPhiFunction::ConditionalMeetType(SMPBasicBlock *CurrBlock) con int UseSSANum = this->GetUseSSANum(index); bool CurrentUseZeroCase = false; if (MDIsDataFlowOpnd(PhiOp, false)) { - ea_t DefAddr = CurrBlock->GetFunc()->GetGlobalDefAddr(PhiOp, UseSSANum); + STARS_ea_t DefAddr = CurrBlock->GetFunc()->GetGlobalDefAddr(PhiOp, UseSSANum); // Handle simple case: DEF is in an instruction. if ((BADADDR != DefAddr) && (DefAddr < STARS_PSEUDO_ID_MIN)) { SMPInstr *DefInst = CurrBlock->GetFunc()->GetInstFromAddr(DefAddr); @@ -3276,7 +3184,7 @@ SMPOperandType SMPPhiFunction::ConditionalMeetType(SMPBasicBlock *CurrBlock) con do { size_t ZeroConstIndex = ZeroConstIndices.front(); int UseSSANum = this->GetUseSSANum(ZeroConstIndex); - ea_t DefAddr = CurrBlock->GetFunc()->GetGlobalDefAddr(PhiOp, UseSSANum); + STARS_ea_t DefAddr = CurrBlock->GetFunc()->GetGlobalDefAddr(PhiOp, UseSSANum); // Handle simple case: DEF is in an instruction. if ((BADADDR != DefAddr) && (DefAddr < STARS_PSEUDO_ID_MIN)) { SMPInstr *DefInst = CurrBlock->GetFunc()->GetInstFromAddr(DefAddr); @@ -3334,7 +3242,7 @@ SMPDefUseChain::SMPDefUseChain(void) { return; } -SMPDefUseChain::SMPDefUseChain(STARSOpndTypePtr Name, ea_t Def) { +SMPDefUseChain::SMPDefUseChain(STARSOpndTypePtr Name, STARS_ea_t Def) { this->SetName(Name); this->RefInstrs.push_back(Def); this->IndWrite = false; @@ -3358,13 +3266,13 @@ void SMPDefUseChain::SetName(STARSOpndTypePtr Name) { } // Set the DEF instruction. -void SMPDefUseChain::SetDef(ea_t Def) { +void SMPDefUseChain::SetDef(STARS_ea_t Def) { this->RefInstrs[0] = (unsigned short) Def; return; } // Push a USE onto the list -void SMPDefUseChain::PushUse(ea_t Use) { +void SMPDefUseChain::PushUse(STARS_ea_t Use) { this->RefInstrs.push_back((unsigned short) Use); return; } @@ -3400,7 +3308,7 @@ SMPDUChainArray::SMPDUChainArray(void) { return; } -SMPDUChainArray::SMPDUChainArray(STARSOpndTypePtr Name, ea_t FirstAddrMinusOne) { +SMPDUChainArray::SMPDUChainArray(STARSOpndTypePtr Name, STARS_ea_t FirstAddrMinusOne) { STARSOpndTypePtr Name2 = nullptr; if (Name->IsRegOp()) { // We want to map AH, AL, and AX to EAX, etc. throughout our data flow analysis @@ -3417,7 +3325,7 @@ SMPDUChainArray::SMPDUChainArray(STARSOpndTypePtr Name, ea_t FirstAddrMinusOne) return; } -ea_t SMPDUChainArray::GetLastUse(int SSANum) const { +STARS_ea_t SMPDUChainArray::GetLastUse(int SSANum) const { ea_t TempAddr = DUChains.at(SSANum).GetLastUse(); if (BADADDR != TempAddr) { // If BADADDR, leave it as BADADDR. Otherwise, add in BaseAddr. @@ -3530,7 +3438,7 @@ bool STARSBitSet::IsAnyBitSet(void) const { } // Map system or library call name to FG info about its return value. -static map<string, struct FineGrainedInfo> ReturnRegisterTypeMap; +map<string, struct FineGrainedInfo> ReturnRegisterTypeMap; // Map system or library call name to the annotation substring that // guides saturating arithmetic or other continuation policies in @@ -4318,3210 +4226,4 @@ void GetLibFuncFGInfo(string FuncName, struct FineGrainedInfo &InitFGInfo) { return; } // end of GetLibFuncFGInfo() -// Initialize the lookup maps that are used to define the FG info that can -// be inferred from a library function name. -void InitLibFuncFGInfoMaps(void) { - struct FineGrainedInfo FGEntry; - pair<string, struct FineGrainedInfo> MapEntry; - pair<map<string, struct FineGrainedInfo>::iterator, bool> InsertResult; - - // Add functions that return signed integers. - FGEntry.SignMiscInfo = FG_MASK_SIGNED; - FGEntry.SizeInfo = (FG_MASK_INTEGER | ComputeOperandBitWidthMask(nullptr, sizeof(int))); - MapEntry.second = FGEntry; - - MapEntry.first = "atoi"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strcmp"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strcoll"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strncmp"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "memcmp"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "isalnum"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "isalpha"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "islower"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "isupper"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "isdigit"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "isxdigit"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "iscntrl"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "isgraph"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "isblank"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "isspace"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "isprint"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "ispunct"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - // Functions that return signed longs. - if (sizeof(long int) != sizeof(int)) { - FGEntry.SizeInfo = (FG_MASK_INTEGER | ComputeOperandBitWidthMask(nullptr, sizeof(long int))); - MapEntry.second = FGEntry; - } - - MapEntry.first = "atol"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strtol"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - // Functions that return signed long longs. - if (sizeof(long long int) != sizeof(long int)) { - FGEntry.SizeInfo = (FG_MASK_INTEGER | ComputeOperandBitWidthMask(nullptr, sizeof(long long int))); - MapEntry.second = FGEntry; - } - - MapEntry.first = "atoll"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strtoll"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - // Functions that return unsigned long longs. - FGEntry.SignMiscInfo = FG_MASK_UNSIGNED; - MapEntry.second = FGEntry; - - MapEntry.first = "strtoull"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - // Functions that return unsigned longs. - if (sizeof(long long int) != sizeof(long int)) { - FGEntry.SizeInfo = (FG_MASK_INTEGER | ComputeOperandBitWidthMask(nullptr, sizeof(long int))); - MapEntry.second = FGEntry; - } - - MapEntry.first = "strtoul"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - // Functions that return size_t. - FGEntry.SizeInfo = (FG_MASK_INTEGER | ComputeOperandBitWidthMask(nullptr, sizeof(size_t))); - FGEntry.SignMiscInfo = FG_MASK_UNSIGNED; - MapEntry.second = FGEntry; - - MapEntry.first = "strlen"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strxfrm"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strspn"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strcspn"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strftime"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - // Functions that return (char *). - FGEntry.SizeInfo = (FG_MASK_DATAPOINTER | ComputeOperandBitWidthMask(nullptr, sizeof(char *))); - FGEntry.SignMiscInfo = FG_MASK_UNSIGNED; - MapEntry.second = FGEntry; - - MapEntry.first = "strcpy"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strncpy"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strcat"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strncat"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strchr"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strrchr"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strpbrk"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strstr"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strtok"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "strerror"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "asctime"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "ctime"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - // Functions that return (void *) or a similar data pointer. - FGEntry.SizeInfo = (FG_MASK_DATAPOINTER | ComputeOperandBitWidthMask(nullptr, sizeof(void *))); - FGEntry.SignMiscInfo = FG_MASK_UNSIGNED; - MapEntry.second = FGEntry; - - MapEntry.first = "setlocale"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "localeconv"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "malloc"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "calloc"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "realloc"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "memchr"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "memcpy"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "mempcpy"; // non-standard, found in glibc - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "memmove"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "memset"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "gmtime"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - MapEntry.first = "localtime"; - InsertResult = ReturnRegisterTypeMap.insert(MapEntry); - assert(InsertResult.second); - - // Functions that return bool. - FGEntry.SizeInfo = (FG_MASK_INTEGER | ComputeOperandBitWidthMask(nullptr, sizeof(bool))); - FGEntry.SignMiscInfo = FG_MASK_UNSIGNED; - MapEntry.second = FGEntry; - - - // NOTE: Add <math.h> functions later. - - return; -} // end of InitLibFuncFGInfoMaps() - -// Initialize the DFACategory[] array to define instruction classes -// for the purposes of data flow analysis. -void InitDFACategory(void) { - // Default category is 0, not the start or end of a basic block. - (void) memset(DFACategory, 0, sizeof(DFACategory)); - -DFACategory[NN_call] = CALL; // Call Procedure -DFACategory[NN_callfi] = INDIR_CALL; // Indirect Call Far Procedure -DFACategory[NN_callni] = INDIR_CALL; // Indirect Call Near Procedure - -DFACategory[NN_hlt] = HALT; // Halt - -DFACategory[NN_int] = INDIR_CALL; // Call to Interrupt Procedure -DFACategory[NN_into] = INDIR_CALL; // Call to Interrupt Procedure if Overflow Flag = 1 -DFACategory[NN_int3] = INDIR_CALL; // Trap to Debugger -DFACategory[NN_iretw] = RETURN; // Interrupt Return -DFACategory[NN_iret] = RETURN; // Interrupt Return -DFACategory[NN_iretd] = RETURN; // Interrupt Return (use32) -DFACategory[NN_iretq] = RETURN; // Interrupt Return (use64) -DFACategory[NN_ja] = COND_BRANCH; // Jump if Above (CF=0 & ZF=0) -DFACategory[NN_jae] = COND_BRANCH; // Jump if Above or Equal (CF=0) -DFACategory[NN_jb] = COND_BRANCH; // Jump if Below (CF=1) -DFACategory[NN_jbe] = COND_BRANCH; // Jump if Below or Equal (CF=1 | ZF=1) -DFACategory[NN_jc] = COND_BRANCH; // Jump if Carry (CF=1) -DFACategory[NN_jcxz] = COND_BRANCH; // Jump if CX is 0 -DFACategory[NN_jecxz] = COND_BRANCH; // Jump if ECX is 0 -DFACategory[NN_jrcxz] = COND_BRANCH; // Jump if RCX is 0 -DFACategory[NN_je] = COND_BRANCH; // Jump if Equal (ZF=1) -DFACategory[NN_jg] = COND_BRANCH; // Jump if Greater (ZF=0 & SF=OF) -DFACategory[NN_jge] = COND_BRANCH; // Jump if Greater or Equal (SF=OF) -DFACategory[NN_jl] = COND_BRANCH; // Jump if Less (SF!=OF) -DFACategory[NN_jle] = COND_BRANCH; // Jump if Less or Equal (ZF=1 | SF!=OF) -DFACategory[NN_jna] = COND_BRANCH; // Jump if Not Above (CF=1 | ZF=1) -DFACategory[NN_jnae] = COND_BRANCH; // Jump if Not Above or Equal (CF=1) -DFACategory[NN_jnb] = COND_BRANCH; // Jump if Not Below (CF=0) -DFACategory[NN_jnbe] = COND_BRANCH; // Jump if Not Below or Equal (CF=0 & ZF=0) -DFACategory[NN_jnc] = COND_BRANCH; // Jump if Not Carry (CF=0) -DFACategory[NN_jne] = COND_BRANCH; // Jump if Not Equal (ZF=0) -DFACategory[NN_jng] = COND_BRANCH; // Jump if Not Greater (ZF=1 | SF!=OF) -DFACategory[NN_jnge] = COND_BRANCH; // Jump if Not Greater or Equal (SF!=OF) -DFACategory[NN_jnl] = COND_BRANCH; // Jump if Not Less (SF=OF) -DFACategory[NN_jnle] = COND_BRANCH; // Jump if Not Less or Equal (ZF=0 & SF=OF) -DFACategory[NN_jno] = COND_BRANCH; // Jump if Not Overflow (OF=0) -DFACategory[NN_jnp] = COND_BRANCH; // Jump if Not Parity (PF=0) -DFACategory[NN_jns] = COND_BRANCH; // Jump if Not Sign (SF=0) -DFACategory[NN_jnz] = COND_BRANCH; // Jump if Not Zero (ZF=0) -DFACategory[NN_jo] = COND_BRANCH; // Jump if Overflow (OF=1) -DFACategory[NN_jp] = COND_BRANCH; // Jump if Parity (PF=1) -DFACategory[NN_jpe] = COND_BRANCH; // Jump if Parity Even (PF=1) -DFACategory[NN_jpo] = COND_BRANCH; // Jump if Parity Odd (PF=0) -DFACategory[NN_js] = COND_BRANCH; // Jump if Sign (SF=1) -DFACategory[NN_jz] = COND_BRANCH; // Jump if Zero (ZF=1) -DFACategory[NN_jmp] = JUMP; // Jump -DFACategory[NN_jmpfi] = INDIR_JUMP; // Indirect Far Jump -DFACategory[NN_jmpni] = INDIR_JUMP; // Indirect Near Jump -DFACategory[NN_jmpshort] = JUMP; // Jump Short (only in 64-bit mode) - -DFACategory[NN_loopw] = COND_BRANCH; // Loop while ECX != 0 -DFACategory[NN_loop] = COND_BRANCH; // Loop while CX != 0 -DFACategory[NN_loopd] = COND_BRANCH; // Loop while ECX != 0 -DFACategory[NN_loopq] = COND_BRANCH; // Loop while RCX != 0 -DFACategory[NN_loopwe] = COND_BRANCH; // Loop while CX != 0 and ZF=1 -DFACategory[NN_loope] = COND_BRANCH; // Loop while rCX != 0 and ZF=1 -DFACategory[NN_loopde] = COND_BRANCH; // Loop while ECX != 0 and ZF=1 -DFACategory[NN_loopqe] = COND_BRANCH; // Loop while RCX != 0 and ZF=1 -DFACategory[NN_loopwne] = COND_BRANCH; // Loop while CX != 0 and ZF=0 -DFACategory[NN_loopne] = COND_BRANCH; // Loop while rCX != 0 and ZF=0 -DFACategory[NN_loopdne] = COND_BRANCH; // Loop while ECX != 0 and ZF=0 -DFACategory[NN_loopqne] = COND_BRANCH; // Loop while RCX != 0 and ZF=0 - -DFACategory[NN_retn] = RETURN; // Return Near from Procedure -DFACategory[NN_retf] = RETURN; // Return Far from Procedure - -// -// Pentium instructions -// - -DFACategory[NN_rsm] = HALT; // Resume from System Management Mode - -// Pentium II instructions - -DFACategory[NN_sysenter] = CALL; // Fast Transition to System Call Entry Point -DFACategory[NN_sysexit] = CALL; // Fast Transition from System Call Entry Point - -// AMD syscall/sysret instructions NOTE: not AMD, found in Intel manual - -DFACategory[NN_syscall] = CALL; // Low latency system call -DFACategory[NN_sysret] = CALL; // Return from system call - -// VMX instructions - -DFACategory[NN_vmcall] = INDIR_CALL; // Call to VM Monitor - -// Added with x86-64 - -// Geode LX 3DNow! extensions - -// SSE2 pseudoinstructions - -// SSSE4.1 instructions - -// SSSE4.2 instructions - -// AMD SSE4a instructions - -// xsave/xrstor instructions - -// Intel Safer Mode Extensions (SMX) - -// AMD-V Virtualization ISA Extension - -// VMX+ instructions - -// Intel Atom instructions - -// Intel AES instructions - -// Carryless multiplication - -// Returns modified by operand size prefixes - -DFACategory[NN_retnw] = RETURN; // Return Near from Procedure (use16) -DFACategory[NN_retnd] = RETURN; // Return Near from Procedure (use32) -DFACategory[NN_retnq] = RETURN; // Return Near from Procedure (use64) -DFACategory[NN_retfw] = RETURN; // Return Far from Procedure (use16) -DFACategory[NN_retfd] = RETURN; // Return Far from Procedure (use32) -DFACategory[NN_retfq] = RETURN; // Return Far from Procedure (use64) - -// RDRAND support - -// new GPR instructions - -// new AVX instructions - -// Transactional Synchronization Extensions - -// Virtual PC synthetic instructions - - return; - -} // end InitDFACategory() - -// Initialize the SMPDefsFlags[] array to define how we emit -// optimizing annotations. -void InitSMPDefsFlags(void) { - // Default value is true. Many instructions set the flags. - (void) memset(SMPDefsFlags, true, sizeof(SMPDefsFlags)); - -SMPDefsFlags[NN_null] = false; // Unknown Operation -SMPDefsFlags[NN_bound] = false; // Check Array Index Against Bounds -SMPDefsFlags[NN_call] = false; // Call Procedure -SMPDefsFlags[NN_callfi] = false; // Indirect Call Far Procedure -SMPDefsFlags[NN_callni] = false; // Indirect Call Near Procedure -SMPDefsFlags[NN_cbw] = false; // AL -> AX (with sign) -SMPDefsFlags[NN_cwde] = false; // AX -> EAX (with sign) -SMPDefsFlags[NN_cdqe] = false; // EAX -> RAX (with sign) -SMPDefsFlags[NN_clts] = false; // Clear Task-Switched Flag in CR0 -SMPDefsFlags[NN_cwd] = false; // AX -> DX:AX (with sign) -SMPDefsFlags[NN_cdq] = false; // EAX -> EDX:EAX (with sign) -SMPDefsFlags[NN_cqo] = false; // RAX -> RDX:RAX (with sign) -SMPDefsFlags[NN_enterw] = false; // Make Stack Frame for Procedure Parameters -SMPDefsFlags[NN_enter] = false; // Make Stack Frame for Procedure Parameters -SMPDefsFlags[NN_enterd] = false; // Make Stack Frame for Procedure Parameters -SMPDefsFlags[NN_enterq] = false; // Make Stack Frame for Procedure Parameters -SMPDefsFlags[NN_hlt] = false; // Halt -SMPDefsFlags[NN_in] = false; // Input from Port -SMPDefsFlags[NN_ins] = false; // Input Byte(s) from Port to String -SMPDefsFlags[NN_iretw] = false; // Interrupt Return -SMPDefsFlags[NN_iret] = false; // Interrupt Return -SMPDefsFlags[NN_iretd] = false; // Interrupt Return (use32) -SMPDefsFlags[NN_iretq] = false; // Interrupt Return (use64) -SMPDefsFlags[NN_ja] = false; // Jump if Above (CF=0 & ZF=0) -SMPDefsFlags[NN_jae] = false; // Jump if Above or Equal (CF=0) -SMPDefsFlags[NN_jb] = false; // Jump if Below (CF=1) -SMPDefsFlags[NN_jbe] = false; // Jump if Below or Equal (CF=1 | ZF=1) -SMPDefsFlags[NN_jc] = false; // Jump if Carry (CF=1) -SMPDefsFlags[NN_jcxz] = false; // Jump if CX is 0 -SMPDefsFlags[NN_jecxz] = false; // Jump if ECX is 0 -SMPDefsFlags[NN_jrcxz] = false; // Jump if RCX is 0 -SMPDefsFlags[NN_je] = false; // Jump if Equal (ZF=1) -SMPDefsFlags[NN_jg] = false; // Jump if Greater (ZF=0 & SF=OF) -SMPDefsFlags[NN_jge] = false; // Jump if Greater or Equal (SF=OF) -SMPDefsFlags[NN_jl] = false; // Jump if Less (SF!=OF) -SMPDefsFlags[NN_jle] = false; // Jump if Less or Equal (ZF=1 | SF!=OF) -SMPDefsFlags[NN_jna] = false; // Jump if Not Above (CF=1 | ZF=1) -SMPDefsFlags[NN_jnae] = false; // Jump if Not Above or Equal (CF=1) -SMPDefsFlags[NN_jnb] = false; // Jump if Not Below (CF=0) -SMPDefsFlags[NN_jnbe] = false; // Jump if Not Below or Equal (CF=0 & ZF=0) -SMPDefsFlags[NN_jnc] = false; // Jump if Not Carry (CF=0) -SMPDefsFlags[NN_jne] = false; // Jump if Not Equal (ZF=0) -SMPDefsFlags[NN_jng] = false; // Jump if Not Greater (ZF=1 | SF!=OF) -SMPDefsFlags[NN_jnge] = false; // Jump if Not Greater or Equal (SF!=OF) -SMPDefsFlags[NN_jnl] = false; // Jump if Not Less (SF=OF) -SMPDefsFlags[NN_jnle] = false; // Jump if Not Less or Equal (ZF=0 & SF=OF) -SMPDefsFlags[NN_jno] = false; // Jump if Not Overflow (OF=0) -SMPDefsFlags[NN_jnp] = false; // Jump if Not Parity (PF=0) -SMPDefsFlags[NN_jns] = false; // Jump if Not Sign (SF=0) -SMPDefsFlags[NN_jnz] = false; // Jump if Not Zero (ZF=0) -SMPDefsFlags[NN_jo] = false; // Jump if Overflow (OF=1) -SMPDefsFlags[NN_jp] = false; // Jump if Parity (PF=1) -SMPDefsFlags[NN_jpe] = false; // Jump if Parity Even (PF=1) -SMPDefsFlags[NN_jpo] = false; // Jump if Parity Odd (PF=0) -SMPDefsFlags[NN_js] = false; // Jump if Sign (SF=1) -SMPDefsFlags[NN_jz] = false; // Jump if Zero (ZF=1) -SMPDefsFlags[NN_jmp] = false; // Jump -SMPDefsFlags[NN_jmpfi] = false; // Indirect Far Jump -SMPDefsFlags[NN_jmpni] = false; // Indirect Near Jump -SMPDefsFlags[NN_jmpshort] = false; // Jump Short (not used) -SMPDefsFlags[NN_lahf] = false; // Load Flags into AH Register -SMPDefsFlags[NN_lea] = false; // Load Effective Address -SMPDefsFlags[NN_leavew] = false; // High Level Procedure Exit -SMPDefsFlags[NN_leave] = false; // High Level Procedure Exit -SMPDefsFlags[NN_leaved] = false; // High Level Procedure Exit -SMPDefsFlags[NN_leaveq] = false; // High Level Procedure Exit -SMPDefsFlags[NN_lgdt] = false; // Load Global Descriptor Table Register -SMPDefsFlags[NN_lidt] = false; // Load Interrupt Descriptor Table Register -SMPDefsFlags[NN_lgs] = false; // Load Full Pointer to GS:xx -SMPDefsFlags[NN_lss] = false; // Load Full Pointer to SS:xx -SMPDefsFlags[NN_lds] = false; // Load Full Pointer to DS:xx -SMPDefsFlags[NN_les] = false; // Load Full Pointer to ES:xx -SMPDefsFlags[NN_lfs] = false; // Load Full Pointer to FS:xx -SMPDefsFlags[NN_loopw] = false; // Loop while ECX != 0 -SMPDefsFlags[NN_loop] = false; // Loop while ECX != 0 -SMPDefsFlags[NN_loopwe] = false; // Loop while CX != 0 and ZF=1 -SMPDefsFlags[NN_loope] = false; // Loop while rCX != 0 and ZF=1 -SMPDefsFlags[NN_loopde] = false; // Loop while ECX != 0 and ZF=1 -SMPDefsFlags[NN_loopqe] = false; // Loop while RCX != 0 and ZF=1 -SMPDefsFlags[NN_loopwne] = false; // Loop while CX != 0 and ZF=0 -SMPDefsFlags[NN_loopne] = false; // Loop while rCX != 0 and ZF=0 -SMPDefsFlags[NN_loopdne] = false; // Loop while ECX != 0 and ZF=0 -SMPDefsFlags[NN_loopqne] = false; // Loop while RCX != 0 and ZF=0 -SMPDefsFlags[NN_ltr] = false; // Load Task Register -SMPDefsFlags[NN_mov] = false; // Move Data -SMPDefsFlags[NN_movsp] = true; // Move to/from Special Registers -SMPDefsFlags[NN_movs] = false; // Move Byte(s) from String to String -SMPDefsFlags[NN_movsx] = false; // Move with Sign-Extend -SMPDefsFlags[NN_movzx] = false; // Move with Zero-Extend -SMPDefsFlags[NN_nop] = false; // No Operation -SMPDefsFlags[NN_not] = false; // One's Complement Negation -SMPDefsFlags[NN_out] = false; // Output to Port -SMPDefsFlags[NN_outs] = false; // Output Byte(s) to Port -SMPDefsFlags[NN_pop] = false; // Pop a word from the Stack -SMPDefsFlags[NN_popaw] = false; // Pop all General Registers -SMPDefsFlags[NN_popa] = false; // Pop all General Registers -SMPDefsFlags[NN_popad] = false; // Pop all General Registers (use32) -SMPDefsFlags[NN_popaq] = false; // Pop all General Registers (use64) -SMPDefsFlags[NN_push] = false; // Push Operand onto the Stack -SMPDefsFlags[NN_pushaw] = false; // Push all General Registers -SMPDefsFlags[NN_pusha] = false; // Push all General Registers -SMPDefsFlags[NN_pushad] = false; // Push all General Registers (use32) -SMPDefsFlags[NN_pushaq] = false; // Push all General Registers (use64) -SMPDefsFlags[NN_pushfw] = false; // Push Flags Register onto the Stack -SMPDefsFlags[NN_pushf] = false; // Push Flags Register onto the Stack -SMPDefsFlags[NN_pushfd] = false; // Push Flags Register onto the Stack (use32) -SMPDefsFlags[NN_pushfq] = false; // Push Flags Register onto the Stack (use64) -SMPDefsFlags[NN_rep] = false; // Repeat String Operation -SMPDefsFlags[NN_repe] = false; // Repeat String Operation while ZF=1 -SMPDefsFlags[NN_repne] = false; // Repeat String Operation while ZF=0 -SMPDefsFlags[NN_retn] = false; // Return Near from Procedure -SMPDefsFlags[NN_retf] = false; // Return Far from Procedure -SMPDefsFlags[NN_sahf] = true; // Store AH into flags -SMPDefsFlags[NN_shl] = true; // Shift Logical Left -SMPDefsFlags[NN_shr] = true; // Shift Logical Right -SMPDefsFlags[NN_seta] = false; // Set Byte if Above (CF=0 & ZF=0) -SMPDefsFlags[NN_setae] = false; // Set Byte if Above or Equal (CF=0) -SMPDefsFlags[NN_setb] = false; // Set Byte if Below (CF=1) -SMPDefsFlags[NN_setbe] = false; // Set Byte if Below or Equal (CF=1 | ZF=1) -SMPDefsFlags[NN_setc] = false; // Set Byte if Carry (CF=1) -SMPDefsFlags[NN_sete] = false; // Set Byte if Equal (ZF=1) -SMPDefsFlags[NN_setg] = false; // Set Byte if Greater (ZF=0 & SF=OF) -SMPDefsFlags[NN_setge] = false; // Set Byte if Greater or Equal (SF=OF) -SMPDefsFlags[NN_setl] = false; // Set Byte if Less (SF!=OF) -SMPDefsFlags[NN_setle] = false; // Set Byte if Less or Equal (ZF=1 | SF!=OF) -SMPDefsFlags[NN_setna] = false; // Set Byte if Not Above (CF=1 | ZF=1) -SMPDefsFlags[NN_setnae] = false; // Set Byte if Not Above or Equal (CF=1) -SMPDefsFlags[NN_setnb] = false; // Set Byte if Not Below (CF=0) -SMPDefsFlags[NN_setnbe] = false; // Set Byte if Not Below or Equal (CF=0 & ZF=0) -SMPDefsFlags[NN_setnc] = false; // Set Byte if Not Carry (CF=0) -SMPDefsFlags[NN_setne] = false; // Set Byte if Not Equal (ZF=0) -SMPDefsFlags[NN_setng] = false; // Set Byte if Not Greater (ZF=1 | SF!=OF) -SMPDefsFlags[NN_setnge] = false; // Set Byte if Not Greater or Equal (SF!=OF) -SMPDefsFlags[NN_setnl] = false; // Set Byte if Not Less (SF=OF) -SMPDefsFlags[NN_setnle] = false; // Set Byte if Not Less or Equal (ZF=0 & SF=OF) -SMPDefsFlags[NN_setno] = false; // Set Byte if Not Overflow (OF=0) -SMPDefsFlags[NN_setnp] = false; // Set Byte if Not Parity (PF=0) -SMPDefsFlags[NN_setns] = false; // Set Byte if Not Sign (SF=0) -SMPDefsFlags[NN_setnz] = false; // Set Byte if Not Zero (ZF=0) -SMPDefsFlags[NN_seto] = false; // Set Byte if Overflow (OF=1) -SMPDefsFlags[NN_setp] = false; // Set Byte if Parity (PF=1) -SMPDefsFlags[NN_setpe] = false; // Set Byte if Parity Even (PF=1) -SMPDefsFlags[NN_setpo] = false; // Set Byte if Parity Odd (PF=0) -SMPDefsFlags[NN_sets] = false; // Set Byte if Sign (SF=1) -SMPDefsFlags[NN_setz] = false; // Set Byte if Zero (ZF=1) -SMPDefsFlags[NN_sgdt] = false; // Store Global Descriptor Table Register -SMPDefsFlags[NN_sidt] = false; // Store Interrupt Descriptor Table Register -SMPDefsFlags[NN_sldt] = false; // Store Local Descriptor Table Register -SMPDefsFlags[NN_str] = false; // Store Task Register -SMPDefsFlags[NN_wait] = false; // Wait until BUSY# Pin is Inactive (HIGH) -SMPDefsFlags[NN_xchg] = false; // Exchange Register/Memory with Register -SMPDefsFlags[NN_xlat] = false; // Table Lookup Translation - -// -// 486 instructions -// - -SMPDefsFlags[NN_bswap] = false; // Swap bytes in register -SMPDefsFlags[NN_invd] = false; // Invalidate Data Cache -SMPDefsFlags[NN_wbinvd] = false; // Invalidate Data Cache (write changes) -SMPDefsFlags[NN_invlpg] = false; // Invalidate TLB entry - -// -// Pentium instructions -// - -SMPDefsFlags[NN_rdmsr] = false; // Read Machine Status Register -SMPDefsFlags[NN_wrmsr] = false; // Write Machine Status Register -SMPDefsFlags[NN_cpuid] = false; // Get CPU ID -SMPDefsFlags[NN_rdtsc] = false; // Read Time Stamp Counter - -// -// Pentium Pro instructions -// - -SMPDefsFlags[NN_cmova] = false; // Move if Above (CF=0 & ZF=0) -SMPDefsFlags[NN_cmovb] = false; // Move if Below (CF=1) -SMPDefsFlags[NN_cmovbe] = false; // Move if Below or Equal (CF=1 | ZF=1) -SMPDefsFlags[NN_cmovg] = false; // Move if Greater (ZF=0 & SF=OF) -SMPDefsFlags[NN_cmovge] = false; // Move if Greater or Equal (SF=OF) -SMPDefsFlags[NN_cmovl] = false; // Move if Less (SF!=OF) -SMPDefsFlags[NN_cmovle] = false; // Move if Less or Equal (ZF=1 | SF!=OF) -SMPDefsFlags[NN_cmovnb] = false; // Move if Not Below (CF=0) -SMPDefsFlags[NN_cmovno] = false; // Move if Not Overflow (OF=0) -SMPDefsFlags[NN_cmovnp] = false; // Move if Not Parity (PF=0) -SMPDefsFlags[NN_cmovns] = false; // Move if Not Sign (SF=0) -SMPDefsFlags[NN_cmovnz] = false; // Move if Not Zero (ZF=0) -SMPDefsFlags[NN_cmovo] = false; // Move if Overflow (OF=1) -SMPDefsFlags[NN_cmovp] = false; // Move if Parity (PF=1) -SMPDefsFlags[NN_cmovs] = false; // Move if Sign (SF=1) -SMPDefsFlags[NN_cmovz] = false; // Move if Zero (ZF=1) -SMPDefsFlags[NN_fcmovb] = false; // Floating Move if Below -SMPDefsFlags[NN_fcmove] = false; // Floating Move if Equal -SMPDefsFlags[NN_fcmovbe] = false; // Floating Move if Below or Equal -SMPDefsFlags[NN_fcmovu] = false; // Floating Move if Unordered -SMPDefsFlags[NN_fcmovnb] = false; // Floating Move if Not Below -SMPDefsFlags[NN_fcmovne] = false; // Floating Move if Not Equal -SMPDefsFlags[NN_fcmovnbe] = false; // Floating Move if Not Below or Equal -SMPDefsFlags[NN_fcmovnu] = false; // Floating Move if Not Unordered -SMPDefsFlags[NN_rdpmc] = false; // Read Performance Monitor Counter - -// -// FPP instructions -// - -SMPDefsFlags[NN_fld] = false; // Load Real -SMPDefsFlags[NN_fst] = false; // Store Real -SMPDefsFlags[NN_fstp] = false; // Store Real and Pop -SMPDefsFlags[NN_fxch] = false; // Exchange Registers -SMPDefsFlags[NN_fild] = false; // Load Integer -SMPDefsFlags[NN_fist] = false; // Store Integer -SMPDefsFlags[NN_fistp] = false; // Store Integer and Pop -SMPDefsFlags[NN_fbld] = false; // Load BCD -SMPDefsFlags[NN_fbstp] = false; // Store BCD and Pop -SMPDefsFlags[NN_fadd] = false; // Add Real -SMPDefsFlags[NN_faddp] = false; // Add Real and Pop -SMPDefsFlags[NN_fiadd] = false; // Add Integer -SMPDefsFlags[NN_fsub] = false; // Subtract Real -SMPDefsFlags[NN_fsubp] = false; // Subtract Real and Pop -SMPDefsFlags[NN_fisub] = false; // Subtract Integer -SMPDefsFlags[NN_fsubr] = false; // Subtract Real Reversed -SMPDefsFlags[NN_fsubrp] = false; // Subtract Real Reversed and Pop -SMPDefsFlags[NN_fisubr] = false; // Subtract Integer Reversed -SMPDefsFlags[NN_fmul] = false; // Multiply Real -SMPDefsFlags[NN_fmulp] = false; // Multiply Real and Pop -SMPDefsFlags[NN_fimul] = false; // Multiply Integer -SMPDefsFlags[NN_fdiv] = false; // Divide Real -SMPDefsFlags[NN_fdivp] = false; // Divide Real and Pop -SMPDefsFlags[NN_fidiv] = false; // Divide Integer -SMPDefsFlags[NN_fdivr] = false; // Divide Real Reversed -SMPDefsFlags[NN_fdivrp] = false; // Divide Real Reversed and Pop -SMPDefsFlags[NN_fidivr] = false; // Divide Integer Reversed -SMPDefsFlags[NN_fsqrt] = false; // Square Root -SMPDefsFlags[NN_fscale] = false; // Scale: st(0) <- st(0) * 2^st(1) -SMPDefsFlags[NN_fprem] = false; // Partial Remainder -SMPDefsFlags[NN_frndint] = false; // Round to Integer -SMPDefsFlags[NN_fxtract] = false; // Extract exponent and significand -SMPDefsFlags[NN_fabs] = false; // Absolute value -SMPDefsFlags[NN_fchs] = false; // Change Sign -SMPDefsFlags[NN_ficom] = false; // Compare Integer -SMPDefsFlags[NN_ficomp] = false; // Compare Integer and Pop -SMPDefsFlags[NN_ftst] = false; // Test -SMPDefsFlags[NN_fxam] = false; // Examine -SMPDefsFlags[NN_fptan] = false; // Partial tangent -SMPDefsFlags[NN_fpatan] = false; // Partial arctangent -SMPDefsFlags[NN_f2xm1] = false; // 2^x - 1 -SMPDefsFlags[NN_fyl2x] = false; // Y * lg2(X) -SMPDefsFlags[NN_fyl2xp1] = false; // Y * lg2(X+1) -SMPDefsFlags[NN_fldz] = false; // Load +0.0 -SMPDefsFlags[NN_fld1] = false; // Load +1.0 -SMPDefsFlags[NN_fldpi] = false; // Load PI=3.14... -SMPDefsFlags[NN_fldl2t] = false; // Load lg2(10) -SMPDefsFlags[NN_fldl2e] = false; // Load lg2(e) -SMPDefsFlags[NN_fldlg2] = false; // Load lg10(2) -SMPDefsFlags[NN_fldln2] = false; // Load ln(2) -SMPDefsFlags[NN_finit] = false; // Initialize Processor -SMPDefsFlags[NN_fninit] = false; // Initialize Processor (no wait) -SMPDefsFlags[NN_fsetpm] = false; // Set Protected Mode -SMPDefsFlags[NN_fldcw] = false; // Load Control Word -SMPDefsFlags[NN_fstcw] = false; // Store Control Word -SMPDefsFlags[NN_fnstcw] = false; // Store Control Word (no wait) -SMPDefsFlags[NN_fstsw] = false; // Store Status Word to memory or AX -SMPDefsFlags[NN_fnstsw] = false; // Store Status Word (no wait) to memory or AX -SMPDefsFlags[NN_fclex] = false; // Clear Exceptions -SMPDefsFlags[NN_fnclex] = false; // Clear Exceptions (no wait) -SMPDefsFlags[NN_fstenv] = false; // Store Environment -SMPDefsFlags[NN_fnstenv] = false; // Store Environment (no wait) -SMPDefsFlags[NN_fldenv] = false; // Load Environment -SMPDefsFlags[NN_fsave] = false; // Save State -SMPDefsFlags[NN_fnsave] = false; // Save State (no wait) -SMPDefsFlags[NN_frstor] = false; // Restore State -SMPDefsFlags[NN_fincstp] = false; // Increment Stack Pointer -SMPDefsFlags[NN_fdecstp] = false; // Decrement Stack Pointer -SMPDefsFlags[NN_ffree] = false; // Free Register -SMPDefsFlags[NN_fnop] = false; // No Operation -SMPDefsFlags[NN_feni] = false; // (8087 only) -SMPDefsFlags[NN_fneni] = false; // (no wait) (8087 only) -SMPDefsFlags[NN_fdisi] = false; // (8087 only) -SMPDefsFlags[NN_fndisi] = false; // (no wait) (8087 only) - -// -// 80387 instructions -// - -SMPDefsFlags[NN_fprem1] = false; // Partial Remainder ( < half ) -SMPDefsFlags[NN_fsincos] = false; // t<-cos(st); st<-sin(st); push t -SMPDefsFlags[NN_fsin] = false; // Sine -SMPDefsFlags[NN_fcos] = false; // Cosine -SMPDefsFlags[NN_fucom] = false; // Compare Unordered Real -SMPDefsFlags[NN_fucomp] = false; // Compare Unordered Real and Pop -SMPDefsFlags[NN_fucompp] = false; // Compare Unordered Real and Pop Twice - -// -// Instructions added 28.02.96 -// - -SMPDefsFlags[NN_svdc] = false; // Save Register and Descriptor -SMPDefsFlags[NN_rsdc] = false; // Restore Register and Descriptor -SMPDefsFlags[NN_svldt] = false; // Save LDTR and Descriptor -SMPDefsFlags[NN_rsldt] = false; // Restore LDTR and Descriptor -SMPDefsFlags[NN_svts] = false; // Save TR and Descriptor -SMPDefsFlags[NN_rsts] = false; // Restore TR and Descriptor -SMPDefsFlags[NN_icebp] = false; // ICE Break Point - -// -// MMX instructions -// - -SMPDefsFlags[NN_emms] = false; // Empty MMX state -SMPDefsFlags[NN_movd] = false; // Move 32 bits -SMPDefsFlags[NN_movq] = false; // Move 64 bits -SMPDefsFlags[NN_packsswb] = false; // Pack with Signed Saturation (Word->Byte) -SMPDefsFlags[NN_packssdw] = false; // Pack with Signed Saturation (Dword->Word) -SMPDefsFlags[NN_packuswb] = false; // Pack with Unsigned Saturation (Word->Byte) -SMPDefsFlags[NN_paddb] = false; // Packed Add Byte -SMPDefsFlags[NN_paddw] = false; // Packed Add Word -SMPDefsFlags[NN_paddd] = false; // Packed Add Dword -SMPDefsFlags[NN_paddsb] = false; // Packed Add with Saturation (Byte) -SMPDefsFlags[NN_paddsw] = false; // Packed Add with Saturation (Word) -SMPDefsFlags[NN_paddusb] = false; // Packed Add Unsigned with Saturation (Byte) -SMPDefsFlags[NN_paddusw] = false; // Packed Add Unsigned with Saturation (Word) -SMPDefsFlags[NN_pand] = false; // Bitwise Logical And -SMPDefsFlags[NN_pandn] = false; // Bitwise Logical And Not -SMPDefsFlags[NN_pcmpeqb] = false; // Packed Compare for Equal (Byte) -SMPDefsFlags[NN_pcmpeqw] = false; // Packed Compare for Equal (Word) -SMPDefsFlags[NN_pcmpeqd] = false; // Packed Compare for Equal (Dword) -SMPDefsFlags[NN_pcmpgtb] = false; // Packed Compare for Greater Than (Byte) -SMPDefsFlags[NN_pcmpgtw] = false; // Packed Compare for Greater Than (Word) -SMPDefsFlags[NN_pcmpgtd] = false; // Packed Compare for Greater Than (Dword) -SMPDefsFlags[NN_pmaddwd] = false; // Packed Multiply and Add -SMPDefsFlags[NN_pmulhw] = false; // Packed Multiply High -SMPDefsFlags[NN_pmullw] = false; // Packed Multiply Low -SMPDefsFlags[NN_por] = false; // Bitwise Logical Or -SMPDefsFlags[NN_psllw] = false; // Packed Shift Left Logical (Word) -SMPDefsFlags[NN_pslld] = false; // Packed Shift Left Logical (Dword) -SMPDefsFlags[NN_psllq] = false; // Packed Shift Left Logical (Qword) -SMPDefsFlags[NN_psraw] = false; // Packed Shift Right Arithmetic (Word) -SMPDefsFlags[NN_psrad] = false; // Packed Shift Right Arithmetic (Dword) -SMPDefsFlags[NN_psrlw] = false; // Packed Shift Right Logical (Word) -SMPDefsFlags[NN_psrld] = false; // Packed Shift Right Logical (Dword) -SMPDefsFlags[NN_psrlq] = false; // Packed Shift Right Logical (Qword) -SMPDefsFlags[NN_psubb] = false; // Packed Subtract Byte -SMPDefsFlags[NN_psubw] = false; // Packed Subtract Word -SMPDefsFlags[NN_psubd] = false; // Packed Subtract Dword -SMPDefsFlags[NN_psubsb] = false; // Packed Subtract with Saturation (Byte) -SMPDefsFlags[NN_psubsw] = false; // Packed Subtract with Saturation (Word) -SMPDefsFlags[NN_psubusb] = false; // Packed Subtract Unsigned with Saturation (Byte) -SMPDefsFlags[NN_psubusw] = false; // Packed Subtract Unsigned with Saturation (Word) -SMPDefsFlags[NN_punpckhbw] = false; // Unpack High Packed Data (Byte->Word) -SMPDefsFlags[NN_punpckhwd] = false; // Unpack High Packed Data (Word->Dword) -SMPDefsFlags[NN_punpckhdq] = false; // Unpack High Packed Data (Dword->Qword) -SMPDefsFlags[NN_punpcklbw] = false; // Unpack Low Packed Data (Byte->Word) -SMPDefsFlags[NN_punpcklwd] = false; // Unpack Low Packed Data (Word->Dword) -SMPDefsFlags[NN_punpckldq] = false; // Unpack Low Packed Data (Dword->Qword) -SMPDefsFlags[NN_pxor] = false; // Bitwise Logical Exclusive Or - -// -// Undocumented Deschutes processor instructions -// - -SMPDefsFlags[NN_fxsave] = false; // Fast save FP context -SMPDefsFlags[NN_fxrstor] = false; // Fast restore FP context - -// Pentium II instructions - -SMPDefsFlags[NN_sysexit] = false; // Fast Transition from System Call Entry Point - -// 3DNow! instructions - -SMPDefsFlags[NN_pavgusb] = false; // Packed 8-bit Unsigned Integer Averaging -SMPDefsFlags[NN_pfadd] = false; // Packed Floating-Point Addition -SMPDefsFlags[NN_pfsub] = false; // Packed Floating-Point Subtraction -SMPDefsFlags[NN_pfsubr] = false; // Packed Floating-Point Reverse Subtraction -SMPDefsFlags[NN_pfacc] = false; // Packed Floating-Point Accumulate -SMPDefsFlags[NN_pfcmpge] = false; // Packed Floating-Point Comparison, Greater or Equal -SMPDefsFlags[NN_pfcmpgt] = false; // Packed Floating-Point Comparison, Greater -SMPDefsFlags[NN_pfcmpeq] = false; // Packed Floating-Point Comparison, Equal -SMPDefsFlags[NN_pfmin] = false; // Packed Floating-Point Minimum -SMPDefsFlags[NN_pfmax] = false; // Packed Floating-Point Maximum -SMPDefsFlags[NN_pi2fd] = false; // Packed 32-bit Integer to Floating-Point -SMPDefsFlags[NN_pf2id] = false; // Packed Floating-Point to 32-bit Integer -SMPDefsFlags[NN_pfrcp] = false; // Packed Floating-Point Reciprocal Approximation -SMPDefsFlags[NN_pfrsqrt] = false; // Packed Floating-Point Reciprocal Square Root Approximation -SMPDefsFlags[NN_pfmul] = false; // Packed Floating-Point Multiplication -SMPDefsFlags[NN_pfrcpit1] = false; // Packed Floating-Point Reciprocal First Iteration Step -SMPDefsFlags[NN_pfrsqit1] = false; // Packed Floating-Point Reciprocal Square Root First Iteration Step -SMPDefsFlags[NN_pfrcpit2] = false; // Packed Floating-Point Reciprocal Second Iteration Step -SMPDefsFlags[NN_pmulhrw] = false; // Packed Floating-Point 16-bit Integer Multiply with rounding -SMPDefsFlags[NN_femms] = false; // Faster entry/exit of the MMX or floating-point state -SMPDefsFlags[NN_prefetch] = false; // Prefetch at least a 32-byte line into L1 data cache -SMPDefsFlags[NN_prefetchw] = false; // Prefetch processor cache line into L1 data cache (mark as modified) - - -// Pentium III instructions - -SMPDefsFlags[NN_addps] = false; // Packed Single-FP Add -SMPDefsFlags[NN_addss] = false; // Scalar Single-FP Add -SMPDefsFlags[NN_andnps] = false; // Bitwise Logical And Not for Single-FP -SMPDefsFlags[NN_andps] = false; // Bitwise Logical And for Single-FP -SMPDefsFlags[NN_cmpps] = false; // Packed Single-FP Compare -SMPDefsFlags[NN_cmpss] = false; // Scalar Single-FP Compare -SMPDefsFlags[NN_cvtpi2ps] = false; // Packed signed INT32 to Packed Single-FP conversion -SMPDefsFlags[NN_cvtps2pi] = false; // Packed Single-FP to Packed INT32 conversion -SMPDefsFlags[NN_cvtsi2ss] = false; // Scalar signed INT32 to Single-FP conversion -SMPDefsFlags[NN_cvtss2si] = false; // Scalar Single-FP to signed INT32 conversion -SMPDefsFlags[NN_cvttps2pi] = false; // Packed Single-FP to Packed INT32 conversion (truncate) -SMPDefsFlags[NN_cvttss2si] = false; // Scalar Single-FP to signed INT32 conversion (truncate) -SMPDefsFlags[NN_divps] = false; // Packed Single-FP Divide -SMPDefsFlags[NN_divss] = false; // Scalar Single-FP Divide -SMPDefsFlags[NN_ldmxcsr] = false; // Load Streaming SIMD Extensions Technology Control/Status Register -SMPDefsFlags[NN_maxps] = false; // Packed Single-FP Maximum -SMPDefsFlags[NN_maxss] = false; // Scalar Single-FP Maximum -SMPDefsFlags[NN_minps] = false; // Packed Single-FP Minimum -SMPDefsFlags[NN_minss] = false; // Scalar Single-FP Minimum -SMPDefsFlags[NN_movaps] = false; // Move Aligned Four Packed Single-FP -SMPDefsFlags[NN_movhlps] = false; // Move High to Low Packed Single-FP -SMPDefsFlags[NN_movhps] = false; // Move High Packed Single-FP -SMPDefsFlags[NN_movlhps] = false; // Move Low to High Packed Single-FP -SMPDefsFlags[NN_movlps] = false; // Move Low Packed Single-FP -SMPDefsFlags[NN_movmskps] = false; // Move Mask to Register -SMPDefsFlags[NN_movss] = false; // Move Scalar Single-FP -SMPDefsFlags[NN_movups] = false; // Move Unaligned Four Packed Single-FP -SMPDefsFlags[NN_mulps] = false; // Packed Single-FP Multiply -SMPDefsFlags[NN_mulss] = false; // Scalar Single-FP Multiply -SMPDefsFlags[NN_orps] = false; // Bitwise Logical OR for Single-FP Data -SMPDefsFlags[NN_rcpps] = false; // Packed Single-FP Reciprocal -SMPDefsFlags[NN_rcpss] = false; // Scalar Single-FP Reciprocal -SMPDefsFlags[NN_rsqrtps] = false; // Packed Single-FP Square Root Reciprocal -SMPDefsFlags[NN_rsqrtss] = false; // Scalar Single-FP Square Root Reciprocal -SMPDefsFlags[NN_shufps] = false; // Shuffle Single-FP -SMPDefsFlags[NN_sqrtps] = false; // Packed Single-FP Square Root -SMPDefsFlags[NN_sqrtss] = false; // Scalar Single-FP Square Root -SMPDefsFlags[NN_stmxcsr] = false; // Store Streaming SIMD Extensions Technology Control/Status Register -SMPDefsFlags[NN_subps] = false; // Packed Single-FP Subtract -SMPDefsFlags[NN_subss] = false; // Scalar Single-FP Subtract -SMPDefsFlags[NN_unpckhps] = false; // Unpack High Packed Single-FP Data -SMPDefsFlags[NN_unpcklps] = false; // Unpack Low Packed Single-FP Data -SMPDefsFlags[NN_xorps] = false; // Bitwise Logical XOR for Single-FP Data -SMPDefsFlags[NN_pavgb] = false; // Packed Average (Byte) -SMPDefsFlags[NN_pavgw] = false; // Packed Average (Word) -SMPDefsFlags[NN_pextrw] = false; // Extract Word -SMPDefsFlags[NN_pinsrw] = false; // Insert Word -SMPDefsFlags[NN_pmaxsw] = false; // Packed Signed Integer Word Maximum -SMPDefsFlags[NN_pmaxub] = false; // Packed Unsigned Integer Byte Maximum -SMPDefsFlags[NN_pminsw] = false; // Packed Signed Integer Word Minimum -SMPDefsFlags[NN_pminub] = false; // Packed Unsigned Integer Byte Minimum -SMPDefsFlags[NN_pmovmskb] = false; // Move Byte Mask to Integer -SMPDefsFlags[NN_pmulhuw] = false; // Packed Multiply High Unsigned -SMPDefsFlags[NN_psadbw] = false; // Packed Sum of Absolute Differences -SMPDefsFlags[NN_pshufw] = false; // Packed Shuffle Word -SMPDefsFlags[NN_maskmovq] = false; // Byte Mask write -SMPDefsFlags[NN_movntps] = false; // Move Aligned Four Packed Single-FP Non Temporal -SMPDefsFlags[NN_movntq] = false; // Move 64 Bits Non Temporal -SMPDefsFlags[NN_prefetcht0] = false; // Prefetch to all cache levels -SMPDefsFlags[NN_prefetcht1] = false; // Prefetch to all cache levels -SMPDefsFlags[NN_prefetcht2] = false; // Prefetch to L2 cache -SMPDefsFlags[NN_prefetchnta] = false; // Prefetch to L1 cache -SMPDefsFlags[NN_sfence] = false; // Store Fence - -// Pentium III Pseudo instructions - -SMPDefsFlags[NN_cmpeqps] = false; // Packed Single-FP Compare EQ -SMPDefsFlags[NN_cmpltps] = false; // Packed Single-FP Compare LT -SMPDefsFlags[NN_cmpleps] = false; // Packed Single-FP Compare LE -SMPDefsFlags[NN_cmpunordps] = false; // Packed Single-FP Compare UNORD -SMPDefsFlags[NN_cmpneqps] = false; // Packed Single-FP Compare NOT EQ -SMPDefsFlags[NN_cmpnltps] = false; // Packed Single-FP Compare NOT LT -SMPDefsFlags[NN_cmpnleps] = false; // Packed Single-FP Compare NOT LE -SMPDefsFlags[NN_cmpordps] = false; // Packed Single-FP Compare ORDERED -SMPDefsFlags[NN_cmpeqss] = false; // Scalar Single-FP Compare EQ -SMPDefsFlags[NN_cmpltss] = false; // Scalar Single-FP Compare LT -SMPDefsFlags[NN_cmpless] = false; // Scalar Single-FP Compare LE -SMPDefsFlags[NN_cmpunordss] = false; // Scalar Single-FP Compare UNORD -SMPDefsFlags[NN_cmpneqss] = false; // Scalar Single-FP Compare NOT EQ -SMPDefsFlags[NN_cmpnltss] = false; // Scalar Single-FP Compare NOT LT -SMPDefsFlags[NN_cmpnless] = false; // Scalar Single-FP Compare NOT LE -SMPDefsFlags[NN_cmpordss] = false; // Scalar Single-FP Compare ORDERED - -// AMD K7 instructions - -// Revisit AMD if we port to it. -SMPDefsFlags[NN_pf2iw] = false; // Packed Floating-Point to Integer with Sign Extend -SMPDefsFlags[NN_pfnacc] = false; // Packed Floating-Point Negative Accumulate -SMPDefsFlags[NN_pfpnacc] = false; // Packed Floating-Point Mixed Positive-Negative Accumulate -SMPDefsFlags[NN_pi2fw] = false; // Packed 16-bit Integer to Floating-Point -SMPDefsFlags[NN_pswapd] = false; // Packed Swap Double Word - -// Undocumented FP instructions (thanks to norbert.juffa@adm.com) - -SMPDefsFlags[NN_fstp1] = false; // Alias of Store Real and Pop -SMPDefsFlags[NN_fxch4] = false; // Alias of Exchange Registers -SMPDefsFlags[NN_ffreep] = false; // Free Register and Pop -SMPDefsFlags[NN_fxch7] = false; // Alias of Exchange Registers -SMPDefsFlags[NN_fstp8] = false; // Alias of Store Real and Pop -SMPDefsFlags[NN_fstp9] = false; // Alias of Store Real and Pop - -// Pentium 4 instructions - -SMPDefsFlags[NN_addpd] = false; // Add Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_addsd] = false; // Add Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_andnpd] = false; // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_andpd] = false; // Bitwise Logical AND of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_clflush] = false; // Flush Cache Line -SMPDefsFlags[NN_cmppd] = false; // Compare Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_cmpsd] = false; // Compare Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_cvtdq2pd] = false; // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_cvtdq2ps] = false; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_cvtpd2dq] = false; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -SMPDefsFlags[NN_cvtpd2pi] = false; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -SMPDefsFlags[NN_cvtpd2ps] = false; // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_cvtpi2pd] = false; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_cvtps2dq] = false; // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers -SMPDefsFlags[NN_cvtps2pd] = false; // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_cvtsd2si] = false; // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer -SMPDefsFlags[NN_cvtsd2ss] = false; // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value -SMPDefsFlags[NN_cvtsi2sd] = false; // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value -SMPDefsFlags[NN_cvtss2sd] = false; // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value -SMPDefsFlags[NN_cvttpd2dq] = false; // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -SMPDefsFlags[NN_cvttpd2pi] = false; // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -SMPDefsFlags[NN_cvttps2dq] = false; // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers -SMPDefsFlags[NN_cvttsd2si] = false; // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer -SMPDefsFlags[NN_divpd] = false; // Divide Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_divsd] = false; // Divide Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_lfence] = false; // Load Fence -SMPDefsFlags[NN_maskmovdqu] = false; // Store Selected Bytes of Double Quadword -SMPDefsFlags[NN_maxpd] = false; // Return Maximum Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_maxsd] = false; // Return Maximum Scalar Double-Precision Floating-Point Value -SMPDefsFlags[NN_mfence] = false; // Memory Fence -SMPDefsFlags[NN_minpd] = false; // Return Minimum Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_minsd] = false; // Return Minimum Scalar Double-Precision Floating-Point Value -SMPDefsFlags[NN_movapd] = false; // Move Aligned Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_movdq2q] = false; // Move Quadword from XMM to MMX Register -SMPDefsFlags[NN_movdqa] = false; // Move Aligned Double Quadword -SMPDefsFlags[NN_movdqu] = false; // Move Unaligned Double Quadword -SMPDefsFlags[NN_movhpd] = false; // Move High Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_movlpd] = false; // Move Low Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_movmskpd] = false; // Extract Packed Double-Precision Floating-Point Sign Mask -SMPDefsFlags[NN_movntdq] = false; // Store Double Quadword Using Non-Temporal Hint -SMPDefsFlags[NN_movnti] = false; // Store Doubleword Using Non-Temporal Hint -SMPDefsFlags[NN_movntpd] = false; // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint -SMPDefsFlags[NN_movq2dq] = false; // Move Quadword from MMX to XMM Register -SMPDefsFlags[NN_movsd] = false; // Move Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_movupd] = false; // Move Unaligned Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_mulpd] = false; // Multiply Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_mulsd] = false; // Multiply Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_orpd] = false; // Bitwise Logical OR of Double-Precision Floating-Point Values -SMPDefsFlags[NN_paddq] = false; // Add Packed Quadword Integers -SMPDefsFlags[NN_pause] = false; // Spin Loop Hint -SMPDefsFlags[NN_pmuludq] = false; // Multiply Packed Unsigned Doubleword Integers -SMPDefsFlags[NN_pshufd] = false; // Shuffle Packed Doublewords -SMPDefsFlags[NN_pshufhw] = false; // Shuffle Packed High Words -SMPDefsFlags[NN_pshuflw] = false; // Shuffle Packed Low Words -SMPDefsFlags[NN_pslldq] = false; // Shift Double Quadword Left Logical -SMPDefsFlags[NN_psrldq] = false; // Shift Double Quadword Right Logical -SMPDefsFlags[NN_psubq] = false; // Subtract Packed Quadword Integers -SMPDefsFlags[NN_punpckhqdq] = false; // Unpack High Data -SMPDefsFlags[NN_punpcklqdq] = false; // Unpack Low Data -SMPDefsFlags[NN_shufpd] = false; // Shuffle Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_sqrtpd] = false; // Compute Square Roots of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_sqrtsd] = false; // Compute Square Rootof Scalar Double-Precision Floating-Point Value -SMPDefsFlags[NN_subpd] = false; // Subtract Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_subsd] = false; // Subtract Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_unpckhpd] = false; // Unpack and Interleave High Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_unpcklpd] = false; // Unpack and Interleave Low Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_xorpd] = false; // Bitwise Logical OR of Double-Precision Floating-Point Values - - -// AMD syscall/sysret instructions NOTE: not AMD, found in Intel manual - - -// AMD64 instructions NOTE: not AMD, found in Intel manual - -SMPDefsFlags[NN_swapgs] = false; // Exchange GS base with KernelGSBase MSR - -// New Pentium instructions (SSE3) - -SMPDefsFlags[NN_movddup] = false; // Move One Double-FP and Duplicate -SMPDefsFlags[NN_movshdup] = false; // Move Packed Single-FP High and Duplicate -SMPDefsFlags[NN_movsldup] = false; // Move Packed Single-FP Low and Duplicate - -// Missing AMD64 instructions NOTE: also found in Intel manual - -SMPDefsFlags[NN_movsxd] = false; // Move with Sign-Extend Doubleword - -// SSE3 instructions - -SMPDefsFlags[NN_addsubpd] = false; // Add /Sub packed DP FP numbers -SMPDefsFlags[NN_addsubps] = false; // Add /Sub packed SP FP numbers -SMPDefsFlags[NN_haddpd] = false; // Add horizontally packed DP FP numbers -SMPDefsFlags[NN_haddps] = false; // Add horizontally packed SP FP numbers -SMPDefsFlags[NN_hsubpd] = false; // Sub horizontally packed DP FP numbers -SMPDefsFlags[NN_hsubps] = false; // Sub horizontally packed SP FP numbers -SMPDefsFlags[NN_monitor] = false; // Set up a linear address range to be monitored by hardware -SMPDefsFlags[NN_mwait] = false; // Wait until write-back store performed within the range specified by the MONITOR instruction -SMPDefsFlags[NN_fisttp] = false; // Store ST in intXX (chop) and pop -SMPDefsFlags[NN_lddqu] = false; // Load unaligned integer 128-bit - -// SSSE3 instructions - -SMPDefsFlags[NN_psignb] = false; // Packed SIGN Byte -SMPDefsFlags[NN_psignw] = false; // Packed SIGN Word -SMPDefsFlags[NN_psignd] = false; // Packed SIGN Doubleword -SMPDefsFlags[NN_pshufb] = false; // Packed Shuffle Bytes -SMPDefsFlags[NN_pmulhrsw] = false; // Packed Multiply High with Round and Scale -SMPDefsFlags[NN_pmaddubsw] = false; // Multiply and Add Packed Signed and Unsigned Bytes -SMPDefsFlags[NN_phsubsw] = false; // Packed Horizontal Subtract and Saturate -SMPDefsFlags[NN_phaddsw] = false; // Packed Horizontal Add and Saturate -SMPDefsFlags[NN_phaddw] = false; // Packed Horizontal Add Word -SMPDefsFlags[NN_phaddd] = false; // Packed Horizontal Add Doubleword -SMPDefsFlags[NN_phsubw] = false; // Packed Horizontal Subtract Word -SMPDefsFlags[NN_phsubd] = false; // Packed Horizontal Subtract Doubleword -SMPDefsFlags[NN_palignr] = false; // Packed Align Right -SMPDefsFlags[NN_pabsb] = false; // Packed Absolute Value Byte -SMPDefsFlags[NN_pabsw] = false; // Packed Absolute Value Word -SMPDefsFlags[NN_pabsd] = false; // Packed Absolute Value Doubleword - -// VMX instructions - -#if 599 < IDA_SDK_VERSION - -SMPDefsFlags[NN_ud2] = false; // Undefined Instruction - -// Added with x86-64 - -SMPDefsFlags[NN_rdtscp] = false; // Read Time-Stamp Counter and Processor ID - -// Geode LX 3DNow! extensions - -SMPDefsFlags[NN_pfrcpv] = false; // Reciprocal Approximation for a Pair of 32-bit Floats -SMPDefsFlags[NN_pfrsqrtv] = false; // Reciprocal Square Root Approximation for a Pair of 32-bit Floats - -// SSE2 pseudoinstructions - -SMPDefsFlags[NN_cmpeqpd] = false; // Packed Double-FP Compare EQ -SMPDefsFlags[NN_cmpltpd] = false; // Packed Double-FP Compare LT -SMPDefsFlags[NN_cmplepd] = false; // Packed Double-FP Compare LE -SMPDefsFlags[NN_cmpunordpd] = false; // Packed Double-FP Compare UNORD -SMPDefsFlags[NN_cmpneqpd] = false; // Packed Double-FP Compare NOT EQ -SMPDefsFlags[NN_cmpnltpd] = false; // Packed Double-FP Compare NOT LT -SMPDefsFlags[NN_cmpnlepd] = false; // Packed Double-FP Compare NOT LE -SMPDefsFlags[NN_cmpordpd] = false; // Packed Double-FP Compare ORDERED -SMPDefsFlags[NN_cmpeqsd] = false; // Scalar Double-FP Compare EQ -SMPDefsFlags[NN_cmpltsd] = false; // Scalar Double-FP Compare LT -SMPDefsFlags[NN_cmplesd] = false; // Scalar Double-FP Compare LE -SMPDefsFlags[NN_cmpunordsd] = false; // Scalar Double-FP Compare UNORD -SMPDefsFlags[NN_cmpneqsd] = false; // Scalar Double-FP Compare NOT EQ -SMPDefsFlags[NN_cmpnltsd] = false; // Scalar Double-FP Compare NOT LT -SMPDefsFlags[NN_cmpnlesd] = false; // Scalar Double-FP Compare NOT LE -SMPDefsFlags[NN_cmpordsd] = false; // Scalar Double-FP Compare ORDERED - -// SSSE4.1 instructions - -SMPDefsFlags[NN_blendpd] = false; // Blend Packed Double Precision Floating-Point Values -SMPDefsFlags[NN_blendps] = false; // Blend Packed Single Precision Floating-Point Values -SMPDefsFlags[NN_blendvpd] = false; // Variable Blend Packed Double Precision Floating-Point Values -SMPDefsFlags[NN_blendvps] = false; // Variable Blend Packed Single Precision Floating-Point Values -SMPDefsFlags[NN_dppd] = false; // Dot Product of Packed Double Precision Floating-Point Values -SMPDefsFlags[NN_dpps] = false; // Dot Product of Packed Single Precision Floating-Point Values -SMPDefsFlags[NN_extractps] = 2; // Extract Packed Single Precision Floating-Point Value -SMPDefsFlags[NN_insertps] = false; // Insert Packed Single Precision Floating-Point Value -SMPDefsFlags[NN_movntdqa] = false; // Load Double Quadword Non-Temporal Aligned Hint -SMPDefsFlags[NN_mpsadbw] = false; // Compute Multiple Packed Sums of Absolute Difference -SMPDefsFlags[NN_packusdw] = false; // Pack with Unsigned Saturation -SMPDefsFlags[NN_pblendvb] = false; // Variable Blend Packed Bytes -SMPDefsFlags[NN_pblendw] = false; // Blend Packed Words -SMPDefsFlags[NN_pcmpeqq] = false; // Compare Packed Qword Data for Equal -SMPDefsFlags[NN_pextrb] = false; // Extract Byte -SMPDefsFlags[NN_pextrd] = false; // Extract Dword -SMPDefsFlags[NN_pextrq] = false; // Extract Qword -SMPDefsFlags[NN_phminposuw] = false; // Packed Horizontal Word Minimum -SMPDefsFlags[NN_pinsrb] = false; // Insert Byte -SMPDefsFlags[NN_pinsrd] = false; // Insert Dword -SMPDefsFlags[NN_pinsrq] = false; // Insert Qword -SMPDefsFlags[NN_pmaxsb] = false; // Maximum of Packed Signed Byte Integers -SMPDefsFlags[NN_pmaxsd] = false; // Maximum of Packed Signed Dword Integers -SMPDefsFlags[NN_pmaxud] = false; // Maximum of Packed Unsigned Dword Integers -SMPDefsFlags[NN_pmaxuw] = false; // Maximum of Packed Word Integers -SMPDefsFlags[NN_pminsb] = false; // Minimum of Packed Signed Byte Integers -SMPDefsFlags[NN_pminsd] = false; // Minimum of Packed Signed Dword Integers -SMPDefsFlags[NN_pminud] = false; // Minimum of Packed Unsigned Dword Integers -SMPDefsFlags[NN_pminuw] = false; // Minimum of Packed Word Integers -SMPDefsFlags[NN_pmovsxbw] = false; // Packed Move with Sign Extend -SMPDefsFlags[NN_pmovsxbd] = false; // Packed Move with Sign Extend -SMPDefsFlags[NN_pmovsxbq] = false; // Packed Move with Sign Extend -SMPDefsFlags[NN_pmovsxwd] = false; // Packed Move with Sign Extend -SMPDefsFlags[NN_pmovsxwq] = false; // Packed Move with Sign Extend -SMPDefsFlags[NN_pmovsxdq] = false; // Packed Move with Sign Extend -SMPDefsFlags[NN_pmovzxbw] = false; // Packed Move with Zero Extend -SMPDefsFlags[NN_pmovzxbd] = false; // Packed Move with Zero Extend -SMPDefsFlags[NN_pmovzxbq] = false; // Packed Move with Zero Extend -SMPDefsFlags[NN_pmovzxwd] = false; // Packed Move with Zero Extend -SMPDefsFlags[NN_pmovzxwq] = false; // Packed Move with Zero Extend -SMPDefsFlags[NN_pmovzxdq] = false; // Packed Move with Zero Extend -SMPDefsFlags[NN_pmuldq] = false; // Multiply Packed Signed Dword Integers -SMPDefsFlags[NN_pmulld] = false; // Multiply Packed Signed Dword Integers and Store Low Result -SMPDefsFlags[NN_roundpd] = false; // Round Packed Double Precision Floating-Point Values -SMPDefsFlags[NN_roundps] = false; // Round Packed Single Precision Floating-Point Values -SMPDefsFlags[NN_roundsd] = false; // Round Scalar Double Precision Floating-Point Values -SMPDefsFlags[NN_roundss] = false; // Round Scalar Single Precision Floating-Point Values - -// SSSE4.2 instructions -SMPDefsFlags[NN_crc32] = false; // Accumulate CRC32 Value -SMPDefsFlags[NN_pcmpgtq] = false; // Compare Packed Data for Greater Than - -// AMD SSE4a instructions - -SMPDefsFlags[NN_extrq] = false; // Extract Field From Register -SMPDefsFlags[NN_insertq] = false; // Insert Field -SMPDefsFlags[NN_movntsd] = false; // Move Non-Temporal Scalar Double-Precision Floating-Point -SMPDefsFlags[NN_movntss] = false; // Move Non-Temporal Scalar Single-Precision Floating-Point - -// xsave/xrstor instructions - -SMPDefsFlags[NN_xgetbv] = false; // Get Value of Extended Control Register -SMPDefsFlags[NN_xrstor] = false; // Restore Processor Extended States -SMPDefsFlags[NN_xsave] = false; // Save Processor Extended States -SMPDefsFlags[NN_xsetbv] = false; // Set Value of Extended Control Register - -// Intel Safer Mode Extensions (SMX) - -// AMD-V Virtualization ISA Extension - -SMPDefsFlags[NN_invlpga] = false; // Invalidate TLB Entry in a Specified ASID -SMPDefsFlags[NN_skinit] = false; // Secure Init and Jump with Attestation -SMPDefsFlags[NN_vmexit] = false; // Stop Executing Guest, Begin Executing Host -SMPDefsFlags[NN_vmload] = false; // Load State from VMCB -SMPDefsFlags[NN_vmmcall] = false; // Call VMM -SMPDefsFlags[NN_vmrun] = false; // Run Virtual Machine -SMPDefsFlags[NN_vmsave] = false; // Save State to VMCB - -// VMX+ instructions - -SMPDefsFlags[NN_invept] = false; // Invalidate Translations Derived from EPT -SMPDefsFlags[NN_invvpid] = false; // Invalidate Translations Based on VPID - -// Intel Atom instructions - -SMPDefsFlags[NN_movbe] = false; // Move Data After Swapping Bytes - -// Intel AES instructions - -SMPDefsFlags[NN_aesenc] = false; // Perform One Round of an AES Encryption Flow -SMPDefsFlags[NN_aesenclast] = false; // Perform the Last Round of an AES Encryption Flow -SMPDefsFlags[NN_aesdec] = false; // Perform One Round of an AES Decryption Flow -SMPDefsFlags[NN_aesdeclast] = false; // Perform the Last Round of an AES Decryption Flow -SMPDefsFlags[NN_aesimc] = false; // Perform the AES InvMixColumn Transformation -SMPDefsFlags[NN_aeskeygenassist] = false; // AES Round Key Generation Assist - -// Carryless multiplication - -SMPDefsFlags[NN_pclmulqdq] = false; // Carry-Less Multiplication Quadword - -// Returns modified by operand size prefixes - -SMPDefsFlags[NN_retnw] = false; // Return Near from Procedure (use16) -SMPDefsFlags[NN_retnd] = false; // Return Near from Procedure (use32) -SMPDefsFlags[NN_retnq] = false; // Return Near from Procedure (use64) -SMPDefsFlags[NN_retfw] = false; // Return Far from Procedure (use16) -SMPDefsFlags[NN_retfd] = false; // Return Far from Procedure (use32) -SMPDefsFlags[NN_retfq] = false; // Return Far from Procedure (use64) - -// RDRAND support - -// new GPR instructions - -SMPDefsFlags[NN_mulx] = false; // Unsigned Multiply Without Affecting Flags -SMPDefsFlags[NN_pdep] = false; // Parallel Bits Deposit -SMPDefsFlags[NN_pext] = false; // Parallel Bits Extract -SMPDefsFlags[NN_rorx] = false; // Rotate Right Logical Without Affecting Flags -SMPDefsFlags[NN_sarx] = false; // Shift Arithmetically Right Without Affecting Flags -SMPDefsFlags[NN_shlx] = false; // Shift Logically Left Without Affecting Flags -SMPDefsFlags[NN_shrx] = false; // Shift Logically Right Without Affecting Flags - -SMPDefsFlags[NN_xsaveopt] = false; // Save Processor Extended States Optimized -SMPDefsFlags[NN_invpcid] = false; // Invalidate Processor Context ID -SMPDefsFlags[NN_rdseed] = false; // Read Random Seed -SMPDefsFlags[NN_rdfsbase] = false; // Read FS Segment Base -SMPDefsFlags[NN_rdgsbase] = false; // Read GS Segment Base -SMPDefsFlags[NN_wrfsbase] = false; // Write FS Segment Base -SMPDefsFlags[NN_wrgsbase] = false; // Write GS Segment Base - -// new AVX instructions - -SMPDefsFlags[NN_vaddpd] = false; // Add Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vaddps] = false; // Packed Single-FP Add -SMPDefsFlags[NN_vaddsd] = false; // Add Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vaddss] = false; // Scalar Single-FP Add -SMPDefsFlags[NN_vaddsubpd] = false; // Add /Sub packed DP FP numbers -SMPDefsFlags[NN_vaddsubps] = false; // Add /Sub packed SP FP numbers -SMPDefsFlags[NN_vaesdec] = false; // Perform One Round of an AES Decryption Flow -SMPDefsFlags[NN_vaesdeclast] = false; // Perform the Last Round of an AES Decryption Flow -SMPDefsFlags[NN_vaesenc] = false; // Perform One Round of an AES Encryption Flow -SMPDefsFlags[NN_vaesenclast] = false; // Perform the Last Round of an AES Encryption Flow -SMPDefsFlags[NN_vaesimc] = false; // Perform the AES InvMixColumn Transformation -SMPDefsFlags[NN_vaeskeygenassist] = false; // AES Round Key Generation Assist -SMPDefsFlags[NN_vandnpd] = false; // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vandnps] = false; // Bitwise Logical And Not for Single-FP -SMPDefsFlags[NN_vandpd] = false; // Bitwise Logical AND of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vandps] = false; // Bitwise Logical And for Single-FP -SMPDefsFlags[NN_vblendpd] = false; // Blend Packed Double Precision Floating-Point Values -SMPDefsFlags[NN_vblendps] = false; // Blend Packed Single Precision Floating-Point Values -SMPDefsFlags[NN_vblendvpd] = false; // Variable Blend Packed Double Precision Floating-Point Values -SMPDefsFlags[NN_vblendvps] = false; // Variable Blend Packed Single Precision Floating-Point Values -SMPDefsFlags[NN_vbroadcastf128] = false; // Broadcast 128 Bits of Floating-Point Data -SMPDefsFlags[NN_vbroadcasti128] = false; // Broadcast 128 Bits of Integer Data -SMPDefsFlags[NN_vbroadcastsd] = false; // Broadcast Double-Precision Floating-Point Element -SMPDefsFlags[NN_vbroadcastss] = false; // Broadcast Single-Precision Floating-Point Element -SMPDefsFlags[NN_vcmppd] = false; // Compare Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vcmpps] = false; // Packed Single-FP Compare -SMPDefsFlags[NN_vcmpsd] = false; // Compare Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vcmpss] = false; // Scalar Single-FP Compare -SMPDefsFlags[NN_vcomisd] = false; // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS -SMPDefsFlags[NN_vcomiss] = false; // Scalar Ordered Single-FP Compare and Set EFLAGS -SMPDefsFlags[NN_vcvtdq2pd] = false; // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vcvtdq2ps] = false; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vcvtpd2dq] = false; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -SMPDefsFlags[NN_vcvtpd2ps] = false; // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vcvtph2ps] = false; // Convert 16-bit FP Values to Single-Precision FP Values -SMPDefsFlags[NN_vcvtps2dq] = false; // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers -SMPDefsFlags[NN_vcvtps2pd] = false; // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vcvtps2ph] = false; // Convert Single-Precision FP value to 16-bit FP value -SMPDefsFlags[NN_vcvtsd2si] = false; // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer -SMPDefsFlags[NN_vcvtsd2ss] = false; // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value -SMPDefsFlags[NN_vcvtsi2sd] = false; // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value -SMPDefsFlags[NN_vcvtsi2ss] = false; // Scalar signed INT32 to Single-FP conversion -SMPDefsFlags[NN_vcvtss2sd] = false; // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value -SMPDefsFlags[NN_vcvtss2si] = false; // Scalar Single-FP to signed INT32 conversion -SMPDefsFlags[NN_vcvttpd2dq] = false; // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -SMPDefsFlags[NN_vcvttps2dq] = false; // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers -SMPDefsFlags[NN_vcvttsd2si] = false; // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer -SMPDefsFlags[NN_vcvttss2si] = false; // Scalar Single-FP to signed INT32 conversion (truncate) -SMPDefsFlags[NN_vdivpd] = false; // Divide Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vdivps] = false; // Packed Single-FP Divide -SMPDefsFlags[NN_vdivsd] = false; // Divide Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vdivss] = false; // Scalar Single-FP Divide -SMPDefsFlags[NN_vdppd] = false; // Dot Product of Packed Double Precision Floating-Point Values -SMPDefsFlags[NN_vdpps] = false; // Dot Product of Packed Single Precision Floating-Point Values -SMPDefsFlags[NN_vextractf128] = false; // Extract Packed Floating-Point Values -SMPDefsFlags[NN_vextracti128] = false; // Extract Packed Integer Values -SMPDefsFlags[NN_vextractps] = false; // Extract Packed Floating-Point Values -SMPDefsFlags[NN_vfmadd132pd] = false; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmadd132ps] = false; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmadd132sd] = false; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmadd132ss] = false; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmadd213pd] = false; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmadd213ps] = false; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmadd213sd] = false; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmadd213ss] = false; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmadd231pd] = false; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmadd231ps] = false; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmadd231sd] = false; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmadd231ss] = false; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmaddsub132pd] = false; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmaddsub132ps] = false; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmaddsub213pd] = false; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmaddsub213ps] = false; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmaddsub231pd] = false; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmaddsub231ps] = false; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsub132pd] = false; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsub132ps] = false; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsub132sd] = false; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsub132ss] = false; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsub213pd] = false; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsub213ps] = false; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsub213sd] = false; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsub213ss] = false; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsub231pd] = false; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsub231ps] = false; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsub231sd] = false; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsub231ss] = false; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsubadd132pd] = false; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsubadd132ps] = false; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsubadd213pd] = false; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsubadd213ps] = false; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsubadd231pd] = false; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfmsubadd231ps] = false; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmadd132pd] = false; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmadd132ps] = false; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmadd132sd] = false; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmadd132ss] = false; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmadd213pd] = false; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmadd213ps] = false; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmadd213sd] = false; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmadd213ss] = false; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmadd231pd] = false; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmadd231ps] = false; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmadd231sd] = false; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmadd231ss] = false; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmsub132pd] = false; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmsub132ps] = false; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmsub132sd] = false; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmsub132ss] = false; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmsub213pd] = false; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmsub213ps] = false; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmsub213sd] = false; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmsub213ss] = false; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmsub231pd] = false; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmsub231ps] = false; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmsub231sd] = false; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vfnmsub231ss] = false; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values -SMPDefsFlags[NN_vgatherdps] = false; // Gather Packed SP FP Values Using Signed Dword Indices -SMPDefsFlags[NN_vgatherdpd] = false; // Gather Packed DP FP Values Using Signed Dword Indices -SMPDefsFlags[NN_vgatherqps] = false; // Gather Packed SP FP Values Using Signed Qword Indices -SMPDefsFlags[NN_vgatherqpd] = false; // Gather Packed DP FP Values Using Signed Qword Indices -SMPDefsFlags[NN_vhaddpd] = false; // Add horizontally packed DP FP numbers -SMPDefsFlags[NN_vhaddps] = false; // Add horizontally packed SP FP numbers -SMPDefsFlags[NN_vhsubpd] = false; // Sub horizontally packed DP FP numbers -SMPDefsFlags[NN_vhsubps] = false; // Sub horizontally packed SP FP numbers -SMPDefsFlags[NN_vinsertf128] = false; // Insert Packed Floating-Point Values -SMPDefsFlags[NN_vinserti128] = false; // Insert Packed Integer Values -SMPDefsFlags[NN_vinsertps] = false; // Insert Packed Single Precision Floating-Point Value -SMPDefsFlags[NN_vlddqu] = false; // Load Unaligned Packed Integer Values -SMPDefsFlags[NN_vldmxcsr] = false; // Load Streaming SIMD Extensions Technology Control/Status Register -SMPDefsFlags[NN_vmaskmovdqu] = false; // Store Selected Bytes of Double Quadword with NT Hint -SMPDefsFlags[NN_vmaskmovpd] = false; // Conditionally Load Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vmaskmovps] = false; // Conditionally Load Packed Single-Precision Floating-Point Values -SMPDefsFlags[NN_vmaxpd] = false; // Return Maximum Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vmaxps] = false; // Packed Single-FP Maximum -SMPDefsFlags[NN_vmaxsd] = false; // Return Maximum Scalar Double-Precision Floating-Point Value -SMPDefsFlags[NN_vmaxss] = false; // Scalar Single-FP Maximum -SMPDefsFlags[NN_vminpd] = false; // Return Minimum Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vminps] = false; // Packed Single-FP Minimum -SMPDefsFlags[NN_vminsd] = false; // Return Minimum Scalar Double-Precision Floating-Point Value -SMPDefsFlags[NN_vminss] = false; // Scalar Single-FP Minimum -SMPDefsFlags[NN_vmovapd] = false; // Move Aligned Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vmovaps] = false; // Move Aligned Four Packed Single-FP -SMPDefsFlags[NN_vmovd] = false; // Move 32 bits -SMPDefsFlags[NN_vmovddup] = false; // Move One Double-FP and Duplicate -SMPDefsFlags[NN_vmovdqa] = false; // Move Aligned Double Quadword -SMPDefsFlags[NN_vmovdqu] = false; // Move Unaligned Double Quadword -SMPDefsFlags[NN_vmovhlps] = false; // Move High to Low Packed Single-FP -SMPDefsFlags[NN_vmovhpd] = false; // Move High Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vmovhps] = false; // Move High Packed Single-FP -SMPDefsFlags[NN_vmovlhps] = false; // Move Low to High Packed Single-FP -SMPDefsFlags[NN_vmovlpd] = false; // Move Low Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vmovlps] = false; // Move Low Packed Single-FP -SMPDefsFlags[NN_vmovmskpd] = false; // Extract Packed Double-Precision Floating-Point Sign Mask -SMPDefsFlags[NN_vmovmskps] = false; // Move Mask to Register -SMPDefsFlags[NN_vmovntdq] = false; // Store Double Quadword Using Non-Temporal Hint -SMPDefsFlags[NN_vmovntdqa] = false; // Load Double Quadword Non-Temporal Aligned Hint -SMPDefsFlags[NN_vmovntpd] = false; // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint -SMPDefsFlags[NN_vmovntps] = false; // Move Aligned Four Packed Single-FP Non Temporal -SMPDefsFlags[NN_vmovntsd] = false; // Move Non-Temporal Scalar Double-Precision Floating-Point -SMPDefsFlags[NN_vmovntss] = false; // Move Non-Temporal Scalar Single-Precision Floating-Point -SMPDefsFlags[NN_vmovq] = false; // Move 64 bits -SMPDefsFlags[NN_vmovsd] = false; // Move Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vmovshdup] = false; // Move Packed Single-FP High and Duplicate -SMPDefsFlags[NN_vmovsldup] = false; // Move Packed Single-FP Low and Duplicate -SMPDefsFlags[NN_vmovss] = false; // Move Scalar Single-FP -SMPDefsFlags[NN_vmovupd] = false; // Move Unaligned Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vmovups] = false; // Move Unaligned Four Packed Single-FP -SMPDefsFlags[NN_vmpsadbw] = false; // Compute Multiple Packed Sums of Absolute Difference -SMPDefsFlags[NN_vmulpd] = false; // Multiply Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vmulps] = false; // Packed Single-FP Multiply -SMPDefsFlags[NN_vmulsd] = false; // Multiply Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vmulss] = false; // Scalar Single-FP Multiply -SMPDefsFlags[NN_vorpd] = false; // Bitwise Logical OR of Double-Precision Floating-Point Values -SMPDefsFlags[NN_vorps] = false; // Bitwise Logical OR for Single-FP Data -SMPDefsFlags[NN_vpabsb] = false; // Packed Absolute Value Byte -SMPDefsFlags[NN_vpabsd] = false; // Packed Absolute Value Doubleword -SMPDefsFlags[NN_vpabsw] = false; // Packed Absolute Value Word -SMPDefsFlags[NN_vpackssdw] = false; // Pack with Signed Saturation (Dword->Word) -SMPDefsFlags[NN_vpacksswb] = false; // Pack with Signed Saturation (Word->Byte) -SMPDefsFlags[NN_vpackusdw] = false; // Pack with Unsigned Saturation -SMPDefsFlags[NN_vpackuswb] = false; // Pack with Unsigned Saturation (Word->Byte) -SMPDefsFlags[NN_vpaddb] = false; // Packed Add Byte -SMPDefsFlags[NN_vpaddd] = false; // Packed Add Dword -SMPDefsFlags[NN_vpaddq] = false; // Add Packed Quadword Integers -SMPDefsFlags[NN_vpaddsb] = false; // Packed Add with Saturation (Byte) -SMPDefsFlags[NN_vpaddsw] = false; // Packed Add with Saturation (Word) -SMPDefsFlags[NN_vpaddusb] = false; // Packed Add Unsigned with Saturation (Byte) -SMPDefsFlags[NN_vpaddusw] = false; // Packed Add Unsigned with Saturation (Word) -SMPDefsFlags[NN_vpaddw] = false; // Packed Add Word -SMPDefsFlags[NN_vpalignr] = false; // Packed Align Right -SMPDefsFlags[NN_vpand] = false; // Bitwise Logical And -SMPDefsFlags[NN_vpandn] = false; // Bitwise Logical And Not -SMPDefsFlags[NN_vpavgb] = false; // Packed Average (Byte) -SMPDefsFlags[NN_vpavgw] = false; // Packed Average (Word) -SMPDefsFlags[NN_vpblendd] = false; // Blend Packed Dwords -SMPDefsFlags[NN_vpblendvb] = false; // Variable Blend Packed Bytes -SMPDefsFlags[NN_vpblendw] = false; // Blend Packed Words -SMPDefsFlags[NN_vpbroadcastb] = false; // Broadcast a Byte Integer -SMPDefsFlags[NN_vpbroadcastd] = false; // Broadcast a Dword Integer -SMPDefsFlags[NN_vpbroadcastq] = false; // Broadcast a Qword Integer -SMPDefsFlags[NN_vpbroadcastw] = false; // Broadcast a Word Integer -SMPDefsFlags[NN_vpclmulqdq] = false; // Carry-Less Multiplication Quadword -SMPDefsFlags[NN_vpcmpeqb] = false; // Packed Compare for Equal (Byte) -SMPDefsFlags[NN_vpcmpeqd] = false; // Packed Compare for Equal (Dword) -SMPDefsFlags[NN_vpcmpeqq] = false; // Compare Packed Qword Data for Equal -SMPDefsFlags[NN_vpcmpeqw] = false; // Packed Compare for Equal (Word) -SMPDefsFlags[NN_vpcmpestri] = false; // Packed Compare Explicit Length Strings, Return Index -SMPDefsFlags[NN_vpcmpestrm] = false; // Packed Compare Explicit Length Strings, Return Mask -SMPDefsFlags[NN_vpcmpgtb] = false; // Packed Compare for Greater Than (Byte) -SMPDefsFlags[NN_vpcmpgtd] = false; // Packed Compare for Greater Than (Dword) -SMPDefsFlags[NN_vpcmpgtq] = false; // Compare Packed Data for Greater Than -SMPDefsFlags[NN_vpcmpgtw] = false; // Packed Compare for Greater Than (Word) -SMPDefsFlags[NN_vpcmpistri] = false; // Packed Compare Implicit Length Strings, Return Index -SMPDefsFlags[NN_vpcmpistrm] = false; // Packed Compare Implicit Length Strings, Return Mask -SMPDefsFlags[NN_vperm2f128] = false; // Permute Floating-Point Values -SMPDefsFlags[NN_vperm2i128] = false; // Permute Integer Values -SMPDefsFlags[NN_vpermd] = false; // Full Doublewords Element Permutation -SMPDefsFlags[NN_vpermilpd] = false; // Permute Double-Precision Floating-Point Values -SMPDefsFlags[NN_vpermilps] = false; // Permute Single-Precision Floating-Point Values -SMPDefsFlags[NN_vpermpd] = false; // Permute Double-Precision Floating-Point Elements -SMPDefsFlags[NN_vpermps] = false; // Permute Single-Precision Floating-Point Elements -SMPDefsFlags[NN_vpermq] = false; // Qwords Element Permutation -SMPDefsFlags[NN_vpextrb] = false; // Extract Byte -SMPDefsFlags[NN_vpextrd] = false; // Extract Dword -SMPDefsFlags[NN_vpextrq] = false; // Extract Qword -SMPDefsFlags[NN_vpextrw] = false; // Extract Word -SMPDefsFlags[NN_vpgatherdd] = false; // Gather Packed Dword Values Using Signed Dword Indices -SMPDefsFlags[NN_vpgatherdq] = false; // Gather Packed Qword Values Using Signed Dword Indices -SMPDefsFlags[NN_vpgatherqd] = false; // Gather Packed Dword Values Using Signed Qword Indices -SMPDefsFlags[NN_vpgatherqq] = false; // Gather Packed Qword Values Using Signed Qword Indices -SMPDefsFlags[NN_vphaddd] = false; // Packed Horizontal Add Doubleword -SMPDefsFlags[NN_vphaddsw] = false; // Packed Horizontal Add and Saturate -SMPDefsFlags[NN_vphaddw] = false; // Packed Horizontal Add Word -SMPDefsFlags[NN_vphminposuw] = false; // Packed Horizontal Word Minimum -SMPDefsFlags[NN_vphsubd] = false; // Packed Horizontal Subtract Doubleword -SMPDefsFlags[NN_vphsubsw] = false; // Packed Horizontal Subtract and Saturate -SMPDefsFlags[NN_vphsubw] = false; // Packed Horizontal Subtract Word -SMPDefsFlags[NN_vpinsrb] = false; // Insert Byte -SMPDefsFlags[NN_vpinsrd] = false; // Insert Dword -SMPDefsFlags[NN_vpinsrq] = false; // Insert Qword -SMPDefsFlags[NN_vpinsrw] = false; // Insert Word -SMPDefsFlags[NN_vpmaddubsw] = false; // Multiply and Add Packed Signed and Unsigned Bytes -SMPDefsFlags[NN_vpmaddwd] = false; // Packed Multiply and Add -SMPDefsFlags[NN_vpmaskmovd] = false; // Conditionally Store Dword Values Using Mask -SMPDefsFlags[NN_vpmaskmovq] = false; // Conditionally Store Qword Values Using Mask -SMPDefsFlags[NN_vpmaxsb] = false; // Maximum of Packed Signed Byte Integers -SMPDefsFlags[NN_vpmaxsd] = false; // Maximum of Packed Signed Dword Integers -SMPDefsFlags[NN_vpmaxsw] = false; // Packed Signed Integer Word Maximum -SMPDefsFlags[NN_vpmaxub] = false; // Packed Unsigned Integer Byte Maximum -SMPDefsFlags[NN_vpmaxud] = false; // Maximum of Packed Unsigned Dword Integers -SMPDefsFlags[NN_vpmaxuw] = false; // Maximum of Packed Word Integers -SMPDefsFlags[NN_vpminsb] = false; // Minimum of Packed Signed Byte Integers -SMPDefsFlags[NN_vpminsd] = false; // Minimum of Packed Signed Dword Integers -SMPDefsFlags[NN_vpminsw] = false; // Packed Signed Integer Word Minimum -SMPDefsFlags[NN_vpminub] = false; // Packed Unsigned Integer Byte Minimum -SMPDefsFlags[NN_vpminud] = false; // Minimum of Packed Unsigned Dword Integers -SMPDefsFlags[NN_vpminuw] = false; // Minimum of Packed Word Integers -SMPDefsFlags[NN_vpmovmskb] = false; // Move Byte Mask to Integer -SMPDefsFlags[NN_vpmovsxbd] = false; // Packed Move with Sign Extend -SMPDefsFlags[NN_vpmovsxbq] = false; // Packed Move with Sign Extend -SMPDefsFlags[NN_vpmovsxbw] = false; // Packed Move with Sign Extend -SMPDefsFlags[NN_vpmovsxdq] = false; // Packed Move with Sign Extend -SMPDefsFlags[NN_vpmovsxwd] = false; // Packed Move with Sign Extend -SMPDefsFlags[NN_vpmovsxwq] = false; // Packed Move with Sign Extend -SMPDefsFlags[NN_vpmovzxbd] = false; // Packed Move with Zero Extend -SMPDefsFlags[NN_vpmovzxbq] = false; // Packed Move with Zero Extend -SMPDefsFlags[NN_vpmovzxbw] = false; // Packed Move with Zero Extend -SMPDefsFlags[NN_vpmovzxdq] = false; // Packed Move with Zero Extend -SMPDefsFlags[NN_vpmovzxwd] = false; // Packed Move with Zero Extend -SMPDefsFlags[NN_vpmovzxwq] = false; // Packed Move with Zero Extend -SMPDefsFlags[NN_vpmuldq] = false; // Multiply Packed Signed Dword Integers -SMPDefsFlags[NN_vpmulhrsw] = false; // Packed Multiply High with Round and Scale -SMPDefsFlags[NN_vpmulhuw] = false; // Packed Multiply High Unsigned -SMPDefsFlags[NN_vpmulhw] = false; // Packed Multiply High -SMPDefsFlags[NN_vpmulld] = false; // Multiply Packed Signed Dword Integers and Store Low Result -SMPDefsFlags[NN_vpmullw] = false; // Packed Multiply Low -SMPDefsFlags[NN_vpmuludq] = false; // Multiply Packed Unsigned Doubleword Integers -SMPDefsFlags[NN_vpor] = false; // Bitwise Logical Or -SMPDefsFlags[NN_vpsadbw] = false; // Packed Sum of Absolute Differences -SMPDefsFlags[NN_vpshufb] = false; // Packed Shuffle Bytes -SMPDefsFlags[NN_vpshufd] = false; // Shuffle Packed Doublewords -SMPDefsFlags[NN_vpshufhw] = false; // Shuffle Packed High Words -SMPDefsFlags[NN_vpshuflw] = false; // Shuffle Packed Low Words -SMPDefsFlags[NN_vpsignb] = false; // Packed SIGN Byte -SMPDefsFlags[NN_vpsignd] = false; // Packed SIGN Doubleword -SMPDefsFlags[NN_vpsignw] = false; // Packed SIGN Word -SMPDefsFlags[NN_vpslld] = false; // Packed Shift Left Logical (Dword) -SMPDefsFlags[NN_vpslldq] = false; // Shift Double Quadword Left Logical -SMPDefsFlags[NN_vpsllq] = false; // Packed Shift Left Logical (Qword) -SMPDefsFlags[NN_vpsllvd] = false; // Variable Bit Shift Left Logical (Dword) -SMPDefsFlags[NN_vpsllvq] = false; // Variable Bit Shift Left Logical (Qword) -SMPDefsFlags[NN_vpsllw] = false; // Packed Shift Left Logical (Word) -SMPDefsFlags[NN_vpsrad] = false; // Packed Shift Right Arithmetic (Dword) -SMPDefsFlags[NN_vpsravd] = false; // Variable Bit Shift Right Arithmetic -SMPDefsFlags[NN_vpsraw] = false; // Packed Shift Right Arithmetic (Word) -SMPDefsFlags[NN_vpsrld] = false; // Packed Shift Right Logical (Dword) -SMPDefsFlags[NN_vpsrldq] = false; // Shift Double Quadword Right Logical (Qword) -SMPDefsFlags[NN_vpsrlq] = false; // Packed Shift Right Logical (Qword) -SMPDefsFlags[NN_vpsrlvd] = false; // Variable Bit Shift Right Logical (Dword) -SMPDefsFlags[NN_vpsrlvq] = false; // Variable Bit Shift Right Logical (Qword) -SMPDefsFlags[NN_vpsrlw] = false; // Packed Shift Right Logical (Word) -SMPDefsFlags[NN_vpsubb] = false; // Packed Subtract Byte -SMPDefsFlags[NN_vpsubd] = false; // Packed Subtract Dword -SMPDefsFlags[NN_vpsubq] = false; // Subtract Packed Quadword Integers -SMPDefsFlags[NN_vpsubsb] = false; // Packed Subtract with Saturation (Byte) -SMPDefsFlags[NN_vpsubsw] = false; // Packed Subtract with Saturation (Word) -SMPDefsFlags[NN_vpsubusb] = false; // Packed Subtract Unsigned with Saturation (Byte) -SMPDefsFlags[NN_vpsubusw] = false; // Packed Subtract Unsigned with Saturation (Word) -SMPDefsFlags[NN_vpsubw] = false; // Packed Subtract Word -SMPDefsFlags[NN_vptest] = false; // Logical Compare -SMPDefsFlags[NN_vpunpckhbw] = false; // Unpack High Packed Data (Byte->Word) -SMPDefsFlags[NN_vpunpckhdq] = false; // Unpack High Packed Data (Dword->Qword) -SMPDefsFlags[NN_vpunpckhqdq] = false; // Unpack High Packed Data (Qword->Xmmword) -SMPDefsFlags[NN_vpunpckhwd] = false; // Unpack High Packed Data (Word->Dword) -SMPDefsFlags[NN_vpunpcklbw] = false; // Unpack Low Packed Data (Byte->Word) -SMPDefsFlags[NN_vpunpckldq] = false; // Unpack Low Packed Data (Dword->Qword) -SMPDefsFlags[NN_vpunpcklqdq] = false; // Unpack Low Packed Data (Qword->Xmmword) -SMPDefsFlags[NN_vpunpcklwd] = false; // Unpack Low Packed Data (Word->Dword) -SMPDefsFlags[NN_vpxor] = false; // Bitwise Logical Exclusive Or -SMPDefsFlags[NN_vrcpps] = false; // Packed Single-FP Reciprocal -SMPDefsFlags[NN_vrcpss] = false; // Scalar Single-FP Reciprocal -SMPDefsFlags[NN_vroundpd] = false; // Round Packed Double Precision Floating-Point Values -SMPDefsFlags[NN_vroundps] = false; // Round Packed Single Precision Floating-Point Values -SMPDefsFlags[NN_vroundsd] = false; // Round Scalar Double Precision Floating-Point Values -SMPDefsFlags[NN_vroundss] = false; // Round Scalar Single Precision Floating-Point Values -SMPDefsFlags[NN_vrsqrtps] = false; // Packed Single-FP Square Root Reciprocal -SMPDefsFlags[NN_vrsqrtss] = false; // Scalar Single-FP Square Root Reciprocal -SMPDefsFlags[NN_vshufpd] = false; // Shuffle Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vshufps] = false; // Shuffle Single-FP -SMPDefsFlags[NN_vsqrtpd] = false; // Compute Square Roots of Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vsqrtps] = false; // Packed Single-FP Square Root -SMPDefsFlags[NN_vsqrtsd] = false; // Compute Square Rootof Scalar Double-Precision Floating-Point Value -SMPDefsFlags[NN_vsqrtss] = false; // Scalar Single-FP Square Root -SMPDefsFlags[NN_vstmxcsr] = false; // Store Streaming SIMD Extensions Technology Control/Status Register -SMPDefsFlags[NN_vsubpd] = false; // Subtract Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vsubps] = false; // Packed Single-FP Subtract -SMPDefsFlags[NN_vsubsd] = false; // Subtract Scalar Double-Precision Floating-Point Values -SMPDefsFlags[NN_vsubss] = false; // Scalar Single-FP Subtract -SMPDefsFlags[NN_vtestpd] = false; // Packed Double-Precision Floating-Point Bit Test -SMPDefsFlags[NN_vtestps] = false; // Packed Single-Precision Floating-Point Bit Test -SMPDefsFlags[NN_vucomisd] = false; // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS -SMPDefsFlags[NN_vucomiss] = false; // Scalar Unordered Single-FP Compare and Set EFLAGS -SMPDefsFlags[NN_vunpckhpd] = false; // Unpack and Interleave High Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vunpckhps] = false; // Unpack High Packed Single-FP Data -SMPDefsFlags[NN_vunpcklpd] = false; // Unpack and Interleave Low Packed Double-Precision Floating-Point Values -SMPDefsFlags[NN_vunpcklps] = false; // Unpack Low Packed Single-FP Data -SMPDefsFlags[NN_vxorpd] = false; // Bitwise Logical OR of Double-Precision Floating-Point Values -SMPDefsFlags[NN_vxorps] = false; // Bitwise Logical XOR for Single-FP Data -SMPDefsFlags[NN_vzeroall] = false; // Zero All YMM Registers -SMPDefsFlags[NN_vzeroupper] = false; // Zero Upper Bits of YMM Registers - -// Transactional Synchronization Extensions - -SMPDefsFlags[NN_xabort] = false; // Transaction Abort -SMPDefsFlags[NN_xbegin] = false; // Transaction Begin -SMPDefsFlags[NN_xend] = false; // Transaction End -SMPDefsFlags[NN_xtest] = false; // Test If In Transactional Execution - -// Virtual PC synthetic instructions - -SMPDefsFlags[NN_vmgetinfo] = false; // Virtual PC - Get VM Information -SMPDefsFlags[NN_vmsetinfo] = false; // Virtual PC - Set VM Information -SMPDefsFlags[NN_vmdxdsbl] = false; // Virtual PC - Disable Direct Execution -SMPDefsFlags[NN_vmdxenbl] = false; // Virtual PC - Enable Direct Execution -SMPDefsFlags[NN_vmcpuid] = false; // Virtual PC - Virtualized CPU Information -SMPDefsFlags[NN_vmhlt] = false; // Virtual PC - Halt -SMPDefsFlags[NN_vmsplaf] = false; // Virtual PC - Spin Lock Acquisition Failed -SMPDefsFlags[NN_vmpushfd] = false; // Virtual PC - Push virtualized flags register -SMPDefsFlags[NN_vmpopfd] = false; // Virtual PC - Pop virtualized flags register -SMPDefsFlags[NN_vmcli] = false; // Virtual PC - Clear Interrupt Flag -SMPDefsFlags[NN_vmsti] = false; // Virtual PC - Set Interrupt Flag -SMPDefsFlags[NN_vmiretd] = false; // Virtual PC - Return From Interrupt -SMPDefsFlags[NN_vmsgdt] = false; // Virtual PC - Store Global Descriptor Table -SMPDefsFlags[NN_vmsidt] = false; // Virtual PC - Store Interrupt Descriptor Table -SMPDefsFlags[NN_vmsldt] = false; // Virtual PC - Store Local Descriptor Table -SMPDefsFlags[NN_vmstr] = false; // Virtual PC - Store Task Register -SMPDefsFlags[NN_vmsdte] = false; // Virtual PC - Store to Descriptor Table Entry -SMPDefsFlags[NN_vpcext] = false; // Virtual PC - ISA extension - -#endif // 599 < IDA_SDK_VERSION - -SMPDefsFlags[NN_last] = false; - - return; - -} // end InitSMPDefsFlags() - -// Initialize the SMPUsesFlags[] array to define how we emit -// optimizing annotations. -void InitSMPUsesFlags(void) { - // Default value is false. Few instructions use the flags. - (void) memset(SMPUsesFlags, false, sizeof(SMPUsesFlags)); - -SMPUsesFlags[NN_null] = true; // Unknown Operation -SMPUsesFlags[NN_aaa] = true; // ASCII adjust after addition -SMPUsesFlags[NN_aas] = true; // ASCII adjust after subtraction -SMPUsesFlags[NN_adc] = true; // Add with Carry -SMPUsesFlags[NN_cmps] = true; // Compare Strings (uses DF direction flag) -SMPUsesFlags[NN_daa] = true; // Decimal Adjust AL after Addition -SMPUsesFlags[NN_das] = true; // Decimal Adjust AL after Subtraction -SMPUsesFlags[NN_ins] = true; // Input Byte(s) from Port to String -SMPUsesFlags[NN_into] = true; // Call to Interrupt Procedure if Overflow Flag = 1 -SMPUsesFlags[NN_ja] = true; // Jump if Above (CF=0 & ZF=0) -SMPUsesFlags[NN_jae] = true; // Jump if Above or Equal (CF=0) -SMPUsesFlags[NN_jb] = true; // Jump if Below (CF=1) -SMPUsesFlags[NN_jbe] = true; // Jump if Below or Equal (CF=1 | ZF=1) -SMPUsesFlags[NN_jc] = true; // Jump if Carry (CF=1) -SMPUsesFlags[NN_jcxz] = true; // Jump if CX is 0 -SMPUsesFlags[NN_jecxz] = true; // Jump if ECX is 0 -SMPUsesFlags[NN_jrcxz] = true; // Jump if RCX is 0 -SMPUsesFlags[NN_je] = true; // Jump if Equal (ZF=1) -SMPUsesFlags[NN_jg] = true; // Jump if Greater (ZF=0 & SF=OF) -SMPUsesFlags[NN_jge] = true; // Jump if Greater or Equal (SF=OF) -SMPUsesFlags[NN_jl] = true; // Jump if Less (SF!=OF) -SMPUsesFlags[NN_jle] = true; // Jump if Less or Equal (ZF=1 | SF!=OF) -SMPUsesFlags[NN_jna] = true; // Jump if Not Above (CF=1 | ZF=1) -SMPUsesFlags[NN_jnae] = true; // Jump if Not Above or Equal (CF=1) -SMPUsesFlags[NN_jnb] = true; // Jump if Not Below (CF=0) -SMPUsesFlags[NN_jnbe] = true; // Jump if Not Below or Equal (CF=0 & ZF=0) -SMPUsesFlags[NN_jnc] = true; // Jump if Not Carry (CF=0) -SMPUsesFlags[NN_jne] = true; // Jump if Not Equal (ZF=0) -SMPUsesFlags[NN_jng] = true; // Jump if Not Greater (ZF=1 | SF!=OF) -SMPUsesFlags[NN_jnge] = true; // Jump if Not Greater or Equal (SF!=OF) -SMPUsesFlags[NN_jnl] = true; // Jump if Not Less (SF=OF) -SMPUsesFlags[NN_jnle] = true; // Jump if Not Less or Equal (ZF=0 & SF=OF) -SMPUsesFlags[NN_jno] = true; // Jump if Not Overflow (OF=0) -SMPUsesFlags[NN_jnp] = true; // Jump if Not Parity (PF=0) -SMPUsesFlags[NN_jns] = true; // Jump if Not Sign (SF=0) -SMPUsesFlags[NN_jnz] = true; // Jump if Not Zero (ZF=0) -SMPUsesFlags[NN_jo] = true; // Jump if Overflow (OF=1) -SMPUsesFlags[NN_jp] = true; // Jump if Parity (PF=1) -SMPUsesFlags[NN_jpe] = true; // Jump if Parity Even (PF=1) -SMPUsesFlags[NN_jpo] = true; // Jump if Parity Odd (PF=0) -SMPUsesFlags[NN_js] = true; // Jump if Sign (SF=1) -SMPUsesFlags[NN_jz] = true; // Jump if Zero (ZF=1) -SMPUsesFlags[NN_lahf] = true; // Load Flags into AH Register -SMPUsesFlags[NN_lods] = true; // Load String -SMPUsesFlags[NN_loopwe] = true; // Loop while CX != 0 and ZF=1 -SMPUsesFlags[NN_loope] = true; // Loop while rCX != 0 and ZF=1 -SMPUsesFlags[NN_loopde] = true; // Loop while ECX != 0 and ZF=1 -SMPUsesFlags[NN_loopqe] = true; // Loop while RCX != 0 and ZF=1 -SMPUsesFlags[NN_loopwne] = true; // Loop while CX != 0 and ZF=0 -SMPUsesFlags[NN_loopne] = true; // Loop while rCX != 0 and ZF=0 -SMPUsesFlags[NN_loopdne] = true; // Loop while ECX != 0 and ZF=0 -SMPUsesFlags[NN_loopqne] = true; // Loop while RCX != 0 and ZF=0 -SMPUsesFlags[NN_movs] = true; // Move String (uses flags if REP prefix) -SMPUsesFlags[NN_outs] = true; // Output Byte(s) to Port -SMPUsesFlags[NN_pushfw] = true; // Push Flags Register onto the Stack -SMPUsesFlags[NN_pushf] = true; // Push Flags Register onto the Stack -SMPUsesFlags[NN_pushfd] = true; // Push Flags Register onto the Stack (use32) -SMPUsesFlags[NN_pushfq] = true; // Push Flags Register onto the Stack (use64) -SMPUsesFlags[NN_rcl] = true; // Rotate Through Carry Left -SMPUsesFlags[NN_rcr] = true; // Rotate Through Carry Right -SMPUsesFlags[NN_repe] = true; // Repeat String Operation while ZF=1 -SMPUsesFlags[NN_repne] = true; // Repeat String Operation while ZF=0 -SMPUsesFlags[NN_sbb] = true; // Integer Subtraction with Borrow -SMPUsesFlags[NN_scas] = true; // Compare String (uses DF direction flag) -SMPUsesFlags[NN_seta] = true; // Set Byte if Above (CF=0 & ZF=0) -SMPUsesFlags[NN_setae] = true; // Set Byte if Above or Equal (CF=0) -SMPUsesFlags[NN_setb] = true; // Set Byte if Below (CF=1) -SMPUsesFlags[NN_setbe] = true; // Set Byte if Below or Equal (CF=1 | ZF=1) -SMPUsesFlags[NN_setc] = true; // Set Byte if Carry (CF=1) -SMPUsesFlags[NN_sete] = true; // Set Byte if Equal (ZF=1) -SMPUsesFlags[NN_setg] = true; // Set Byte if Greater (ZF=0 & SF=OF) -SMPUsesFlags[NN_setge] = true; // Set Byte if Greater or Equal (SF=OF) -SMPUsesFlags[NN_setl] = true; // Set Byte if Less (SF!=OF) -SMPUsesFlags[NN_setle] = true; // Set Byte if Less or Equal (ZF=1 | SF!=OF) -SMPUsesFlags[NN_setna] = true; // Set Byte if Not Above (CF=1 | ZF=1) -SMPUsesFlags[NN_setnae] = true; // Set Byte if Not Above or Equal (CF=1) -SMPUsesFlags[NN_setnb] = true; // Set Byte if Not Below (CF=0) -SMPUsesFlags[NN_setnbe] = true; // Set Byte if Not Below or Equal (CF=0 & ZF=0) -SMPUsesFlags[NN_setnc] = true; // Set Byte if Not Carry (CF=0) -SMPUsesFlags[NN_setne] = true; // Set Byte if Not Equal (ZF=0) -SMPUsesFlags[NN_setng] = true; // Set Byte if Not Greater (ZF=1 | SF!=OF) -SMPUsesFlags[NN_setnge] = true; // Set Byte if Not Greater or Equal (SF!=OF) -SMPUsesFlags[NN_setnl] = true; // Set Byte if Not Less (SF=OF) -SMPUsesFlags[NN_setnle] = true; // Set Byte if Not Less or Equal (ZF=0 & SF=OF) -SMPUsesFlags[NN_setno] = true; // Set Byte if Not Overflow (OF=0) -SMPUsesFlags[NN_setnp] = true; // Set Byte if Not Parity (PF=0) -SMPUsesFlags[NN_setns] = true; // Set Byte if Not Sign (SF=0) -SMPUsesFlags[NN_setnz] = true; // Set Byte if Not Zero (ZF=0) -SMPUsesFlags[NN_seto] = true; // Set Byte if Overflow (OF=1) -SMPUsesFlags[NN_setp] = true; // Set Byte if Parity (PF=1) -SMPUsesFlags[NN_setpe] = true; // Set Byte if Parity Even (PF=1) -SMPUsesFlags[NN_setpo] = true; // Set Byte if Parity Odd (PF=0) -SMPUsesFlags[NN_sets] = true; // Set Byte if Sign (SF=1) -SMPUsesFlags[NN_setz] = true; // Set Byte if Zero (ZF=1) -SMPUsesFlags[NN_stos] = true; // Store String - -// -// 486 instructions -// - -// -// Pentium instructions -// - -#if 0 -SMPUsesFlags[NN_cpuid] = true; // Get CPU ID -SMPUsesFlags[NN_cmpxchg8b] = true; // Compare and Exchange Eight Bytes -#endif - -// -// Pentium Pro instructions -// - -SMPUsesFlags[NN_cmova] = true; // Move if Above (CF=0 & ZF=0) -SMPUsesFlags[NN_cmovb] = true; // Move if Below (CF=1) -SMPUsesFlags[NN_cmovbe] = true; // Move if Below or Equal (CF=1 | ZF=1) -SMPUsesFlags[NN_cmovg] = true; // Move if Greater (ZF=0 & SF=OF) -SMPUsesFlags[NN_cmovge] = true; // Move if Greater or Equal (SF=OF) -SMPUsesFlags[NN_cmovl] = true; // Move if Less (SF!=OF) -SMPUsesFlags[NN_cmovle] = true; // Move if Less or Equal (ZF=1 | SF!=OF) -SMPUsesFlags[NN_cmovnb] = true; // Move if Not Below (CF=0) -SMPUsesFlags[NN_cmovno] = true; // Move if Not Overflow (OF=0) -SMPUsesFlags[NN_cmovnp] = true; // Move if Not Parity (PF=0) -SMPUsesFlags[NN_cmovns] = true; // Move if Not Sign (SF=0) -SMPUsesFlags[NN_cmovnz] = true; // Move if Not Zero (ZF=0) -SMPUsesFlags[NN_cmovo] = true; // Move if Overflow (OF=1) -SMPUsesFlags[NN_cmovp] = true; // Move if Parity (PF=1) -SMPUsesFlags[NN_cmovs] = true; // Move if Sign (SF=1) -SMPUsesFlags[NN_cmovz] = true; // Move if Zero (ZF=1) -SMPUsesFlags[NN_fcmovb] = true; // Floating Move if Below -SMPUsesFlags[NN_fcmove] = true; // Floating Move if Equal -SMPUsesFlags[NN_fcmovbe] = true; // Floating Move if Below or Equal -SMPUsesFlags[NN_fcmovu] = true; // Floating Move if Unordered -SMPUsesFlags[NN_fcmovnb] = true; // Floating Move if Not Below -SMPUsesFlags[NN_fcmovne] = true; // Floating Move if Not Equal -SMPUsesFlags[NN_fcmovnbe] = true; // Floating Move if Not Below or Equal -SMPUsesFlags[NN_fcmovnu] = true; // Floating Move if Not Unordered - -// -// FPP instructions -// - - -// -// 80387 instructions -// - - -// -// Instructions added 28.02.96 -// - -SMPUsesFlags[NN_setalc] = true; // Set AL to Carry Flag - -// -// MMX instructions -// - - -// -// Undocumented Deschutes processor instructions -// - - -// Pentium II instructions - - -// 3DNow! instructions - - -// Pentium III instructions - - -// Pentium III Pseudo instructions - - -// AMD K7 instructions - -// Revisit AMD if we port to it. - -// Undocumented FP instructions (thanks to norbert.juffa@adm.com) - -// Pentium 4 instructions - - - -// AMD syscall/sysret instructions NOTE: not AMD, found in Intel manual - -// AMD64 instructions NOTE: not AMD, found in Intel manual - - -// New Pentium instructions (SSE3) - - -// Missing AMD64 instructions NOTE: also found in Intel manual - - -// SSE3 instructions - - -// SSSE3 instructions - - -// VMX instructions - -// Added with x86-64 - -// Geode LX 3DNow! extensions - -// SSE2 pseudoinstructions - -// SSSE4.1 instructions - -// SSSE4.2 instructions - -// AMD SSE4a instructions - -// xsave/xrstor instructions - -// Intel Safer Mode Extensions (SMX) - -// AMD-V Virtualization ISA Extension - -// VMX+ instructions - -// Intel Atom instructions - -// Intel AES instructions - -// Carryless multiplication - -// Returns modified by operand size prefixes - -// RDRAND support - -// new GPR instructions - -SMPUsesFlags[NN_adcx] = true; // Unsigned Integer Addition of Two Operands with Carry Flag -SMPUsesFlags[NN_adox] = true; // Unsigned Integer Addition of Two Operands with Overflow Flag - -// new AVX instructions - -// Transactional Synchronization Extensions - -// Virtual PC synthetic instructions - -SMPUsesFlags[NN_last] = false; - - return; - -} // end InitSMPUsesFlags() - - -// Initialize the SMPTypeCategory[] array to define how we infer -// numeric or pointer operand types for optimizing annotations. -void InitTypeCategory(void) { - // Default category is 0, no type inference without knowing context. - (void) memset(SMPTypeCategory, 0, sizeof(SMPTypeCategory)); - // Category 1 instructions will need no mmStrata instrumentation - // and are irrelevant to our type system, so we do not attempt - // to make type inferences. Many of these operate on numeric - // operands such as floating point or MMX/SSE registers. mmStrata - // assumes that such registers are always numeric, so we do not - // need annotations informing mmStrata that FP/MMX/SSE regs are numeric. - // Category 2 instructions always have a result type of 'n' (number). - // Category 3 instructions have a result type of 'n' (number) - // whenever the second source operand is an operand of type 'n'. - // NOTE: MOV is the only current example, and this will take some thought if - // other examples arise. - // Category 4 instructions have a result type identical to the 1st source operand type. - // NOTE: This is currently set for single-operand instructions such as - // INC, DEC. As a result, these are treated pretty much as if - // they were category 1 instructions, as there is no metadata update, - // even if the operand is a memory operand. - // If new instructions are added to this category that are not single - // operand and do require some updating, the category should be split. - // Category 5 instructions have a result type identical to the 1st source operand - // type whenever the 2nd source operand is an operand of type 'n' & vice versa. - // Examples are add, sub, adc, and sbb. There are subtle exceptions - // handled in the SMPInstr::EmitTypeAnnotations() method. - // Category 6 instructions always have a result type of 'p' (pointer). - // Category 7 instructions are category 2 instructions with two destinations, - // such as multiply and divide instructions that affect EDX:EAX. There are - // forms of these instructions that only have one destination, so they have - // to be distinguished via the operand info. - // Category 8 instructions implicitly write a numeric value to EDX:EAX, but - // EDX and EAX are not listed as operands. RDTSC, RDPMC, RDMSR, and other - // instructions that copy machine registers into EDX:EAX are category 8. - // Some instructions in category 8 also write to ECX. - // Category 9 instructions are floating point instructions that either - // have a memory destination (treat as category 13) or a FP reg destination - // (treat as category 1, as FP regs are always 'n' and ignored in our system). - // Category 10 instructions have 'n' results if the sources are all 'n'; - // we cannot infer the type of the result if the sources are of mixed types. - // Bitwise OR and AND and LEA (load effective address) are examples. - // Category 11 instructions need to have their types and locations on the stack - // frame tracked, e.g. push and pop instructions. No direct type inference. - // Category 12 instructions are similar to category 10, except that we do not - // output 'n' annotations when all sources are 'n'; rather, the instruction can - // be simply ignored (not instrumented by mmStrata) in that case. Conditional - // exchange instructions are examples; we do or do not - // move a numeric value into a register that already has numeric metadata. - // Category 13 instructions imply that their memory destination is 'n'. - // Category 14 instructions imply that their reg or memory source operand is 'n'; - // if source is not memory, they are category 1 (inferences, but no instrumentation). - // There should never be a memory destination (usual destination is fpreg or flags). - // Category 15 instructions always have 'n' source AND destination operands; - // if addressed using indirect or indexed addressing, they are a subset of category 0 - // (must be instrumented by mmStrata to keep index in bounds). Memory destinations - // are common in this category. - - // NOTE: The Memory Monitor SDT needs just three categories, corresponding - // to categories 0, 1, and all others. For all categories > 1, the - // annotation should tell the SDT exactly how to update its metadata. - // For example, a division instruction will write type 'n' (NUM) as - // the metadata for result registers EDX:EAX. So, the annotation should - // list 'n', EDX, EAX, and a terminator of ZZ. CWD (convert word to - // doubleword) should have a list of n EAX ZZ. - -SMPTypeCategory[NN_null] = 0; // Unknown Operation -SMPTypeCategory[NN_aaa] = 2; // ASCII Adjust after Addition -SMPTypeCategory[NN_aad] = 2; // ASCII Adjust AX before Division -SMPTypeCategory[NN_aam] = 2; // ASCII Adjust AX after Multiply -SMPTypeCategory[NN_aas] = 2; // ASCII Adjust AL after Subtraction -SMPTypeCategory[NN_adc] = 5; // Add with Carry -SMPTypeCategory[NN_add] = 5; // Add -SMPTypeCategory[NN_and] = 10; // Logical AND -SMPTypeCategory[NN_arpl] = 1; // Adjust RPL Field of Selector -SMPTypeCategory[NN_bound] = 1; // Check Array Index Against Bounds -SMPTypeCategory[NN_bsf] = 2; // Bit Scan Forward -SMPTypeCategory[NN_bsr] = 2; // Bit Scan Reverse -SMPTypeCategory[NN_bt] = 10; // Bit Test -SMPTypeCategory[NN_btc] = 10; // Bit Test and Complement -SMPTypeCategory[NN_btr] = 10; // Bit Test and Reset -SMPTypeCategory[NN_bts] = 10; // Bit Test and Set -SMPTypeCategory[NN_call] = 1; // Call Procedure -SMPTypeCategory[NN_callfi] = 1; // Indirect Call Far Procedure -SMPTypeCategory[NN_callni] = 1; // Indirect Call Near Procedure -SMPTypeCategory[NN_cbw] = 2; // AL -> AX (with sign) ** No ops? -SMPTypeCategory[NN_cwde] = 2; // AX -> EAX (with sign) ** -SMPTypeCategory[NN_cdqe] = 2; // EAX -> RAX (with sign) ** -SMPTypeCategory[NN_clc] = 1; // Clear Carry Flag -SMPTypeCategory[NN_cld] = 1; // Clear Direction Flag -SMPTypeCategory[NN_cli] = 1; // Clear Interrupt Flag -SMPTypeCategory[NN_clts] = 1; // Clear Task-Switched Flag in CR0 -SMPTypeCategory[NN_cmc] = 1; // Complement Carry Flag -SMPTypeCategory[NN_cmp] = 1; // Compare Two Operands -SMPTypeCategory[NN_cmps] = 14; // Compare Strings -SMPTypeCategory[NN_cwd] = 2; // AX -> DX:AX (with sign) -SMPTypeCategory[NN_cdq] = 2; // EAX -> EDX:EAX (with sign) -SMPTypeCategory[NN_cqo] = 2; // RAX -> RDX:RAX (with sign) -SMPTypeCategory[NN_daa] = 2; // Decimal Adjust AL after Addition -SMPTypeCategory[NN_das] = 2; // Decimal Adjust AL after Subtraction -SMPTypeCategory[NN_dec] = 4; // Decrement by 1 -SMPTypeCategory[NN_div] = 7; // Unsigned Divide -SMPTypeCategory[NN_enterw] = 0; // Make Stack Frame for Procedure Parameters ** -SMPTypeCategory[NN_enter] = 0; // Make Stack Frame for Procedure Parameters ** -SMPTypeCategory[NN_enterd] = 0; // Make Stack Frame for Procedure Parameters ** -SMPTypeCategory[NN_enterq] = 0; // Make Stack Frame for Procedure Parameters ** -SMPTypeCategory[NN_hlt] = 0; // Halt -SMPTypeCategory[NN_idiv] = 7; // Signed Divide -SMPTypeCategory[NN_imul] = 7; // Signed Multiply -SMPTypeCategory[NN_in] = 0; // Input from Port ** -SMPTypeCategory[NN_inc] = 4; // Increment by 1 -SMPTypeCategory[NN_ins] = 2; // Input Byte(s) from Port to String ** -SMPTypeCategory[NN_int] = 0; // Call to Interrupt Procedure -SMPTypeCategory[NN_into] = 0; // Call to Interrupt Procedure if Overflow Flag = 1 -SMPTypeCategory[NN_int3] = 0; // Trap to Debugger -SMPTypeCategory[NN_iretw] = 0; // Interrupt Return -SMPTypeCategory[NN_iret] = 0; // Interrupt Return -SMPTypeCategory[NN_iretd] = 0; // Interrupt Return (use32) -SMPTypeCategory[NN_iretq] = 0; // Interrupt Return (use64) -SMPTypeCategory[NN_ja] = 1; // Jump if Above (CF=0 & ZF=0) -SMPTypeCategory[NN_jae] = 1; // Jump if Above or Equal (CF=0) -SMPTypeCategory[NN_jb] = 1; // Jump if Below (CF=1) -SMPTypeCategory[NN_jbe] = 1; // Jump if Below or Equal (CF=1 | ZF=1) -SMPTypeCategory[NN_jc] = 1; // Jump if Carry (CF=1) -SMPTypeCategory[NN_jcxz] = 1; // Jump if CX is 0 -SMPTypeCategory[NN_jecxz] = 1; // Jump if ECX is 0 -SMPTypeCategory[NN_jrcxz] = 1; // Jump if RCX is 0 -SMPTypeCategory[NN_je] = 1; // Jump if Equal (ZF=1) -SMPTypeCategory[NN_jg] = 1; // Jump if Greater (ZF=0 & SF=OF) -SMPTypeCategory[NN_jge] = 1; // Jump if Greater or Equal (SF=OF) -SMPTypeCategory[NN_jl] = 1; // Jump if Less (SF!=OF) -SMPTypeCategory[NN_jle] = 1; // Jump if Less or Equal (ZF=1 | SF!=OF) -SMPTypeCategory[NN_jna] = 1; // Jump if Not Above (CF=1 | ZF=1) -SMPTypeCategory[NN_jnae] = 1; // Jump if Not Above or Equal (CF=1) -SMPTypeCategory[NN_jnb] = 1; // Jump if Not Below (CF=0) -SMPTypeCategory[NN_jnbe] = 1; // Jump if Not Below or Equal (CF=0 & ZF=0) -SMPTypeCategory[NN_jnc] = 1; // Jump if Not Carry (CF=0) -SMPTypeCategory[NN_jne] = 1; // Jump if Not Equal (ZF=0) -SMPTypeCategory[NN_jng] = 1; // Jump if Not Greater (ZF=1 | SF!=OF) -SMPTypeCategory[NN_jnge] = 1; // Jump if Not Greater or Equal (SF!=OF) -SMPTypeCategory[NN_jnl] = 1; // Jump if Not Less (SF=OF) -SMPTypeCategory[NN_jnle] = 1; // Jump if Not Less or Equal (ZF=0 & SF=OF) -SMPTypeCategory[NN_jno] = 1; // Jump if Not Overflow (OF=0) -SMPTypeCategory[NN_jnp] = 1; // Jump if Not Parity (PF=0) -SMPTypeCategory[NN_jns] = 1; // Jump if Not Sign (SF=0) -SMPTypeCategory[NN_jnz] = 1; // Jump if Not Zero (ZF=0) -SMPTypeCategory[NN_jo] = 1; // Jump if Overflow (OF=1) -SMPTypeCategory[NN_jp] = 1; // Jump if Parity (PF=1) -SMPTypeCategory[NN_jpe] = 1; // Jump if Parity Even (PF=1) -SMPTypeCategory[NN_jpo] = 1; // Jump if Parity Odd (PF=0) -SMPTypeCategory[NN_js] = 1; // Jump if Sign (SF=1) -SMPTypeCategory[NN_jz] = 1; // Jump if Zero (ZF=1) -SMPTypeCategory[NN_jmp] = 1; // Jump -SMPTypeCategory[NN_jmpfi] = 1; // Indirect Far Jump -SMPTypeCategory[NN_jmpni] = 1; // Indirect Near Jump -SMPTypeCategory[NN_jmpshort] = 1; // Jump Short (not used) -SMPTypeCategory[NN_lahf] = 2; // Load Flags into AH Register -SMPTypeCategory[NN_lar] = 2; // Load Access Rights Byte -SMPTypeCategory[NN_lea] = 10; // Load Effective Address ** -SMPTypeCategory[NN_leavew] = 0; // High Level Procedure Exit ** -SMPTypeCategory[NN_leave] = 0; // High Level Procedure Exit ** -SMPTypeCategory[NN_leaved] = 0; // High Level Procedure Exit ** -SMPTypeCategory[NN_leaveq] = 0; // High Level Procedure Exit ** -SMPTypeCategory[NN_lgdt] = 0; // Load Global Descriptor Table Register -SMPTypeCategory[NN_lidt] = 0; // Load Interrupt Descriptor Table Register -SMPTypeCategory[NN_lgs] = 6; // Load Full Pointer to GS:xx -SMPTypeCategory[NN_lss] = 6; // Load Full Pointer to SS:xx -SMPTypeCategory[NN_lds] = 6; // Load Full Pointer to DS:xx -SMPTypeCategory[NN_les] = 6; // Load Full Pointer to ES:xx -SMPTypeCategory[NN_lfs] = 6; // Load Full Pointer to FS:xx -SMPTypeCategory[NN_lldt] = 0; // Load Local Descriptor Table Register -SMPTypeCategory[NN_lmsw] = 1; // Load Machine Status Word -SMPTypeCategory[NN_lock] = 1; // Assert LOCK# Signal Prefix -SMPTypeCategory[NN_lods] = 0; // Load String -SMPTypeCategory[NN_loopw] = 1; // Loop while ECX != 0 -SMPTypeCategory[NN_loop] = 1; // Loop while CX != 0 -SMPTypeCategory[NN_loopd] = 1; // Loop while ECX != 0 -SMPTypeCategory[NN_loopq] = 1; // Loop while RCX != 0 -SMPTypeCategory[NN_loopwe] = 1; // Loop while CX != 0 and ZF=1 -SMPTypeCategory[NN_loope] = 1; // Loop while rCX != 0 and ZF=1 -SMPTypeCategory[NN_loopde] = 1; // Loop while ECX != 0 and ZF=1 -SMPTypeCategory[NN_loopqe] = 1; // Loop while RCX != 0 and ZF=1 -SMPTypeCategory[NN_loopwne] = 1; // Loop while CX != 0 and ZF=0 -SMPTypeCategory[NN_loopne] = 1; // Loop while rCX != 0 and ZF=0 -SMPTypeCategory[NN_loopdne] = 1; // Loop while ECX != 0 and ZF=0 -SMPTypeCategory[NN_loopqne] = 1; // Loop while RCX != 0 and ZF=0 -SMPTypeCategory[NN_lsl] = 6; // Load Segment Limit -SMPTypeCategory[NN_ltr] = 1; // Load Task Register -SMPTypeCategory[NN_mov] = 3; // Move Data -SMPTypeCategory[NN_movsp] = 3; // Move to/from Special Registers -SMPTypeCategory[NN_movs] = 0; // Move Byte(s) from String to String -SMPTypeCategory[NN_movsx] = 3; // Move with Sign-Extend -SMPTypeCategory[NN_movzx] = 3; // Move with Zero-Extend -SMPTypeCategory[NN_mul] = 7; // Unsigned Multiplication of AL or AX -SMPTypeCategory[NN_neg] = 2; // Two's Complement Negation !!!!****!!!! Change this when mmStrata handles NEGATEDPTR type. -SMPTypeCategory[NN_nop] = 1; // No Operation -SMPTypeCategory[NN_not] = 2; // One's Complement Negation -SMPTypeCategory[NN_or] = 10; // Logical Inclusive OR -SMPTypeCategory[NN_out] = 0; // Output to Port -SMPTypeCategory[NN_outs] = 0; // Output Byte(s) to Port -SMPTypeCategory[NN_pop] = 11; // Pop a word from the Stack -SMPTypeCategory[NN_popaw] = 11; // Pop all General Registers -SMPTypeCategory[NN_popa] = 11; // Pop all General Registers -SMPTypeCategory[NN_popad] = 11; // Pop all General Registers (use32) -SMPTypeCategory[NN_popaq] = 11; // Pop all General Registers (use64) -SMPTypeCategory[NN_popfw] = 11; // Pop Stack into Flags Register ** -SMPTypeCategory[NN_popf] = 11; // Pop Stack into Flags Register ** -SMPTypeCategory[NN_popfd] = 11; // Pop Stack into Eflags Register ** -SMPTypeCategory[NN_popfq] = 11; // Pop Stack into Rflags Register ** -SMPTypeCategory[NN_push] = 11; // Push Operand onto the Stack -SMPTypeCategory[NN_pushaw] = 11; // Push all General Registers -SMPTypeCategory[NN_pusha] = 11; // Push all General Registers -SMPTypeCategory[NN_pushad] = 11; // Push all General Registers (use32) -SMPTypeCategory[NN_pushaq] = 11; // Push all General Registers (use64) -SMPTypeCategory[NN_pushfw] = 11; // Push Flags Register onto the Stack -SMPTypeCategory[NN_pushf] = 11; // Push Flags Register onto the Stack -SMPTypeCategory[NN_pushfd] = 11; // Push Flags Register onto the Stack (use32) -SMPTypeCategory[NN_pushfq] = 11; // Push Flags Register onto the Stack (use64) -SMPTypeCategory[NN_rcl] = 2; // Rotate Through Carry Left -SMPTypeCategory[NN_rcr] = 2; // Rotate Through Carry Right -SMPTypeCategory[NN_rol] = 2; // Rotate Left -SMPTypeCategory[NN_ror] = 2; // Rotate Right -SMPTypeCategory[NN_rep] = 0; // Repeat String Operation -SMPTypeCategory[NN_repe] = 0; // Repeat String Operation while ZF=1 -SMPTypeCategory[NN_repne] = 0; // Repeat String Operation while ZF=0 -SMPTypeCategory[NN_retn] = 0; // Return Near from Procedure -SMPTypeCategory[NN_retf] = 0; // Return Far from Procedure -SMPTypeCategory[NN_sahf] = 14; // Store AH into Flags Register -SMPTypeCategory[NN_sal] = 2; // Shift Arithmetic Left -SMPTypeCategory[NN_sar] = 2; // Shift Arithmetic Right -SMPTypeCategory[NN_shl] = 2; // Shift Logical Left -SMPTypeCategory[NN_shr] = 2; // Shift Logical Right -SMPTypeCategory[NN_sbb] = 5; // Integer Subtraction with Borrow -SMPTypeCategory[NN_scas] = 14; // Compare String -SMPTypeCategory[NN_seta] = 2; // Set Byte if Above (CF=0 & ZF=0) -SMPTypeCategory[NN_setae] = 2; // Set Byte if Above or Equal (CF=0) -SMPTypeCategory[NN_setb] = 2; // Set Byte if Below (CF=1) -SMPTypeCategory[NN_setbe] = 2; // Set Byte if Below or Equal (CF=1 | ZF=1) -SMPTypeCategory[NN_setc] = 2; // Set Byte if Carry (CF=1) -SMPTypeCategory[NN_sete] = 2; // Set Byte if Equal (ZF=1) -SMPTypeCategory[NN_setg] = 2; // Set Byte if Greater (ZF=0 & SF=OF) -SMPTypeCategory[NN_setge] = 2; // Set Byte if Greater or Equal (SF=OF) -SMPTypeCategory[NN_setl] = 2; // Set Byte if Less (SF!=OF) -SMPTypeCategory[NN_setle] = 2; // Set Byte if Less or Equal (ZF=1 | SF!=OF) -SMPTypeCategory[NN_setna] = 2; // Set Byte if Not Above (CF=1 | ZF=1) -SMPTypeCategory[NN_setnae] = 2; // Set Byte if Not Above or Equal (CF=1) -SMPTypeCategory[NN_setnb] = 2; // Set Byte if Not Below (CF=0) -SMPTypeCategory[NN_setnbe] = 2; // Set Byte if Not Below or Equal (CF=0 & ZF=0) -SMPTypeCategory[NN_setnc] = 2; // Set Byte if Not Carry (CF=0) -SMPTypeCategory[NN_setne] = 2; // Set Byte if Not Equal (ZF=0) -SMPTypeCategory[NN_setng] = 2; // Set Byte if Not Greater (ZF=1 | SF!=OF) -SMPTypeCategory[NN_setnge] = 2; // Set Byte if Not Greater or Equal (SF!=OF) -SMPTypeCategory[NN_setnl] = 2; // Set Byte if Not Less (SF=OF) -SMPTypeCategory[NN_setnle] = 2; // Set Byte if Not Less or Equal (ZF=0 & SF=OF) -SMPTypeCategory[NN_setno] = 2; // Set Byte if Not Overflow (OF=0) -SMPTypeCategory[NN_setnp] = 2; // Set Byte if Not Parity (PF=0) -SMPTypeCategory[NN_setns] = 2; // Set Byte if Not Sign (SF=0) -SMPTypeCategory[NN_setnz] = 2; // Set Byte if Not Zero (ZF=0) -SMPTypeCategory[NN_seto] = 2; // Set Byte if Overflow (OF=1) -SMPTypeCategory[NN_setp] = 2; // Set Byte if Parity (PF=1) -SMPTypeCategory[NN_setpe] = 2; // Set Byte if Parity Even (PF=1) -SMPTypeCategory[NN_setpo] = 2; // Set Byte if Parity Odd (PF=0) -SMPTypeCategory[NN_sets] = 2; // Set Byte if Sign (SF=1) -SMPTypeCategory[NN_setz] = 2; // Set Byte if Zero (ZF=1) -SMPTypeCategory[NN_sgdt] = 0; // Store Global Descriptor Table Register -SMPTypeCategory[NN_sidt] = 0; // Store Interrupt Descriptor Table Register -SMPTypeCategory[NN_shld] = 2; // Double Precision Shift Left -SMPTypeCategory[NN_shrd] = 2; // Double Precision Shift Right -SMPTypeCategory[NN_sldt] = 6; // Store Local Descriptor Table Register -SMPTypeCategory[NN_smsw] = 2; // Store Machine Status Word -SMPTypeCategory[NN_stc] = 1; // Set Carry Flag -SMPTypeCategory[NN_std] = 1; // Set Direction Flag -SMPTypeCategory[NN_sti] = 1; // Set Interrupt Flag -SMPTypeCategory[NN_stos] = 0; // Store String -SMPTypeCategory[NN_str] = 6; // Store Task Register -SMPTypeCategory[NN_sub] = 5; // Integer Subtraction -SMPTypeCategory[NN_test] = 1; // Logical Compare -SMPTypeCategory[NN_verr] = 1; // Verify a Segment for Reading -SMPTypeCategory[NN_verw] = 1; // Verify a Segment for Writing -SMPTypeCategory[NN_wait] = 1; // Wait until BUSY# Pin is Inactive (HIGH) -SMPTypeCategory[NN_xchg] = 12; // Exchange Register/Memory with Register -SMPTypeCategory[NN_xlat] = 0; // Table Lookup Translation -SMPTypeCategory[NN_xor] = 2; // Logical Exclusive OR - -// -// 486 instructions -// - -SMPTypeCategory[NN_cmpxchg] = 12; // Compare and Exchange -SMPTypeCategory[NN_bswap] = 1; // Swap bytes in register -SMPTypeCategory[NN_xadd] = 12; // t<-dest; dest<-src+dest; src<-t -SMPTypeCategory[NN_invd] = 1; // Invalidate Data Cache -SMPTypeCategory[NN_wbinvd] = 1; // Invalidate Data Cache (write changes) -SMPTypeCategory[NN_invlpg] = 1; // Invalidate TLB entry - -// -// Pentium instructions -// - -SMPTypeCategory[NN_rdmsr] = 8; // Read Machine Status Register -SMPTypeCategory[NN_wrmsr] = 1; // Write Machine Status Register -SMPTypeCategory[NN_cpuid] = 8; // Get CPU ID -SMPTypeCategory[NN_cmpxchg8b] = 12; // Compare and Exchange Eight Bytes -SMPTypeCategory[NN_rdtsc] = 8; // Read Time Stamp Counter -SMPTypeCategory[NN_rsm] = 1; // Resume from System Management Mode - -// -// Pentium Pro instructions -// - -SMPTypeCategory[NN_cmova] = 0; // Move if Above (CF=0 & ZF=0) -SMPTypeCategory[NN_cmovb] = 0; // Move if Below (CF=1) -SMPTypeCategory[NN_cmovbe] = 0; // Move if Below or Equal (CF=1 | ZF=1) -SMPTypeCategory[NN_cmovg] = 0; // Move if Greater (ZF=0 & SF=OF) -SMPTypeCategory[NN_cmovge] = 0; // Move if Greater or Equal (SF=OF) -SMPTypeCategory[NN_cmovl] = 0; // Move if Less (SF!=OF) -SMPTypeCategory[NN_cmovle] = 0; // Move if Less or Equal (ZF=1 | SF!=OF) -SMPTypeCategory[NN_cmovnb] = 0; // Move if Not Below (CF=0) -SMPTypeCategory[NN_cmovno] = 0; // Move if Not Overflow (OF=0) -SMPTypeCategory[NN_cmovnp] = 0; // Move if Not Parity (PF=0) -SMPTypeCategory[NN_cmovns] = 0; // Move if Not Sign (SF=0) -SMPTypeCategory[NN_cmovnz] = 0; // Move if Not Zero (ZF=0) -SMPTypeCategory[NN_cmovo] = 0; // Move if Overflow (OF=1) -SMPTypeCategory[NN_cmovp] = 0; // Move if Parity (PF=1) -SMPTypeCategory[NN_cmovs] = 0; // Move if Sign (SF=1) -SMPTypeCategory[NN_cmovz] = 0; // Move if Zero (ZF=1) -SMPTypeCategory[NN_fcmovb] = 1; // Floating Move if Below -SMPTypeCategory[NN_fcmove] = 1; // Floating Move if Equal -SMPTypeCategory[NN_fcmovbe] = 1; // Floating Move if Below or Equal -SMPTypeCategory[NN_fcmovu] = 1; // Floating Move if Unordered -SMPTypeCategory[NN_fcmovnb] = 1; // Floating Move if Not Below -SMPTypeCategory[NN_fcmovne] = 1; // Floating Move if Not Equal -SMPTypeCategory[NN_fcmovnbe] = 1; // Floating Move if Not Below or Equal -SMPTypeCategory[NN_fcmovnu] = 1; // Floating Move if Not Unordered -SMPTypeCategory[NN_fcomi] = 1; // FP Compare, result in EFLAGS -SMPTypeCategory[NN_fucomi] = 1; // FP Unordered Compare, result in EFLAGS -SMPTypeCategory[NN_fcomip] = 1; // FP Compare, result in EFLAGS, pop stack -SMPTypeCategory[NN_fucomip] = 1; // FP Unordered Compare, result in EFLAGS, pop stack -SMPTypeCategory[NN_rdpmc] = 8; // Read Performance Monitor Counter - -// -// FPP instructions -// - -SMPTypeCategory[NN_fld] = 14; // Load Real ** Infer src is 'n' -SMPTypeCategory[NN_fst] = 9; // Store Real -SMPTypeCategory[NN_fstp] = 9; // Store Real and Pop -SMPTypeCategory[NN_fxch] = 1; // Exchange Registers -SMPTypeCategory[NN_fild] = 14; // Load Integer ** Infer src is 'n' -SMPTypeCategory[NN_fist] = 13; // Store Integer -SMPTypeCategory[NN_fistp] = 13; // Store Integer and Pop -SMPTypeCategory[NN_fbld] = 1; // Load BCD -SMPTypeCategory[NN_fbstp] = 13; // Store BCD and Pop -SMPTypeCategory[NN_fadd] = 14; // Add Real -SMPTypeCategory[NN_faddp] = 14; // Add Real and Pop -SMPTypeCategory[NN_fiadd] = 14; // Add Integer -SMPTypeCategory[NN_fsub] = 14; // Subtract Real -SMPTypeCategory[NN_fsubp] = 14; // Subtract Real and Pop -SMPTypeCategory[NN_fisub] = 14; // Subtract Integer -SMPTypeCategory[NN_fsubr] = 14; // Subtract Real Reversed -SMPTypeCategory[NN_fsubrp] = 14; // Subtract Real Reversed and Pop -SMPTypeCategory[NN_fisubr] = 14; // Subtract Integer Reversed -SMPTypeCategory[NN_fmul] = 14; // Multiply Real -SMPTypeCategory[NN_fmulp] = 14; // Multiply Real and Pop -SMPTypeCategory[NN_fimul] = 14; // Multiply Integer -SMPTypeCategory[NN_fdiv] = 14; // Divide Real -SMPTypeCategory[NN_fdivp] = 14; // Divide Real and Pop -SMPTypeCategory[NN_fidiv] = 14; // Divide Integer -SMPTypeCategory[NN_fdivr] = 14; // Divide Real Reversed -SMPTypeCategory[NN_fdivrp] = 14; // Divide Real Reversed and Pop -SMPTypeCategory[NN_fidivr] = 14; // Divide Integer Reversed -SMPTypeCategory[NN_fsqrt] = 1; // Square Root -SMPTypeCategory[NN_fscale] = 1; // Scale: st(0) <- st(0) * 2^st(1) -SMPTypeCategory[NN_fprem] = 1; // Partial Remainder -SMPTypeCategory[NN_frndint] = 1; // Round to Integer -SMPTypeCategory[NN_fxtract] = 1; // Extract exponent and significand -SMPTypeCategory[NN_fabs] = 1; // Absolute value -SMPTypeCategory[NN_fchs] = 1; // Change Sign -SMPTypeCategory[NN_fcom] = 1; // Compare Real -SMPTypeCategory[NN_fcomp] = 1; // Compare Real and Pop -SMPTypeCategory[NN_fcompp] = 1; // Compare Real and Pop Twice -SMPTypeCategory[NN_ficom] = 1; // Compare Integer -SMPTypeCategory[NN_ficomp] = 1; // Compare Integer and Pop -SMPTypeCategory[NN_ftst] = 1; // Test -SMPTypeCategory[NN_fxam] = 1; // Examine -SMPTypeCategory[NN_fptan] = 1; // Partial tangent -SMPTypeCategory[NN_fpatan] = 1; // Partial arctangent -SMPTypeCategory[NN_f2xm1] = 1; // 2^x - 1 -SMPTypeCategory[NN_fyl2x] = 1; // Y * lg2(X) -SMPTypeCategory[NN_fyl2xp1] = 1; // Y * lg2(X+1) -SMPTypeCategory[NN_fldz] = 1; // Load +0.0 -SMPTypeCategory[NN_fld1] = 1; // Load +1.0 -SMPTypeCategory[NN_fldpi] = 1; // Load PI=3.14... -SMPTypeCategory[NN_fldl2t] = 1; // Load lg2(10) -SMPTypeCategory[NN_fldl2e] = 1; // Load lg2(e) -SMPTypeCategory[NN_fldlg2] = 1; // Load lg10(2) -SMPTypeCategory[NN_fldln2] = 1; // Load ln(2) -SMPTypeCategory[NN_finit] = 1; // Initialize Processor -SMPTypeCategory[NN_fninit] = 1; // Initialize Processor (no wait) -SMPTypeCategory[NN_fsetpm] = 1; // Set Protected Mode -SMPTypeCategory[NN_fldcw] = 14; // Load Control Word -SMPTypeCategory[NN_fstcw] = 13; // Store Control Word -SMPTypeCategory[NN_fnstcw] = 13; // Store Control Word (no wait) -SMPTypeCategory[NN_fstsw] = 2; // Store Status Word to memory or AX -SMPTypeCategory[NN_fnstsw] = 2; // Store Status Word (no wait) to memory or AX -SMPTypeCategory[NN_fclex] = 1; // Clear Exceptions -SMPTypeCategory[NN_fnclex] = 1; // Clear Exceptions (no wait) -SMPTypeCategory[NN_fstenv] = 13; // Store Environment -SMPTypeCategory[NN_fnstenv] = 13; // Store Environment (no wait) -SMPTypeCategory[NN_fldenv] = 14; // Load Environment -SMPTypeCategory[NN_fsave] = 13; // Save State -SMPTypeCategory[NN_fnsave] = 13; // Save State (no wait) -SMPTypeCategory[NN_frstor] = 14; // Restore State ** infer src is 'n' -SMPTypeCategory[NN_fincstp] = 1; // Increment Stack Pointer -SMPTypeCategory[NN_fdecstp] = 1; // Decrement Stack Pointer -SMPTypeCategory[NN_ffree] = 1; // Free Register -SMPTypeCategory[NN_fnop] = 1; // No Operation -SMPTypeCategory[NN_feni] = 1; // (8087 only) -SMPTypeCategory[NN_fneni] = 1; // (no wait) (8087 only) -SMPTypeCategory[NN_fdisi] = 1; // (8087 only) -SMPTypeCategory[NN_fndisi] = 1; // (no wait) (8087 only) - -// -// 80387 instructions -// - -SMPTypeCategory[NN_fprem1] = 1; // Partial Remainder ( < half ) -SMPTypeCategory[NN_fsincos] = 1; // t<-cos(st); st<-sin(st); push t -SMPTypeCategory[NN_fsin] = 1; // Sine -SMPTypeCategory[NN_fcos] = 1; // Cosine -SMPTypeCategory[NN_fucom] = 1; // Compare Unordered Real -SMPTypeCategory[NN_fucomp] = 1; // Compare Unordered Real and Pop -SMPTypeCategory[NN_fucompp] = 1; // Compare Unordered Real and Pop Twice - -// -// Instructions added 28.02.96 -// - -SMPTypeCategory[NN_setalc] = 2; // Set AL to Carry Flag ** -SMPTypeCategory[NN_svdc] = 0; // Save Register and Descriptor -SMPTypeCategory[NN_rsdc] = 0; // Restore Register and Descriptor -SMPTypeCategory[NN_svldt] = 0; // Save LDTR and Descriptor -SMPTypeCategory[NN_rsldt] = 0; // Restore LDTR and Descriptor -SMPTypeCategory[NN_svts] = 1; // Save TR and Descriptor -SMPTypeCategory[NN_rsts] = 1; // Restore TR and Descriptor -SMPTypeCategory[NN_icebp] = 1; // ICE Break Point -SMPTypeCategory[NN_loadall] = 0; // Load the entire CPU state from ES:EDI ??? - -// -// MMX instructions -// - -SMPTypeCategory[NN_emms] = 1; // Empty MMX state -SMPTypeCategory[NN_movd] = 15; // Move 32 bits -SMPTypeCategory[NN_movq] = 15; // Move 64 bits -SMPTypeCategory[NN_packsswb] = 14; // Pack with Signed Saturation (Word->Byte) -SMPTypeCategory[NN_packssdw] = 14; // Pack with Signed Saturation (Dword->Word) -SMPTypeCategory[NN_packuswb] = 14; // Pack with Unsigned Saturation (Word->Byte) -SMPTypeCategory[NN_paddb] = 14; // Packed Add Byte -SMPTypeCategory[NN_paddw] = 14; // Packed Add Word -SMPTypeCategory[NN_paddd] = 14; // Packed Add Dword -SMPTypeCategory[NN_paddsb] = 14; // Packed Add with Saturation (Byte) -SMPTypeCategory[NN_paddsw] = 14; // Packed Add with Saturation (Word) -SMPTypeCategory[NN_paddusb] = 14; // Packed Add Unsigned with Saturation (Byte) -SMPTypeCategory[NN_paddusw] = 14; // Packed Add Unsigned with Saturation (Word) -SMPTypeCategory[NN_pand] = 14; // Bitwise Logical And -SMPTypeCategory[NN_pandn] = 14; // Bitwise Logical And Not -SMPTypeCategory[NN_pcmpeqb] = 14; // Packed Compare for Equal (Byte) -SMPTypeCategory[NN_pcmpeqw] = 14; // Packed Compare for Equal (Word) -SMPTypeCategory[NN_pcmpeqd] = 14; // Packed Compare for Equal (Dword) -SMPTypeCategory[NN_pcmpgtb] = 14; // Packed Compare for Greater Than (Byte) -SMPTypeCategory[NN_pcmpgtw] = 14; // Packed Compare for Greater Than (Word) -SMPTypeCategory[NN_pcmpgtd] = 14; // Packed Compare for Greater Than (Dword) -SMPTypeCategory[NN_pmaddwd] = 14; // Packed Multiply and Add -SMPTypeCategory[NN_pmulhw] = 14; // Packed Multiply High -SMPTypeCategory[NN_pmullw] = 14; // Packed Multiply Low -SMPTypeCategory[NN_por] = 14; // Bitwise Logical Or -SMPTypeCategory[NN_psllw] = 14; // Packed Shift Left Logical (Word) -SMPTypeCategory[NN_pslld] = 14; // Packed Shift Left Logical (Dword) -SMPTypeCategory[NN_psllq] = 14; // Packed Shift Left Logical (Qword) -SMPTypeCategory[NN_psraw] = 14; // Packed Shift Right Arithmetic (Word) -SMPTypeCategory[NN_psrad] = 14; // Packed Shift Right Arithmetic (Dword) -SMPTypeCategory[NN_psrlw] = 14; // Packed Shift Right Logical (Word) -SMPTypeCategory[NN_psrld] = 14; // Packed Shift Right Logical (Dword) -SMPTypeCategory[NN_psrlq] = 14; // Packed Shift Right Logical (Qword) -SMPTypeCategory[NN_psubb] = 14; // Packed Subtract Byte -SMPTypeCategory[NN_psubw] = 14; // Packed Subtract Word -SMPTypeCategory[NN_psubd] = 14; // Packed Subtract Dword -SMPTypeCategory[NN_psubsb] = 14; // Packed Subtract with Saturation (Byte) -SMPTypeCategory[NN_psubsw] = 14; // Packed Subtract with Saturation (Word) -SMPTypeCategory[NN_psubusb] = 14; // Packed Subtract Unsigned with Saturation (Byte) -SMPTypeCategory[NN_psubusw] = 14; // Packed Subtract Unsigned with Saturation (Word) -SMPTypeCategory[NN_punpckhbw] = 14; // Unpack High Packed Data (Byte->Word) -SMPTypeCategory[NN_punpckhwd] = 14; // Unpack High Packed Data (Word->Dword) -SMPTypeCategory[NN_punpckhdq] = 14; // Unpack High Packed Data (Dword->Qword) -SMPTypeCategory[NN_punpcklbw] = 14; // Unpack Low Packed Data (Byte->Word) -SMPTypeCategory[NN_punpcklwd] = 14; // Unpack Low Packed Data (Word->Dword) -SMPTypeCategory[NN_punpckldq] = 14; // Unpack Low Packed Data (Dword->Qword) -SMPTypeCategory[NN_pxor] = 14; // Bitwise Logical Exclusive Or - -// -// Undocumented Deschutes processor instructions -// - -SMPTypeCategory[NN_fxsave] = 1; // Fast save FP context ** to where? -SMPTypeCategory[NN_fxrstor] = 1; // Fast restore FP context ** from where? - -// Pentium II instructions - -SMPTypeCategory[NN_sysenter] = 1; // Fast Transition to System Call Entry Point -SMPTypeCategory[NN_sysexit] = 1; // Fast Transition from System Call Entry Point - -// 3DNow! instructions - -SMPTypeCategory[NN_pavgusb] = 14; // Packed 8-bit Unsigned Integer Averaging -SMPTypeCategory[NN_pfadd] = 14; // Packed Floating-Point Addition -SMPTypeCategory[NN_pfsub] = 14; // Packed Floating-Point Subtraction -SMPTypeCategory[NN_pfsubr] = 14; // Packed Floating-Point Reverse Subtraction -SMPTypeCategory[NN_pfacc] = 14; // Packed Floating-Point Accumulate -SMPTypeCategory[NN_pfcmpge] = 14; // Packed Floating-Point Comparison, Greater or Equal -SMPTypeCategory[NN_pfcmpgt] = 14; // Packed Floating-Point Comparison, Greater -SMPTypeCategory[NN_pfcmpeq] = 14; // Packed Floating-Point Comparison, Equal -SMPTypeCategory[NN_pfmin] = 14; // Packed Floating-Point Minimum -SMPTypeCategory[NN_pfmax] = 14; // Packed Floating-Point Maximum -SMPTypeCategory[NN_pi2fd] = 14; // Packed 32-bit Integer to Floating-Point -SMPTypeCategory[NN_pf2id] = 14; // Packed Floating-Point to 32-bit Integer -SMPTypeCategory[NN_pfrcp] = 14; // Packed Floating-Point Reciprocal Approximation -SMPTypeCategory[NN_pfrsqrt] = 14; // Packed Floating-Point Reciprocal Square Root Approximation -SMPTypeCategory[NN_pfmul] = 14; // Packed Floating-Point Multiplication -SMPTypeCategory[NN_pfrcpit1] = 14; // Packed Floating-Point Reciprocal First Iteration Step -SMPTypeCategory[NN_pfrsqit1] = 14; // Packed Floating-Point Reciprocal Square Root First Iteration Step -SMPTypeCategory[NN_pfrcpit2] = 14; // Packed Floating-Point Reciprocal Second Iteration Step -SMPTypeCategory[NN_pmulhrw] = 14; // Packed Floating-Point 16-bit Integer Multiply with rounding -SMPTypeCategory[NN_femms] = 1; // Faster entry/exit of the MMX or floating-point state -SMPTypeCategory[NN_prefetch] = 1; // Prefetch at least a 32-byte line into L1 data cache -SMPTypeCategory[NN_prefetchw] = 1; // Prefetch processor cache line into L1 data cache (mark as modified) - - -// Pentium III instructions - -SMPTypeCategory[NN_addps] = 14; // Packed Single-FP Add -SMPTypeCategory[NN_addss] = 14; // Scalar Single-FP Add -SMPTypeCategory[NN_andnps] = 14; // Bitwise Logical And Not for Single-FP -SMPTypeCategory[NN_andps] = 14; // Bitwise Logical And for Single-FP -SMPTypeCategory[NN_cmpps] = 14; // Packed Single-FP Compare -SMPTypeCategory[NN_cmpss] = 14; // Scalar Single-FP Compare -SMPTypeCategory[NN_comiss] = 14; // Scalar Ordered Single-FP Compare and Set EFLAGS -SMPTypeCategory[NN_cvtpi2ps] = 14; // Packed signed INT32 to Packed Single-FP conversion -SMPTypeCategory[NN_cvtps2pi] = 14; // Packed Single-FP to Packed INT32 conversion -SMPTypeCategory[NN_cvtsi2ss] = 14; // Scalar signed INT32 to Single-FP conversion -SMPTypeCategory[NN_cvtss2si] = 14; // Scalar Single-FP to signed INT32 conversion -SMPTypeCategory[NN_cvttps2pi] = 14; // Packed Single-FP to Packed INT32 conversion (truncate) -SMPTypeCategory[NN_cvttss2si] = 14; // Scalar Single-FP to signed INT32 conversion (truncate) -SMPTypeCategory[NN_divps] = 14; // Packed Single-FP Divide -SMPTypeCategory[NN_divss] = 14; // Scalar Single-FP Divide -SMPTypeCategory[NN_ldmxcsr] = 14; // Load Streaming SIMD Extensions Technology Control/Status Register -SMPTypeCategory[NN_maxps] = 14; // Packed Single-FP Maximum -SMPTypeCategory[NN_maxss] = 14; // Scalar Single-FP Maximum -SMPTypeCategory[NN_minps] = 14; // Packed Single-FP Minimum -SMPTypeCategory[NN_minss] = 14; // Scalar Single-FP Minimum -SMPTypeCategory[NN_movaps] = 15; // Move Aligned Four Packed Single-FP ** infer memsrc 'n'? -SMPTypeCategory[NN_movhlps] = 15; // Move High to Low Packed Single-FP -SMPTypeCategory[NN_movhps] = 15; // Move High Packed Single-FP -SMPTypeCategory[NN_movlhps] = 15; // Move Low to High Packed Single-FP -SMPTypeCategory[NN_movlps] = 15; // Move Low Packed Single-FP -SMPTypeCategory[NN_movmskps] = 15; // Move Mask to Register -SMPTypeCategory[NN_movss] = 15; // Move Scalar Single-FP -SMPTypeCategory[NN_movups] = 15; // Move Unaligned Four Packed Single-FP -SMPTypeCategory[NN_mulps] = 14; // Packed Single-FP Multiply -SMPTypeCategory[NN_mulss] = 14; // Scalar Single-FP Multiply -SMPTypeCategory[NN_orps] = 14; // Bitwise Logical OR for Single-FP Data -SMPTypeCategory[NN_rcpps] = 14; // Packed Single-FP Reciprocal -SMPTypeCategory[NN_rcpss] = 14; // Scalar Single-FP Reciprocal -SMPTypeCategory[NN_rsqrtps] = 14; // Packed Single-FP Square Root Reciprocal -SMPTypeCategory[NN_rsqrtss] = 14; // Scalar Single-FP Square Root Reciprocal -SMPTypeCategory[NN_shufps] = 14; // Shuffle Single-FP -SMPTypeCategory[NN_sqrtps] = 14; // Packed Single-FP Square Root -SMPTypeCategory[NN_sqrtss] = 14; // Scalar Single-FP Square Root -SMPTypeCategory[NN_stmxcsr] = 15; // Store Streaming SIMD Extensions Technology Control/Status Register ** Infer dest is 'n' -SMPTypeCategory[NN_subps] = 14; // Packed Single-FP Subtract -SMPTypeCategory[NN_subss] = 14; // Scalar Single-FP Subtract -SMPTypeCategory[NN_ucomiss] = 14; // Scalar Unordered Single-FP Compare and Set EFLAGS -SMPTypeCategory[NN_unpckhps] = 14; // Unpack High Packed Single-FP Data -SMPTypeCategory[NN_unpcklps] = 14; // Unpack Low Packed Single-FP Data -SMPTypeCategory[NN_xorps] = 14; // Bitwise Logical XOR for Single-FP Data -SMPTypeCategory[NN_pavgb] = 14; // Packed Average (Byte) -SMPTypeCategory[NN_pavgw] = 14; // Packed Average (Word) -SMPTypeCategory[NN_pextrw] = 15; // Extract Word -SMPTypeCategory[NN_pinsrw] = 14; // Insert Word -SMPTypeCategory[NN_pmaxsw] = 14; // Packed Signed Integer Word Maximum -SMPTypeCategory[NN_pmaxub] = 14; // Packed Unsigned Integer Byte Maximum -SMPTypeCategory[NN_pminsw] = 14; // Packed Signed Integer Word Minimum -SMPTypeCategory[NN_pminub] = 14; // Packed Unsigned Integer Byte Minimum -SMPTypeCategory[NN_pmovmskb] = 2; // Move Byte Mask to Integer -SMPTypeCategory[NN_pmulhuw] = 14; // Packed Multiply High Unsigned -SMPTypeCategory[NN_psadbw] = 14; // Packed Sum of Absolute Differences -SMPTypeCategory[NN_pshufw] = 14; // Packed Shuffle Word -SMPTypeCategory[NN_maskmovq] = 15; // Byte Mask write ** Infer dest is 'n' -SMPTypeCategory[NN_movntps] = 13; // Move Aligned Four Packed Single-FP Non Temporal * infer dest is 'n' -SMPTypeCategory[NN_movntq] = 13; // Move 64 Bits Non Temporal ** Infer dest is 'n' -SMPTypeCategory[NN_prefetcht0] = 1; // Prefetch to all cache levels -SMPTypeCategory[NN_prefetcht1] = 1; // Prefetch to all cache levels -SMPTypeCategory[NN_prefetcht2] = 1; // Prefetch to L2 cache -SMPTypeCategory[NN_prefetchnta] = 1; // Prefetch to L1 cache -SMPTypeCategory[NN_sfence] = 1; // Store Fence - -// Pentium III Pseudo instructions - -SMPTypeCategory[NN_cmpeqps] = 14; // Packed Single-FP Compare EQ -SMPTypeCategory[NN_cmpltps] = 14; // Packed Single-FP Compare LT -SMPTypeCategory[NN_cmpleps] = 14; // Packed Single-FP Compare LE -SMPTypeCategory[NN_cmpunordps] = 14; // Packed Single-FP Compare UNORD -SMPTypeCategory[NN_cmpneqps] = 14; // Packed Single-FP Compare NOT EQ -SMPTypeCategory[NN_cmpnltps] = 14; // Packed Single-FP Compare NOT LT -SMPTypeCategory[NN_cmpnleps] = 14; // Packed Single-FP Compare NOT LE -SMPTypeCategory[NN_cmpordps] = 14; // Packed Single-FP Compare ORDERED -SMPTypeCategory[NN_cmpeqss] = 14; // Scalar Single-FP Compare EQ -SMPTypeCategory[NN_cmpltss] = 14; // Scalar Single-FP Compare LT -SMPTypeCategory[NN_cmpless] = 14; // Scalar Single-FP Compare LE -SMPTypeCategory[NN_cmpunordss] = 14; // Scalar Single-FP Compare UNORD -SMPTypeCategory[NN_cmpneqss] = 14; // Scalar Single-FP Compare NOT EQ -SMPTypeCategory[NN_cmpnltss] = 14; // Scalar Single-FP Compare NOT LT -SMPTypeCategory[NN_cmpnless] = 14; // Scalar Single-FP Compare NOT LE -SMPTypeCategory[NN_cmpordss] = 14; // Scalar Single-FP Compare ORDERED - -// AMD K7 instructions - -// Revisit AMD if we port to it. -SMPTypeCategory[NN_pf2iw] = 15; // Packed Floating-Point to Integer with Sign Extend -SMPTypeCategory[NN_pfnacc] = 15; // Packed Floating-Point Negative Accumulate -SMPTypeCategory[NN_pfpnacc] = 15; // Packed Floating-Point Mixed Positive-Negative Accumulate -SMPTypeCategory[NN_pi2fw] = 15; // Packed 16-bit Integer to Floating-Point -SMPTypeCategory[NN_pswapd] = 15; // Packed Swap Double Word - -// Undocumented FP instructions (thanks to norbert.juffa@adm.com) - -SMPTypeCategory[NN_fstp1] = 9; // Alias of Store Real and Pop -SMPTypeCategory[NN_fcom2] = 1; // Alias of Compare Real -SMPTypeCategory[NN_fcomp3] = 1; // Alias of Compare Real and Pop -SMPTypeCategory[NN_fxch4] = 1; // Alias of Exchange Registers -SMPTypeCategory[NN_fcomp5] = 1; // Alias of Compare Real and Pop -SMPTypeCategory[NN_ffreep] = 1; // Free Register and Pop -SMPTypeCategory[NN_fxch7] = 1; // Alias of Exchange Registers -SMPTypeCategory[NN_fstp8] = 9; // Alias of Store Real and Pop -SMPTypeCategory[NN_fstp9] = 9; // Alias of Store Real and Pop - -// Pentium 4 instructions - -SMPTypeCategory[NN_addpd] = 14; // Add Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_addsd] = 14; // Add Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_andnpd] = 14; // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_andpd] = 14; // Bitwise Logical AND of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_clflush] = 1; // Flush Cache Line -SMPTypeCategory[NN_cmppd] = 14; // Compare Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_cmpsd] = 14; // Compare Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_comisd] = 14; // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS -SMPTypeCategory[NN_cvtdq2pd] = 14; // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_cvtdq2ps] = 14; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_cvtpd2dq] = 14; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -SMPTypeCategory[NN_cvtpd2pi] = 14; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -SMPTypeCategory[NN_cvtpd2ps] = 14; // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_cvtpi2pd] = 14; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_cvtps2dq] = 14; // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers -SMPTypeCategory[NN_cvtps2pd] = 14; // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_cvtsd2si] = 14; // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer -SMPTypeCategory[NN_cvtsd2ss] = 14; // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value -SMPTypeCategory[NN_cvtsi2sd] = 14; // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value -SMPTypeCategory[NN_cvtss2sd] = 14; // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value -SMPTypeCategory[NN_cvttpd2dq] = 14; // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -SMPTypeCategory[NN_cvttpd2pi] = 14; // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -SMPTypeCategory[NN_cvttps2dq] = 14; // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers -SMPTypeCategory[NN_cvttsd2si] = 14; // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer -SMPTypeCategory[NN_divpd] = 14; // Divide Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_divsd] = 14; // Divide Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_lfence] = 1; // Load Fence -SMPTypeCategory[NN_maskmovdqu] = 13; // Store Selected Bytes of Double Quadword ** Infer dest is 'n' -SMPTypeCategory[NN_maxpd] = 14; // Return Maximum Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_maxsd] = 14; // Return Maximum Scalar Double-Precision Floating-Point Value -SMPTypeCategory[NN_mfence] = 1; // Memory Fence -SMPTypeCategory[NN_minpd] = 14; // Return Minimum Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_minsd] = 14; // Return Minimum Scalar Double-Precision Floating-Point Value -SMPTypeCategory[NN_movapd] = 15; // Move Aligned Packed Double-Precision Floating-Point Values ** Infer dest is 'n' -SMPTypeCategory[NN_movdq2q] = 15; // Move Quadword from XMM to MMX Register -SMPTypeCategory[NN_movdqa] = 15; // Move Aligned Double Quadword ** Infer dest is 'n' -SMPTypeCategory[NN_movdqu] = 15; // Move Unaligned Double Quadword ** Infer dest is 'n' -SMPTypeCategory[NN_movhpd] = 15; // Move High Packed Double-Precision Floating-Point Values ** Infer dest is 'n' -SMPTypeCategory[NN_movlpd] = 15; // Move Low Packed Double-Precision Floating-Point Values ** Infer dest is 'n' -SMPTypeCategory[NN_movmskpd] = 15; // Extract Packed Double-Precision Floating-Point Sign Mask -SMPTypeCategory[NN_movntdq] = 13; // Store Double Quadword Using Non-Temporal Hint -SMPTypeCategory[NN_movnti] = 13; // Store Doubleword Using Non-Temporal Hint -SMPTypeCategory[NN_movntpd] = 13; // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint -SMPTypeCategory[NN_movq2dq] = 1; // Move Quadword from MMX to XMM Register -SMPTypeCategory[NN_movsd] = 15; // Move Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_movupd] = 15; // Move Unaligned Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_mulpd] = 14; // Multiply Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_mulsd] = 14; // Multiply Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_orpd] = 14; // Bitwise Logical OR of Double-Precision Floating-Point Values -SMPTypeCategory[NN_paddq] = 14; // Add Packed Quadword Integers -SMPTypeCategory[NN_pause] = 1; // Spin Loop Hint -SMPTypeCategory[NN_pmuludq] = 14; // Multiply Packed Unsigned Doubleword Integers -SMPTypeCategory[NN_pshufd] = 14; // Shuffle Packed Doublewords -SMPTypeCategory[NN_pshufhw] = 14; // Shuffle Packed High Words -SMPTypeCategory[NN_pshuflw] = 14; // Shuffle Packed Low Words -SMPTypeCategory[NN_pslldq] = 14; // Shift Double Quadword Left Logical -SMPTypeCategory[NN_psrldq] = 14; // Shift Double Quadword Right Logical -SMPTypeCategory[NN_psubq] = 14; // Subtract Packed Quadword Integers -SMPTypeCategory[NN_punpckhqdq] = 14; // Unpack High Data -SMPTypeCategory[NN_punpcklqdq] = 14; // Unpack Low Data -SMPTypeCategory[NN_shufpd] = 14; // Shuffle Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_sqrtpd] = 1; // Compute Square Roots of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_sqrtsd] = 14; // Compute Square Rootof Scalar Double-Precision Floating-Point Value -SMPTypeCategory[NN_subpd] = 14; // Subtract Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_subsd] = 14; // Subtract Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_ucomisd] = 14; // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS -SMPTypeCategory[NN_unpckhpd] = 14; // Unpack and Interleave High Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_unpcklpd] = 14; // Unpack and Interleave Low Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_xorpd] = 14; // Bitwise Logical OR of Double-Precision Floating-Point Values - - -// AMD syscall/sysret instructions NOTE: not AMD, found in Intel manual - -SMPTypeCategory[NN_syscall] = 1; // Low latency system call -SMPTypeCategory[NN_sysret] = 1; // Return from system call - -// AMD64 instructions NOTE: not AMD, found in Intel manual - -SMPTypeCategory[NN_swapgs] = 1; // Exchange GS base with KernelGSBase MSR - -// New Pentium instructions (SSE3) - -SMPTypeCategory[NN_movddup] = 14; // Move One Double-FP and Duplicate -SMPTypeCategory[NN_movshdup] = 14; // Move Packed Single-FP High and Duplicate -SMPTypeCategory[NN_movsldup] = 14; // Move Packed Single-FP Low and Duplicate - -// Missing AMD64 instructions NOTE: also found in Intel manual - -SMPTypeCategory[NN_movsxd] = 2; // Move with Sign-Extend Doubleword -SMPTypeCategory[NN_cmpxchg16b] = 0; // Compare and Exchange 16 Bytes - -// SSE3 instructions - -SMPTypeCategory[NN_addsubpd] = 14; // Add /Sub packed DP FP numbers -SMPTypeCategory[NN_addsubps] = 14; // Add /Sub packed SP FP numbers -SMPTypeCategory[NN_haddpd] = 14; // Add horizontally packed DP FP numbers -SMPTypeCategory[NN_haddps] = 14; // Add horizontally packed SP FP numbers -SMPTypeCategory[NN_hsubpd] = 14; // Sub horizontally packed DP FP numbers -SMPTypeCategory[NN_hsubps] = 14; // Sub horizontally packed SP FP numbers -SMPTypeCategory[NN_monitor] = 1; // Set up a linear address range to be monitored by hardware -SMPTypeCategory[NN_mwait] = 1; // Wait until write-back store performed within the range specified by the MONITOR instruction -SMPTypeCategory[NN_fisttp] = 13; // Store ST in intXX (chop) and pop -SMPTypeCategory[NN_lddqu] = 14; // Load unaligned integer 128-bit - -// SSSE3 instructions - -SMPTypeCategory[NN_psignb] = 14; // Packed SIGN Byte -SMPTypeCategory[NN_psignw] = 14; // Packed SIGN Word -SMPTypeCategory[NN_psignd] = 14; // Packed SIGN Doubleword -SMPTypeCategory[NN_pshufb] = 14; // Packed Shuffle Bytes -SMPTypeCategory[NN_pmulhrsw] = 14; // Packed Multiply High with Round and Scale -SMPTypeCategory[NN_pmaddubsw] = 14; // Multiply and Add Packed Signed and Unsigned Bytes -SMPTypeCategory[NN_phsubsw] = 14; // Packed Horizontal Subtract and Saturate -SMPTypeCategory[NN_phaddsw] = 14; // Packed Horizontal Add and Saturate -SMPTypeCategory[NN_phaddw] = 14; // Packed Horizontal Add Word -SMPTypeCategory[NN_phaddd] = 14; // Packed Horizontal Add Doubleword -SMPTypeCategory[NN_phsubw] = 14; // Packed Horizontal Subtract Word -SMPTypeCategory[NN_phsubd] = 14; // Packed Horizontal Subtract Doubleword -SMPTypeCategory[NN_palignr] = 15; // Packed Align Right -SMPTypeCategory[NN_pabsb] = 14; // Packed Absolute Value Byte -SMPTypeCategory[NN_pabsw] = 14; // Packed Absolute Value Word -SMPTypeCategory[NN_pabsd] = 14; // Packed Absolute Value Doubleword - -// VMX instructions - -SMPTypeCategory[NN_vmcall] = 1; // Call to VM Monitor -SMPTypeCategory[NN_vmclear] = 0; // Clear Virtual Machine Control Structure -SMPTypeCategory[NN_vmlaunch] = 1; // Launch Virtual Machine -SMPTypeCategory[NN_vmresume] = 1; // Resume Virtual Machine -SMPTypeCategory[NN_vmptrld] = 6; // Load Pointer to Virtual Machine Control Structure -SMPTypeCategory[NN_vmptrst] = 0; // Store Pointer to Virtual Machine Control Structure -SMPTypeCategory[NN_vmread] = 0; // Read Field from Virtual Machine Control Structure -SMPTypeCategory[NN_vmwrite] = 0; // Write Field from Virtual Machine Control Structure -SMPTypeCategory[NN_vmxoff] = 1; // Leave VMX Operation -SMPTypeCategory[NN_vmxon] = 1; // Enter VMX Operation - -#if 599 < IDA_SDK_VERSION - -SMPTypeCategory[NN_ud2] = 1; // Undefined Instruction - -// Added with x86-64 - -SMPTypeCategory[NN_rdtscp] = 8; // Read Time-Stamp Counter and Processor ID - -// Geode LX 3DNow! extensions - -SMPTypeCategory[NN_pfrcpv] = 1; // Reciprocal Approximation for a Pair of 32-bit Floats -SMPTypeCategory[NN_pfrsqrtv] = 1; // Reciprocal Square Root Approximation for a Pair of 32-bit Floats - -// SSE2 pseudoinstructions - -SMPTypeCategory[NN_cmpeqpd] = 1; // Packed Double-FP Compare EQ -SMPTypeCategory[NN_cmpltpd] = 1; // Packed Double-FP Compare LT -SMPTypeCategory[NN_cmplepd] = 1; // Packed Double-FP Compare LE -SMPTypeCategory[NN_cmpunordpd] = 1; // Packed Double-FP Compare UNORD -SMPTypeCategory[NN_cmpneqpd] = 1; // Packed Double-FP Compare NOT EQ -SMPTypeCategory[NN_cmpnltpd] = 1; // Packed Double-FP Compare NOT LT -SMPTypeCategory[NN_cmpnlepd] = 1; // Packed Double-FP Compare NOT LE -SMPTypeCategory[NN_cmpordpd] = 1; // Packed Double-FP Compare ORDERED -SMPTypeCategory[NN_cmpeqsd] = 1; // Scalar Double-FP Compare EQ -SMPTypeCategory[NN_cmpltsd] = 1; // Scalar Double-FP Compare LT -SMPTypeCategory[NN_cmplesd] = 1; // Scalar Double-FP Compare LE -SMPTypeCategory[NN_cmpunordsd] = 1; // Scalar Double-FP Compare UNORD -SMPTypeCategory[NN_cmpneqsd] = 1; // Scalar Double-FP Compare NOT EQ -SMPTypeCategory[NN_cmpnltsd] = 1; // Scalar Double-FP Compare NOT LT -SMPTypeCategory[NN_cmpnlesd] = 1; // Scalar Double-FP Compare NOT LE -SMPTypeCategory[NN_cmpordsd] = 1; // Scalar Double-FP Compare ORDERED - -// SSSE4.1 instructions - -SMPTypeCategory[NN_blendpd] = 14; // Blend Packed Double Precision Floating-Point Values -SMPTypeCategory[NN_blendps] = 14; // Blend Packed Single Precision Floating-Point Values -SMPTypeCategory[NN_blendvpd] = 14; // Variable Blend Packed Double Precision Floating-Point Values -SMPTypeCategory[NN_blendvps] = 14; // Variable Blend Packed Single Precision Floating-Point Values -SMPTypeCategory[NN_dppd] = 14; // Dot Product of Packed Double Precision Floating-Point Values -SMPTypeCategory[NN_dpps] = 14; // Dot Product of Packed Single Precision Floating-Point Values -SMPTypeCategory[NN_extractps] = 15; // Extract Packed Single Precision Floating-Point Value -SMPTypeCategory[NN_insertps] = 14; // Insert Packed Single Precision Floating-Point Value -SMPTypeCategory[NN_movntdqa] = 0; // Load Double Quadword Non-Temporal Aligned Hint -SMPTypeCategory[NN_mpsadbw] = 1; // Compute Multiple Packed Sums of Absolute Difference -SMPTypeCategory[NN_packusdw] = 14; // Pack with Unsigned Saturation -SMPTypeCategory[NN_pblendvb] = 14; // Variable Blend Packed Bytes -SMPTypeCategory[NN_pblendw] = 14; // Blend Packed Words -SMPTypeCategory[NN_pcmpeqq] = 14; // Compare Packed Qword Data for Equal -SMPTypeCategory[NN_pextrb] = 15; // Extract Byte -SMPTypeCategory[NN_pextrd] = 15; // Extract Dword -SMPTypeCategory[NN_pextrq] = 15; // Extract Qword -SMPTypeCategory[NN_phminposuw] = 14; // Packed Horizontal Word Minimum -SMPTypeCategory[NN_pinsrb] = 14; // Insert Byte !!! Could this be used as a generic move??? -SMPTypeCategory[NN_pinsrd] = 14; // Insert Dword !!! Could this be used as a generic move??? -SMPTypeCategory[NN_pinsrq] = 14; // Insert Qword !!! Could this be used as a generic move??? -SMPTypeCategory[NN_pmaxsb] = 14; // Maximum of Packed Signed Byte Integers -SMPTypeCategory[NN_pmaxsd] = 14; // Maximum of Packed Signed Dword Integers -SMPTypeCategory[NN_pmaxud] = 14; // Maximum of Packed Unsigned Dword Integers -SMPTypeCategory[NN_pmaxuw] = 14; // Maximum of Packed Word Integers -SMPTypeCategory[NN_pminsb] = 14; // Minimum of Packed Signed Byte Integers -SMPTypeCategory[NN_pminsd] = 14; // Minimum of Packed Signed Dword Integers -SMPTypeCategory[NN_pminud] = 14; // Minimum of Packed Unsigned Dword Integers -SMPTypeCategory[NN_pminuw] = 14; // Minimum of Packed Word Integers -SMPTypeCategory[NN_pmovsxbw] = 14; // Packed Move with Sign Extend -SMPTypeCategory[NN_pmovsxbd] = 14; // Packed Move with Sign Extend -SMPTypeCategory[NN_pmovsxbq] = 14; // Packed Move with Sign Extend -SMPTypeCategory[NN_pmovsxwd] = 14; // Packed Move with Sign Extend -SMPTypeCategory[NN_pmovsxwq] = 14; // Packed Move with Sign Extend -SMPTypeCategory[NN_pmovsxdq] = 14; // Packed Move with Sign Extend -SMPTypeCategory[NN_pmovzxbw] = 14; // Packed Move with Zero Extend -SMPTypeCategory[NN_pmovzxbd] = 14; // Packed Move with Zero Extend -SMPTypeCategory[NN_pmovzxbq] = 14; // Packed Move with Zero Extend -SMPTypeCategory[NN_pmovzxwd] = 14; // Packed Move with Zero Extend -SMPTypeCategory[NN_pmovzxwq] = 14; // Packed Move with Zero Extend -SMPTypeCategory[NN_pmovzxdq] = 14; // Packed Move with Zero Extend -SMPTypeCategory[NN_pmuldq] = 14; // Multiply Packed Signed Dword Integers -SMPTypeCategory[NN_pmulld] = 14; // Multiply Packed Signed Dword Integers and Store Low Result -SMPTypeCategory[NN_ptest] = 1; // Logical Compare -SMPTypeCategory[NN_roundpd] = 14; // Round Packed Double Precision Floating-Point Values -SMPTypeCategory[NN_roundps] = 14; // Round Packed Single Precision Floating-Point Values -SMPTypeCategory[NN_roundsd] = 14; // Round Scalar Double Precision Floating-Point Values -SMPTypeCategory[NN_roundss] = 14; // Round Scalar Single Precision Floating-Point Values - -// SSSE4.2 instructions -SMPTypeCategory[NN_crc32] = 14; // Accumulate CRC32 Value -SMPTypeCategory[NN_pcmpestri] = 2; // Packed Compare Explicit Length Strings, Return Index -SMPTypeCategory[NN_pcmpestrm] = 2; // Packed Compare Explicit Length Strings, Return Mask -SMPTypeCategory[NN_pcmpistri] = 2; // Packed Compare Implicit Length Strings, Return Index -SMPTypeCategory[NN_pcmpistrm] = 2; // Packed Compare Implicit Length Strings, Return Mask -SMPTypeCategory[NN_pcmpgtq] = 14; // Compare Packed Data for Greater Than -SMPTypeCategory[NN_popcnt] = 2; // Return the Count of Number of Bits Set to 1 - -// AMD SSE4a instructions - -SMPTypeCategory[NN_extrq] = 1; // Extract Field From Register -SMPTypeCategory[NN_insertq] = 1; // Insert Field -SMPTypeCategory[NN_movntsd] = 13; // Move Non-Temporal Scalar Double-Precision Floating-Point !!! Could this be used as a generic move??? -SMPTypeCategory[NN_movntss] = 13; // Move Non-Temporal Scalar Single-Precision Floating-Point !!! Could this be used as a generic move??? -SMPTypeCategory[NN_lzcnt] = 2; // Leading Zero Count - -// xsave/xrstor instructions - -SMPTypeCategory[NN_xgetbv] = 8; // Get Value of Extended Control Register -SMPTypeCategory[NN_xrstor] = 0; // Restore Processor Extended States -SMPTypeCategory[NN_xsave] = 1; // Save Processor Extended States -SMPTypeCategory[NN_xsetbv] = 1; // Set Value of Extended Control Register - -// Intel Safer Mode Extensions (SMX) - -SMPTypeCategory[NN_getsec] = 1; // Safer Mode Extensions (SMX) Instruction - -// AMD-V Virtualization ISA Extension - -SMPTypeCategory[NN_clgi] = 0; // Clear Global Interrupt Flag -SMPTypeCategory[NN_invlpga] = 1; // Invalidate TLB Entry in a Specified ASID -SMPTypeCategory[NN_skinit] = 1; // Secure Init and Jump with Attestation -SMPTypeCategory[NN_stgi] = 0; // Set Global Interrupt Flag -SMPTypeCategory[NN_vmexit] = 1; // Stop Executing Guest, Begin Executing Host -SMPTypeCategory[NN_vmload] = 0; // Load State from VMCB -SMPTypeCategory[NN_vmmcall] = 1; // Call VMM -SMPTypeCategory[NN_vmrun] = 1; // Run Virtual Machine -SMPTypeCategory[NN_vmsave] = 0; // Save State to VMCB - -// VMX+ instructions - -SMPTypeCategory[NN_invept] = 1; // Invalidate Translations Derived from EPT -SMPTypeCategory[NN_invvpid] = 1; // Invalidate Translations Based on VPID - -// Intel Atom instructions - -// !!!! continue work here -SMPTypeCategory[NN_movbe] = 3; // Move Data After Swapping Bytes - -// Intel AES instructions - -SMPTypeCategory[NN_aesenc] = 14; // Perform One Round of an AES Encryption Flow -SMPTypeCategory[NN_aesenclast] = 14; // Perform the Last Round of an AES Encryption Flow -SMPTypeCategory[NN_aesdec] = 14; // Perform One Round of an AES Decryption Flow -SMPTypeCategory[NN_aesdeclast] = 14; // Perform the Last Round of an AES Decryption Flow -SMPTypeCategory[NN_aesimc] = 14; // Perform the AES InvMixColumn Transformation -SMPTypeCategory[NN_aeskeygenassist] = 14; // AES Round Key Generation Assist - -// Carryless multiplication - -SMPTypeCategory[NN_pclmulqdq] = 14; // Carry-Less Multiplication Quadword - -// Returns modified by operand size prefixes - -SMPTypeCategory[NN_retnw] = 0; // Return Near from Procedure (use16) -SMPTypeCategory[NN_retnd] = 0; // Return Near from Procedure (use32) -SMPTypeCategory[NN_retnq] = 0; // Return Near from Procedure (use64) -SMPTypeCategory[NN_retfw] = 0; // Return Far from Procedure (use16) -SMPTypeCategory[NN_retfd] = 0; // Return Far from Procedure (use32) -SMPTypeCategory[NN_retfq] = 0; // Return Far from Procedure (use64) - -// RDRAND support - -SMPTypeCategory[NN_rdrand] = 2; // Read Random Number - -// new GPR instructions - -SMPTypeCategory[NN_adcx] = 5; // Unsigned Integer Addition of Two Operands with Carry Flag -SMPTypeCategory[NN_adox] = 5; // Unsigned Integer Addition of Two Operands with Overflow Flag -SMPTypeCategory[NN_andn] = 10; // Logical AND NOT -SMPTypeCategory[NN_bextr] = 14; // Bit Field Extract -SMPTypeCategory[NN_blsi] = 14; // Extract Lowest Set Isolated Bit -SMPTypeCategory[NN_blsmsk] = 2; // Get Mask Up to Lowest Set Bit -SMPTypeCategory[NN_blsr] = 2; // Reset Lowest Set Bit -SMPTypeCategory[NN_bzhi] = 2; // Zero High Bits Starting with Specified Bit Position -SMPTypeCategory[NN_clac] = 1; // Clear AC Flag in EFLAGS Register -SMPTypeCategory[NN_mulx] = 2; // Unsigned Multiply Without Affecting Flags -SMPTypeCategory[NN_pdep] = 2; // Parallel Bits Deposit -SMPTypeCategory[NN_pext] = 2; // Parallel Bits Extract -SMPTypeCategory[NN_rorx] = 2; // Rotate Right Logical Without Affecting Flags -SMPTypeCategory[NN_sarx] = 2; // Shift Arithmetically Right Without Affecting Flags -SMPTypeCategory[NN_shlx] = 2; // Shift Logically Left Without Affecting Flags -SMPTypeCategory[NN_shrx] = 2; // Shift Logically Right Without Affecting Flags -SMPTypeCategory[NN_stac] = 1; // Set AC Flag in EFLAGS Register -SMPTypeCategory[NN_tzcnt] = 2; // Count the Number of Trailing Zero Bits -SMPTypeCategory[NN_xsaveopt] = 1; // Save Processor Extended States Optimized -SMPTypeCategory[NN_invpcid] = 1; // Invalidate Processor Context ID -SMPTypeCategory[NN_rdseed] = 2; // Read Random Seed -SMPTypeCategory[NN_rdfsbase] = 6; // Read FS Segment Base -SMPTypeCategory[NN_rdgsbase] = 6; // Read GS Segment Base -SMPTypeCategory[NN_wrfsbase] = 6; // Write FS Segment Base -SMPTypeCategory[NN_wrgsbase] = 6; // Write GS Segment Base - -// new AVX instructions - -SMPTypeCategory[NN_vaddpd] = 14; // Add Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vaddps] = 14; // Packed Single-FP Add -SMPTypeCategory[NN_vaddsd] = 14; // Add Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vaddss] = 14; // Scalar Single-FP Add -SMPTypeCategory[NN_vaddsubpd] = 14; // Add /Sub packed DP FP numbers -SMPTypeCategory[NN_vaddsubps] = 14; // Add /Sub packed SP FP numbers -SMPTypeCategory[NN_vaesdec] = 14; // Perform One Round of an AES Decryption Flow -SMPTypeCategory[NN_vaesdeclast] = 14; // Perform the Last Round of an AES Decryption Flow -SMPTypeCategory[NN_vaesenc] = 14; // Perform One Round of an AES Encryption Flow -SMPTypeCategory[NN_vaesenclast] = 14; // Perform the Last Round of an AES Encryption Flow -SMPTypeCategory[NN_vaesimc] = 14; // Perform the AES InvMixColumn Transformation -SMPTypeCategory[NN_vaeskeygenassist] = 14; // AES Round Key Generation Assist -SMPTypeCategory[NN_vandnpd] = 14; // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vandnps] = 14; // Bitwise Logical And Not for Single-FP -SMPTypeCategory[NN_vandpd] = 14; // Bitwise Logical AND of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vandps] = 14; // Bitwise Logical And for Single-FP -SMPTypeCategory[NN_vblendpd] = 14; // Blend Packed Double Precision Floating-Point Values -SMPTypeCategory[NN_vblendps] = 14; // Blend Packed Single Precision Floating-Point Values -SMPTypeCategory[NN_vblendvpd] = 14; // Variable Blend Packed Double Precision Floating-Point Values -SMPTypeCategory[NN_vblendvps] = 14; // Variable Blend Packed Single Precision Floating-Point Values -SMPTypeCategory[NN_vbroadcastf128] = 14; // Broadcast 128 Bits of Floating-Point Data -SMPTypeCategory[NN_vbroadcasti128] = 14; // Broadcast 128 Bits of Integer Data -SMPTypeCategory[NN_vbroadcastsd] = 14; // Broadcast Double-Precision Floating-Point Element -SMPTypeCategory[NN_vbroadcastss] = 14; // Broadcast Single-Precision Floating-Point Element -SMPTypeCategory[NN_vcmppd] = 14; // Compare Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vcmpps] = 14; // Packed Single-FP Compare -SMPTypeCategory[NN_vcmpsd] = 14; // Compare Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vcmpss] = 14; // Scalar Single-FP Compare -SMPTypeCategory[NN_vcomisd] = 14; // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS -SMPTypeCategory[NN_vcomiss] = 14; // Scalar Ordered Single-FP Compare and Set EFLAGS -SMPTypeCategory[NN_vcvtdq2pd] = 14; // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vcvtdq2ps] = 14; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vcvtpd2dq] = 14; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -SMPTypeCategory[NN_vcvtpd2ps] = 14; // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vcvtph2ps] = 14; // Convert 16-bit FP Values to Single-Precision FP Values -SMPTypeCategory[NN_vcvtps2dq] = 14; // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers -SMPTypeCategory[NN_vcvtps2pd] = 14; // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vcvtps2ph] = 14; // Convert Single-Precision FP value to 16-bit FP value -SMPTypeCategory[NN_vcvtsd2si] = 14; // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer -SMPTypeCategory[NN_vcvtsd2ss] = 14; // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value -SMPTypeCategory[NN_vcvtsi2sd] = 14; // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value -SMPTypeCategory[NN_vcvtsi2ss] = 14; // Scalar signed INT32 to Single-FP conversion -SMPTypeCategory[NN_vcvtss2sd] = 14; // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value -SMPTypeCategory[NN_vcvtss2si] = 14; // Scalar Single-FP to signed INT32 conversion -SMPTypeCategory[NN_vcvttpd2dq] = 14; // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -SMPTypeCategory[NN_vcvttps2dq] = 14; // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers -SMPTypeCategory[NN_vcvttsd2si] = 14; // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer -SMPTypeCategory[NN_vcvttss2si] = 14; // Scalar Single-FP to signed INT32 conversion (truncate) -SMPTypeCategory[NN_vdivpd] = 14; // Divide Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vdivps] = 14; // Packed Single-FP Divide -SMPTypeCategory[NN_vdivsd] = 14; // Divide Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vdivss] = 14; // Scalar Single-FP Divide -SMPTypeCategory[NN_vdppd] = 14; // Dot Product of Packed Double Precision Floating-Point Values -SMPTypeCategory[NN_vdpps] = 14; // Dot Product of Packed Single Precision Floating-Point Values -SMPTypeCategory[NN_vextractf128] = 14; // Extract Packed Floating-Point Values -SMPTypeCategory[NN_vextracti128] = 14; // Extract Packed Integer Values -SMPTypeCategory[NN_vextractps] = 14; // Extract Packed Floating-Point Values -SMPTypeCategory[NN_vfmadd132pd] = 14; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmadd132ps] = 14; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmadd132sd] = 14; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmadd132ss] = 14; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmadd213pd] = 14; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmadd213ps] = 14; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmadd213sd] = 14; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmadd213ss] = 14; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmadd231pd] = 14; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmadd231ps] = 14; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmadd231sd] = 14; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmadd231ss] = 14; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmaddsub132pd] = 14; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmaddsub132ps] = 14; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmaddsub213pd] = 14; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmaddsub213ps] = 14; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmaddsub231pd] = 14; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmaddsub231ps] = 14; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsub132pd] = 14; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsub132ps] = 14; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsub132sd] = 14; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsub132ss] = 14; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsub213pd] = 14; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsub213ps] = 14; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsub213sd] = 14; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsub213ss] = 14; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsub231pd] = 14; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsub231ps] = 14; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsub231sd] = 14; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsub231ss] = 14; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsubadd132pd] = 14; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsubadd132ps] = 14; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsubadd213pd] = 14; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsubadd213ps] = 14; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsubadd231pd] = 14; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfmsubadd231ps] = 14; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmadd132pd] = 14; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmadd132ps] = 14; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmadd132sd] = 14; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmadd132ss] = 14; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmadd213pd] = 14; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmadd213ps] = 14; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmadd213sd] = 14; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmadd213ss] = 14; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmadd231pd] = 14; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmadd231ps] = 14; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmadd231sd] = 14; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmadd231ss] = 14; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmsub132pd] = 14; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmsub132ps] = 14; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmsub132sd] = 14; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmsub132ss] = 14; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmsub213pd] = 14; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmsub213ps] = 14; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmsub213sd] = 14; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmsub213ss] = 14; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmsub231pd] = 14; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmsub231ps] = 14; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmsub231sd] = 14; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vfnmsub231ss] = 14; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values -SMPTypeCategory[NN_vgatherdps] = 14; // Gather Packed SP FP Values Using Signed Dword Indices -SMPTypeCategory[NN_vgatherdpd] = 14; // Gather Packed DP FP Values Using Signed Dword Indices -SMPTypeCategory[NN_vgatherqps] = 14; // Gather Packed SP FP Values Using Signed Qword Indices -SMPTypeCategory[NN_vgatherqpd] = 14; // Gather Packed DP FP Values Using Signed Qword Indices -SMPTypeCategory[NN_vhaddpd] = 14; // Add horizontally packed DP FP numbers -SMPTypeCategory[NN_vhaddps] = 14; // Add horizontally packed SP FP numbers -SMPTypeCategory[NN_vhsubpd] = 14; // Sub horizontally packed DP FP numbers -SMPTypeCategory[NN_vhsubps] = 14; // Sub horizontally packed SP FP numbers -SMPTypeCategory[NN_vinsertf128] = 14; // Insert Packed Floating-Point Values -SMPTypeCategory[NN_vinserti128] = 14; // Insert Packed Integer Values -SMPTypeCategory[NN_vinsertps] = 14; // Insert Packed Single Precision Floating-Point Value -SMPTypeCategory[NN_vlddqu] = 14; // Load Unaligned Packed Integer Values -SMPTypeCategory[NN_vldmxcsr] = 14; // Load Streaming SIMD Extensions Technology Control/Status Register -SMPTypeCategory[NN_vmaskmovdqu] = 15; // Store Selected Bytes of Double Quadword with NT Hint -SMPTypeCategory[NN_vmaskmovpd] = 15; // Conditionally Load Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vmaskmovps] = 15; // Conditionally Load Packed Single-Precision Floating-Point Values -SMPTypeCategory[NN_vmaxpd] = 14; // Return Maximum Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vmaxps] = 14; // Packed Single-FP Maximum -SMPTypeCategory[NN_vmaxsd] = 14; // Return Maximum Scalar Double-Precision Floating-Point Value -SMPTypeCategory[NN_vmaxss] = 14; // Scalar Single-FP Maximum -SMPTypeCategory[NN_vminpd] = 14; // Return Minimum Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vminps] = 14; // Packed Single-FP Minimum -SMPTypeCategory[NN_vminsd] = 14; // Return Minimum Scalar Double-Precision Floating-Point Value -SMPTypeCategory[NN_vminss] = 14; // Scalar Single-FP Minimum -SMPTypeCategory[NN_vmovapd] = 15; // Move Aligned Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vmovaps] = 15; // Move Aligned Four Packed Single-FP -SMPTypeCategory[NN_vmovd] = 15; // Move 32 bits -SMPTypeCategory[NN_vmovddup] = 15; // Move One Double-FP and Duplicate -SMPTypeCategory[NN_vmovdqa] = 15; // Move Aligned Double Quadword -SMPTypeCategory[NN_vmovdqu] = 15; // Move Unaligned Double Quadword -SMPTypeCategory[NN_vmovhlps] = 15; // Move High to Low Packed Single-FP -SMPTypeCategory[NN_vmovhpd] = 15; // Move High Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vmovhps] = 15; // Move High Packed Single-FP -SMPTypeCategory[NN_vmovlhps] = 15; // Move Low to High Packed Single-FP -SMPTypeCategory[NN_vmovlpd] = 15; // Move Low Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vmovlps] = 15; // Move Low Packed Single-FP -SMPTypeCategory[NN_vmovmskpd] = 15; // Extract Packed Double-Precision Floating-Point Sign Mask -SMPTypeCategory[NN_vmovmskps] = 15; // Move Mask to Register -SMPTypeCategory[NN_vmovntdq] = 15; // Store Double Quadword Using Non-Temporal Hint -SMPTypeCategory[NN_vmovntdqa] = 15; // Load Double Quadword Non-Temporal Aligned Hint -SMPTypeCategory[NN_vmovntpd] = 15; // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint -SMPTypeCategory[NN_vmovntps] = 15; // Move Aligned Four Packed Single-FP Non Temporal -SMPTypeCategory[NN_vmovntsd] = 15; // Move Non-Temporal Scalar Double-Precision Floating-Point -SMPTypeCategory[NN_vmovntss] = 15; // Move Non-Temporal Scalar Single-Precision Floating-Point -SMPTypeCategory[NN_vmovq] = 15; // Move 64 bits -SMPTypeCategory[NN_vmovsd] = 15; // Move Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vmovshdup] = 15; // Move Packed Single-FP High and Duplicate -SMPTypeCategory[NN_vmovsldup] = 15; // Move Packed Single-FP Low and Duplicate -SMPTypeCategory[NN_vmovss] = 15; // Move Scalar Single-FP -SMPTypeCategory[NN_vmovupd] = 15; // Move Unaligned Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vmovups] = 15; // Move Unaligned Four Packed Single-FP -SMPTypeCategory[NN_vmpsadbw] = 14; // Compute Multiple Packed Sums of Absolute Difference -SMPTypeCategory[NN_vmulpd] = 14; // Multiply Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vmulps] = 14; // Packed Single-FP Multiply -SMPTypeCategory[NN_vmulsd] = 14; // Multiply Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vmulss] = 14; // Scalar Single-FP Multiply -SMPTypeCategory[NN_vorpd] = 14; // Bitwise Logical OR of Double-Precision Floating-Point Values -SMPTypeCategory[NN_vorps] = 14; // Bitwise Logical OR for Single-FP Data -SMPTypeCategory[NN_vpabsb] = 14; // Packed Absolute Value Byte -SMPTypeCategory[NN_vpabsd] = 14; // Packed Absolute Value Doubleword -SMPTypeCategory[NN_vpabsw] = 14; // Packed Absolute Value Word -SMPTypeCategory[NN_vpackssdw] = 14; // Pack with Signed Saturation (Dword->Word) -SMPTypeCategory[NN_vpacksswb] = 14; // Pack with Signed Saturation (Word->Byte) -SMPTypeCategory[NN_vpackusdw] = 14; // Pack with Unsigned Saturation -SMPTypeCategory[NN_vpackuswb] = 14; // Pack with Unsigned Saturation (Word->Byte) -SMPTypeCategory[NN_vpaddb] = 14; // Packed Add Byte -SMPTypeCategory[NN_vpaddd] = 14; // Packed Add Dword -SMPTypeCategory[NN_vpaddq] = 14; // Add Packed Quadword Integers -SMPTypeCategory[NN_vpaddsb] = 14; // Packed Add with Saturation (Byte) -SMPTypeCategory[NN_vpaddsw] = 14; // Packed Add with Saturation (Word) -SMPTypeCategory[NN_vpaddusb] = 14; // Packed Add Unsigned with Saturation (Byte) -SMPTypeCategory[NN_vpaddusw] = 14; // Packed Add Unsigned with Saturation (Word) -SMPTypeCategory[NN_vpaddw] = 14; // Packed Add Word -SMPTypeCategory[NN_vpalignr] = 14; // Packed Align Right -SMPTypeCategory[NN_vpand] = 14; // Bitwise Logical And -SMPTypeCategory[NN_vpandn] = 14; // Bitwise Logical And Not -SMPTypeCategory[NN_vpavgb] = 14; // Packed Average (Byte) -SMPTypeCategory[NN_vpavgw] = 14; // Packed Average (Word) -SMPTypeCategory[NN_vpblendd] = 14; // Blend Packed Dwords -SMPTypeCategory[NN_vpblendvb] = 14; // Variable Blend Packed Bytes -SMPTypeCategory[NN_vpblendw] = 14; // Blend Packed Words -SMPTypeCategory[NN_vpbroadcastb] = 14; // Broadcast a Byte Integer -SMPTypeCategory[NN_vpbroadcastd] = 14; // Broadcast a Dword Integer -SMPTypeCategory[NN_vpbroadcastq] = 14; // Broadcast a Qword Integer -SMPTypeCategory[NN_vpbroadcastw] = 14; // Broadcast a Word Integer -SMPTypeCategory[NN_vpclmulqdq] = 14; // Carry-Less Multiplication Quadword -SMPTypeCategory[NN_vpcmpeqb] = 14; // Packed Compare for Equal (Byte) -SMPTypeCategory[NN_vpcmpeqd] = 14; // Packed Compare for Equal (Dword) -SMPTypeCategory[NN_vpcmpeqq] = 14; // Compare Packed Qword Data for Equal -SMPTypeCategory[NN_vpcmpeqw] = 14; // Packed Compare for Equal (Word) -SMPTypeCategory[NN_vpcmpestri] = 14; // Packed Compare Explicit Length Strings, Return Index -SMPTypeCategory[NN_vpcmpestrm] = 14; // Packed Compare Explicit Length Strings, Return Mask -SMPTypeCategory[NN_vpcmpgtb] = 14; // Packed Compare for Greater Than (Byte) -SMPTypeCategory[NN_vpcmpgtd] = 14; // Packed Compare for Greater Than (Dword) -SMPTypeCategory[NN_vpcmpgtq] = 14; // Compare Packed Data for Greater Than -SMPTypeCategory[NN_vpcmpgtw] = 14; // Packed Compare for Greater Than (Word) -SMPTypeCategory[NN_vpcmpistri] = 14; // Packed Compare Implicit Length Strings, Return Index -SMPTypeCategory[NN_vpcmpistrm] = 14; // Packed Compare Implicit Length Strings, Return Mask -SMPTypeCategory[NN_vperm2f128] = 14; // Permute Floating-Point Values -SMPTypeCategory[NN_vperm2i128] = 14; // Permute Integer Values -SMPTypeCategory[NN_vpermd] = 14; // Full Doublewords Element Permutation -SMPTypeCategory[NN_vpermilpd] = 14; // Permute Double-Precision Floating-Point Values -SMPTypeCategory[NN_vpermilps] = 14; // Permute Single-Precision Floating-Point Values -SMPTypeCategory[NN_vpermpd] = 14; // Permute Double-Precision Floating-Point Elements -SMPTypeCategory[NN_vpermps] = 14; // Permute Single-Precision Floating-Point Elements -SMPTypeCategory[NN_vpermq] = 14; // Qwords Element Permutation -SMPTypeCategory[NN_vpextrb] = 14; // Extract Byte -SMPTypeCategory[NN_vpextrd] = 14; // Extract Dword -SMPTypeCategory[NN_vpextrq] = 14; // Extract Qword -SMPTypeCategory[NN_vpextrw] = 14; // Extract Word -SMPTypeCategory[NN_vpgatherdd] = 14; // Gather Packed Dword Values Using Signed Dword Indices -SMPTypeCategory[NN_vpgatherdq] = 14; // Gather Packed Qword Values Using Signed Dword Indices -SMPTypeCategory[NN_vpgatherqd] = 14; // Gather Packed Dword Values Using Signed Qword Indices -SMPTypeCategory[NN_vpgatherqq] = 14; // Gather Packed Qword Values Using Signed Qword Indices -SMPTypeCategory[NN_vphaddd] = 14; // Packed Horizontal Add Doubleword -SMPTypeCategory[NN_vphaddsw] = 14; // Packed Horizontal Add and Saturate -SMPTypeCategory[NN_vphaddw] = 14; // Packed Horizontal Add Word -SMPTypeCategory[NN_vphminposuw] = 14; // Packed Horizontal Word Minimum -SMPTypeCategory[NN_vphsubd] = 14; // Packed Horizontal Subtract Doubleword -SMPTypeCategory[NN_vphsubsw] = 14; // Packed Horizontal Subtract and Saturate -SMPTypeCategory[NN_vphsubw] = 14; // Packed Horizontal Subtract Word -SMPTypeCategory[NN_vpinsrb] = 14; // Insert Byte -SMPTypeCategory[NN_vpinsrd] = 14; // Insert Dword -SMPTypeCategory[NN_vpinsrq] = 14; // Insert Qword -SMPTypeCategory[NN_vpinsrw] = 14; // Insert Word -SMPTypeCategory[NN_vpmaddubsw] = 14; // Multiply and Add Packed Signed and Unsigned Bytes -SMPTypeCategory[NN_vpmaddwd] = 14; // Packed Multiply and Add -SMPTypeCategory[NN_vpmaskmovd] = 15; // Conditionally Store Dword Values Using Mask -SMPTypeCategory[NN_vpmaskmovq] = 15; // Conditionally Store Qword Values Using Mask -SMPTypeCategory[NN_vpmaxsb] = 14; // Maximum of Packed Signed Byte Integers -SMPTypeCategory[NN_vpmaxsd] = 14; // Maximum of Packed Signed Dword Integers -SMPTypeCategory[NN_vpmaxsw] = 14; // Packed Signed Integer Word Maximum -SMPTypeCategory[NN_vpmaxub] = 14; // Packed Unsigned Integer Byte Maximum -SMPTypeCategory[NN_vpmaxud] = 14; // Maximum of Packed Unsigned Dword Integers -SMPTypeCategory[NN_vpmaxuw] = 14; // Maximum of Packed Word Integers -SMPTypeCategory[NN_vpminsb] = 14; // Minimum of Packed Signed Byte Integers -SMPTypeCategory[NN_vpminsd] = 14; // Minimum of Packed Signed Dword Integers -SMPTypeCategory[NN_vpminsw] = 14; // Packed Signed Integer Word Minimum -SMPTypeCategory[NN_vpminub] = 14; // Packed Unsigned Integer Byte Minimum -SMPTypeCategory[NN_vpminud] = 14; // Minimum of Packed Unsigned Dword Integers -SMPTypeCategory[NN_vpminuw] = 14; // Minimum of Packed Word Integers -SMPTypeCategory[NN_vpmovmskb] = 15; // Move Byte Mask to Integer -SMPTypeCategory[NN_vpmovsxbd] = 15; // Packed Move with Sign Extend -SMPTypeCategory[NN_vpmovsxbq] = 15; // Packed Move with Sign Extend -SMPTypeCategory[NN_vpmovsxbw] = 15; // Packed Move with Sign Extend -SMPTypeCategory[NN_vpmovsxdq] = 15; // Packed Move with Sign Extend -SMPTypeCategory[NN_vpmovsxwd] = 15; // Packed Move with Sign Extend -SMPTypeCategory[NN_vpmovsxwq] = 15; // Packed Move with Sign Extend -SMPTypeCategory[NN_vpmovzxbd] = 15; // Packed Move with Zero Extend -SMPTypeCategory[NN_vpmovzxbq] = 15; // Packed Move with Zero Extend -SMPTypeCategory[NN_vpmovzxbw] = 15; // Packed Move with Zero Extend -SMPTypeCategory[NN_vpmovzxdq] = 15; // Packed Move with Zero Extend -SMPTypeCategory[NN_vpmovzxwd] = 15; // Packed Move with Zero Extend -SMPTypeCategory[NN_vpmovzxwq] = 15; // Packed Move with Zero Extend -SMPTypeCategory[NN_vpmuldq] = 14; // Multiply Packed Signed Dword Integers -SMPTypeCategory[NN_vpmulhrsw] = 14; // Packed Multiply High with Round and Scale -SMPTypeCategory[NN_vpmulhuw] = 14; // Packed Multiply High Unsigned -SMPTypeCategory[NN_vpmulhw] = 14; // Packed Multiply High -SMPTypeCategory[NN_vpmulld] = 14; // Multiply Packed Signed Dword Integers and Store Low Result -SMPTypeCategory[NN_vpmullw] = 14; // Packed Multiply Low -SMPTypeCategory[NN_vpmuludq] = 14; // Multiply Packed Unsigned Doubleword Integers -SMPTypeCategory[NN_vpor] = 14; // Bitwise Logical Or -SMPTypeCategory[NN_vpsadbw] = 14; // Packed Sum of Absolute Differences -SMPTypeCategory[NN_vpshufb] = 14; // Packed Shuffle Bytes -SMPTypeCategory[NN_vpshufd] = 14; // Shuffle Packed Doublewords -SMPTypeCategory[NN_vpshufhw] = 14; // Shuffle Packed High Words -SMPTypeCategory[NN_vpshuflw] = 14; // Shuffle Packed Low Words -SMPTypeCategory[NN_vpsignb] = 14; // Packed SIGN Byte -SMPTypeCategory[NN_vpsignd] = 14; // Packed SIGN Doubleword -SMPTypeCategory[NN_vpsignw] = 14; // Packed SIGN Word -SMPTypeCategory[NN_vpslld] = 14; // Packed Shift Left Logical (Dword) -SMPTypeCategory[NN_vpslldq] = 14; // Shift Double Quadword Left Logical -SMPTypeCategory[NN_vpsllq] = 14; // Packed Shift Left Logical (Qword) -SMPTypeCategory[NN_vpsllvd] = 14; // Variable Bit Shift Left Logical (Dword) -SMPTypeCategory[NN_vpsllvq] = 14; // Variable Bit Shift Left Logical (Qword) -SMPTypeCategory[NN_vpsllw] = 14; // Packed Shift Left Logical (Word) -SMPTypeCategory[NN_vpsrad] = 14; // Packed Shift Right Arithmetic (Dword) -SMPTypeCategory[NN_vpsravd] = 14; // Variable Bit Shift Right Arithmetic -SMPTypeCategory[NN_vpsraw] = 14; // Packed Shift Right Arithmetic (Word) -SMPTypeCategory[NN_vpsrld] = 14; // Packed Shift Right Logical (Dword) -SMPTypeCategory[NN_vpsrldq] = 14; // Shift Double Quadword Right Logical (Qword) -SMPTypeCategory[NN_vpsrlq] = 14; // Packed Shift Right Logical (Qword) -SMPTypeCategory[NN_vpsrlvd] = 14; // Variable Bit Shift Right Logical (Dword) -SMPTypeCategory[NN_vpsrlvq] = 14; // Variable Bit Shift Right Logical (Qword) -SMPTypeCategory[NN_vpsrlw] = 14; // Packed Shift Right Logical (Word) -SMPTypeCategory[NN_vpsubb] = 14; // Packed Subtract Byte -SMPTypeCategory[NN_vpsubd] = 14; // Packed Subtract Dword -SMPTypeCategory[NN_vpsubq] = 14; // Subtract Packed Quadword Integers -SMPTypeCategory[NN_vpsubsb] = 14; // Packed Subtract with Saturation (Byte) -SMPTypeCategory[NN_vpsubsw] = 14; // Packed Subtract with Saturation (Word) -SMPTypeCategory[NN_vpsubusb] = 14; // Packed Subtract Unsigned with Saturation (Byte) -SMPTypeCategory[NN_vpsubusw] = 14; // Packed Subtract Unsigned with Saturation (Word) -SMPTypeCategory[NN_vpsubw] = 14; // Packed Subtract Word -SMPTypeCategory[NN_vptest] = 14; // Logical Compare -SMPTypeCategory[NN_vpunpckhbw] = 14; // Unpack High Packed Data (Byte->Word) -SMPTypeCategory[NN_vpunpckhdq] = 14; // Unpack High Packed Data (Dword->Qword) -SMPTypeCategory[NN_vpunpckhqdq] = 14; // Unpack High Packed Data (Qword->Xmmword) -SMPTypeCategory[NN_vpunpckhwd] = 14; // Unpack High Packed Data (Word->Dword) -SMPTypeCategory[NN_vpunpcklbw] = 14; // Unpack Low Packed Data (Byte->Word) -SMPTypeCategory[NN_vpunpckldq] = 14; // Unpack Low Packed Data (Dword->Qword) -SMPTypeCategory[NN_vpunpcklqdq] = 14; // Unpack Low Packed Data (Qword->Xmmword) -SMPTypeCategory[NN_vpunpcklwd] = 14; // Unpack Low Packed Data (Word->Dword) -SMPTypeCategory[NN_vpxor] = 14; // Bitwise Logical Exclusive Or -SMPTypeCategory[NN_vrcpps] = 14; // Packed Single-FP Reciprocal -SMPTypeCategory[NN_vrcpss] = 14; // Scalar Single-FP Reciprocal -SMPTypeCategory[NN_vroundpd] = 14; // Round Packed Double Precision Floating-Point Values -SMPTypeCategory[NN_vroundps] = 14; // Round Packed Single Precision Floating-Point Values -SMPTypeCategory[NN_vroundsd] = 14; // Round Scalar Double Precision Floating-Point Values -SMPTypeCategory[NN_vroundss] = 14; // Round Scalar Single Precision Floating-Point Values -SMPTypeCategory[NN_vrsqrtps] = 14; // Packed Single-FP Square Root Reciprocal -SMPTypeCategory[NN_vrsqrtss] = 14; // Scalar Single-FP Square Root Reciprocal -SMPTypeCategory[NN_vshufpd] = 14; // Shuffle Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vshufps] = 14; // Shuffle Single-FP -SMPTypeCategory[NN_vsqrtpd] = 14; // Compute Square Roots of Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vsqrtps] = 14; // Packed Single-FP Square Root -SMPTypeCategory[NN_vsqrtsd] = 14; // Compute Square Rootof Scalar Double-Precision Floating-Point Value -SMPTypeCategory[NN_vsqrtss] = 14; // Scalar Single-FP Square Root -SMPTypeCategory[NN_vstmxcsr] = 14; // Store Streaming SIMD Extensions Technology Control/Status Register -SMPTypeCategory[NN_vsubpd] = 14; // Subtract Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vsubps] = 14; // Packed Single-FP Subtract -SMPTypeCategory[NN_vsubsd] = 14; // Subtract Scalar Double-Precision Floating-Point Values -SMPTypeCategory[NN_vsubss] = 14; // Scalar Single-FP Subtract -SMPTypeCategory[NN_vtestpd] = 14; // Packed Double-Precision Floating-Point Bit Test -SMPTypeCategory[NN_vtestps] = 14; // Packed Single-Precision Floating-Point Bit Test -SMPTypeCategory[NN_vucomisd] = 14; // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS -SMPTypeCategory[NN_vucomiss] = 14; // Scalar Unordered Single-FP Compare and Set EFLAGS -SMPTypeCategory[NN_vunpckhpd] = 14; // Unpack and Interleave High Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vunpckhps] = 14; // Unpack High Packed Single-FP Data -SMPTypeCategory[NN_vunpcklpd] = 14; // Unpack and Interleave Low Packed Double-Precision Floating-Point Values -SMPTypeCategory[NN_vunpcklps] = 14; // Unpack Low Packed Single-FP Data -SMPTypeCategory[NN_vxorpd] = 14; // Bitwise Logical OR of Double-Precision Floating-Point Values -SMPTypeCategory[NN_vxorps] = 14; // Bitwise Logical XOR for Single-FP Data -SMPTypeCategory[NN_vzeroall] = 14; // Zero All YMM Registers -SMPTypeCategory[NN_vzeroupper] = 14; // Zero Upper Bits of YMM Registers - -// Transactional Synchronization Extensions - -SMPTypeCategory[NN_xabort] = 1; // Transaction Abort -SMPTypeCategory[NN_xbegin] = 1; // Transaction Begin -SMPTypeCategory[NN_xend] = 1; // Transaction End -SMPTypeCategory[NN_xtest] = 1; // Test If In Transactional Execution - -// Virtual PC synthetic instructions - -SMPTypeCategory[NN_vmgetinfo] = 1; // Virtual PC - Get VM Information -SMPTypeCategory[NN_vmsetinfo] = 1; // Virtual PC - Set VM Information -SMPTypeCategory[NN_vmdxdsbl] = 1; // Virtual PC - Disable Direct Execution -SMPTypeCategory[NN_vmdxenbl] = 1; // Virtual PC - Enable Direct Execution -SMPTypeCategory[NN_vmcpuid] = 1; // Virtual PC - Virtualized CPU Information -SMPTypeCategory[NN_vmhlt] = 1; // Virtual PC - Halt -SMPTypeCategory[NN_vmsplaf] = 1; // Virtual PC - Spin Lock Acquisition Failed -SMPTypeCategory[NN_vmpushfd] = 1; // Virtual PC - Push virtualized flags register -SMPTypeCategory[NN_vmpopfd] = 1; // Virtual PC - Pop virtualized flags register -SMPTypeCategory[NN_vmcli] = 1; // Virtual PC - Clear Interrupt Flag -SMPTypeCategory[NN_vmsti] = 1; // Virtual PC - Set Interrupt Flag -SMPTypeCategory[NN_vmiretd] = 1; // Virtual PC - Return From Interrupt -SMPTypeCategory[NN_vmsgdt] = 1; // Virtual PC - Store Global Descriptor Table -SMPTypeCategory[NN_vmsidt] = 1; // Virtual PC - Store Interrupt Descriptor Table -SMPTypeCategory[NN_vmsldt] = 1; // Virtual PC - Store Local Descriptor Table -SMPTypeCategory[NN_vmstr] = 1; // Virtual PC - Store Task Register -SMPTypeCategory[NN_vmsdte] = 1; // Virtual PC - Store to Descriptor Table Entry -SMPTypeCategory[NN_vpcext] = 1; // Virtual PC - ISA extension - -#endif // 599 < IDA_SDK_VERSION - -SMPTypeCategory[NN_last] = 1; - - return; - -} // end InitTypeCategory() diff --git a/src/base/SMPFunction.cpp b/src/base/SMPFunction.cpp index 6d4a8f8a..00c785e2 100644 --- a/src/base/SMPFunction.cpp +++ b/src/base/SMPFunction.cpp @@ -19,7 +19,7 @@ * e-mail: jwd@virginia.com * URL : http://www.cs.virginia.edu/ * - * Additional copyrights 2010, 2011, 2012, 2013, 2014 by Zephyr Software LLC + * Additional copyrights 2010, 2011, 2012, 2013, 2014, 2015 by Zephyr Software LLC * e-mail: {clc,jwd}@zephyr-software.com * URL : http://www.zephyr-software.com/ * @@ -42,26 +42,28 @@ using namespace std; #include <cstring> #include <cstdlib> +#include <cassert> #include <pro.h> -#include <assert.h> -#include <ida.hpp> #include <ua.hpp> +#include <intel.hpp> + +#if 0 +#include <ida.hpp> #include <idp.hpp> #include <auto.hpp> #include <bytes.hpp> #include <funcs.hpp> -#include <intel.hpp> #include <name.hpp> #include <struct.hpp> +#endif -#include "SMPDBInterface.h" -#include "SMPDataFlowAnalysis.h" -#include "SMPStaticAnalyzer.h" -#include "SMPFunction.h" -#include "SMPBasicBlock.h" -#include "SMPInstr.h" -#include "SMPProgram.h" +#include "interfaces/SMPDBInterface.h" +#include "base/SMPDataFlowAnalysis.h" +#include "base/SMPFunction.h" +#include "base/SMPBasicBlock.h" +#include "base/SMPInstr.h" +#include "base/SMPProgram.h" // Set to 1 for debugging output #define SMP_DEBUG 1 @@ -270,7 +272,7 @@ SMPFunction::SMPFunction(STARS_Function_t *Info, SMPProgram* pgm) { struct FineGrainedInfo TempFG; TempFG.SignMiscInfo = 0; TempFG.SizeInfo = 0; - for (int RegIndex = R_ax; RegIndex <= STARS_MD_LAST_SAVED_REG_NUM; ++RegIndex) { + for (int RegIndex = STARS_x86_R_ax; RegIndex <= global_STARS_program->GetSTARS_MD_LAST_SAVED_REG_NUM(); ++RegIndex) { this->SavedRegLoc.push_back(0); // zero offset means reg not saved this->ReturnRegTypes.push_back(UNINIT); this->ReturnRegFGInfo.push_back(TempFG); @@ -302,9 +304,9 @@ STARS_Function_t *SMPFunction::GetFuncInfo(void) const { return myPtr; } -uint16_t SMPFunction::GetJumpToFollowNodeCounter(ea_t InstAddr) const { +uint16_t SMPFunction::GetJumpToFollowNodeCounter(STARS_ea_t InstAddr) const { uint16_t Counter = 0; - map<ea_t, uint16_t>::const_iterator MapIter = this->JumpToFollowNodeCounterMap.find(InstAddr); + map<STARS_ea_t, uint16_t>::const_iterator MapIter = this->JumpToFollowNodeCounterMap.find(InstAddr); if (MapIter != this->JumpToFollowNodeCounterMap.end()) { Counter = MapIter->second; } @@ -393,8 +395,8 @@ unsigned short SMPFunction::GetDefSignMiscInfo(int DefHashValue) { return 0; } // end of SMPFunction::GetDefSignMiscInfo() -unsigned short SMPFunction::GetStackDefSignMiscInfo(ea_t InstAddr) { - map<ea_t, struct FineGrainedInfo>::iterator MapIter; +unsigned short SMPFunction::GetStackDefSignMiscInfo(STARS_ea_t InstAddr) { + map<STARS_ea_t, struct FineGrainedInfo>::iterator MapIter; MapIter = this->StackDefFGInfo.find(InstAddr); assert(MapIter != this->StackDefFGInfo.end()); @@ -412,8 +414,8 @@ unsigned short SMPFunction::GetUseSignMiscInfo(int UseHashValue) { return 0; } // end of SMPFunction::GetUseSignMiscInfo() -unsigned short SMPFunction::GetStackUseSignMiscInfo(ea_t InstAddr) { - map<ea_t, struct FineGrainedInfo>::iterator MapIter; +unsigned short SMPFunction::GetStackUseSignMiscInfo(STARS_ea_t InstAddr) { + map<STARS_ea_t, struct FineGrainedInfo>::iterator MapIter; MapIter = this->StackUseFGInfo.find(InstAddr); assert(MapIter != this->StackUseFGInfo.end()); @@ -470,9 +472,9 @@ struct FineGrainedInfo SMPFunction::GetUseFGInfo(int UseHashValue) { } // end of SMPFunction::GetUseFGInfo() // Fetch SPARK Ada control flow type for jump at InstAddr; return FALL_THROUGH if none found. -ControlFlowType SMPFunction::GetControlFlowType(ea_t InstAddr) { +ControlFlowType SMPFunction::GetControlFlowType(STARS_ea_t InstAddr) { ControlFlowType JumpTypeCode = FALL_THROUGH; - map<ea_t, unsigned short>::iterator MapIter = this->ControlFlowMap.find(InstAddr); + map<STARS_ea_t, unsigned short>::iterator MapIter = this->ControlFlowMap.find(InstAddr); if (MapIter != this->ControlFlowMap.end()) { JumpTypeCode = (ControlFlowType) MapIter->second; } @@ -480,42 +482,42 @@ ControlFlowType SMPFunction::GetControlFlowType(ea_t InstAddr) { } // end of SMPFunction::GetControlFlowType() // Set counter to zero, or insert zero counter if none found -void SMPFunction::ResetJumpToFollowNodeCounter(ea_t InstAddr) { - map<ea_t, uint16_t>::iterator MapIter = this->JumpToFollowNodeCounterMap.find(InstAddr); +void SMPFunction::ResetJumpToFollowNodeCounter(STARS_ea_t InstAddr) { + map<STARS_ea_t, uint16_t>::iterator MapIter = this->JumpToFollowNodeCounterMap.find(InstAddr); if (MapIter != this->JumpToFollowNodeCounterMap.end()) { // found it MapIter->second = 0; } else { - pair<ea_t, uint16_t> CounterItem(InstAddr, 0); - pair<map<ea_t, uint16_t>::iterator, bool> InsertResult = this->JumpToFollowNodeCounterMap.insert(CounterItem); + pair<STARS_ea_t, uint16_t> CounterItem(InstAddr, 0); + pair<map<STARS_ea_t, uint16_t>::iterator, bool> InsertResult = this->JumpToFollowNodeCounterMap.insert(CounterItem); assert(InsertResult.second); } return; } // end of SMPFunction::ResetJumpToFollowNodeCounter() // Increment counter, or insert count of 1 if none found -void SMPFunction::IncrementJumpToFollowNodeCounter(ea_t InstAddr) { - map<ea_t, uint16_t>::iterator MapIter = this->JumpToFollowNodeCounterMap.find(InstAddr); +void SMPFunction::IncrementJumpToFollowNodeCounter(STARS_ea_t InstAddr) { + map<STARS_ea_t, uint16_t>::iterator MapIter = this->JumpToFollowNodeCounterMap.find(InstAddr); if (MapIter != this->JumpToFollowNodeCounterMap.end()) { // found it ++MapIter->second; } else { - pair<ea_t, uint16_t> CounterItem(InstAddr, 1); - pair<map<ea_t, uint16_t>::iterator, bool> InsertResult = this->JumpToFollowNodeCounterMap.insert(CounterItem); + pair<STARS_ea_t, uint16_t> CounterItem(InstAddr, 1); + pair<map<STARS_ea_t, uint16_t>::iterator, bool> InsertResult = this->JumpToFollowNodeCounterMap.insert(CounterItem); assert(InsertResult.second); } return; } // Add a caller to the list of all callers of this function. -void SMPFunction::AddCallSource(ea_t addr) { +void SMPFunction::AddCallSource(STARS_ea_t addr) { // Convert call instruction address to beginning address of the caller. STARS_Function_t *FuncInfo = SMP_get_func(addr); if (NULL == FuncInfo) { SMP_msg("SERIOUS WARNING: Call location %lx not in a function.\n", (unsigned long) addr); return; } - ea_t FirstAddr = FuncInfo->get_startEA(); + STARS_ea_t FirstAddr = FuncInfo->get_startEA(); assert(BADADDR != FirstAddr); this->AllCallSources.insert(FirstAddr); this->AllCallSites.insert(addr); @@ -523,8 +525,8 @@ void SMPFunction::AddCallSource(ea_t addr) { } // end of SMPFunction::AddCallSource() // Add a direct call target; return true if new target, false if target already added -bool SMPFunction::AddDirectCallTarget(ea_t addr) { - pair<set<ea_t>::iterator, bool> InsertResult = this->DirectCallTargets.insert(addr); +bool SMPFunction::AddDirectCallTarget(STARS_ea_t addr) { + pair<set<STARS_ea_t>::iterator, bool> InsertResult = this->DirectCallTargets.insert(addr); if (InsertResult.second) { // new call target this->AllCallTargets.push_back(addr); } @@ -532,8 +534,8 @@ bool SMPFunction::AddDirectCallTarget(ea_t addr) { } // Remove TargetAddr from DirectCallTargets and AllCallTargets. -bool SMPFunction::RemoveDirectCallTarget(ea_t TargetAddr) { - set<ea_t>::iterator TargetIter = this->DirectCallTargets.find(TargetAddr); +bool SMPFunction::RemoveDirectCallTarget(STARS_ea_t TargetAddr) { + set<STARS_ea_t>::iterator TargetIter = this->DirectCallTargets.find(TargetAddr); bool RemovedTarget = false; if (TargetIter != this->DirectCallTargets.end()) { this->DirectCallTargets.erase(TargetIter); @@ -544,8 +546,8 @@ bool SMPFunction::RemoveDirectCallTarget(ea_t TargetAddr) { } // Remove TargetAddr from IndirectCallTargets and AllCallTargets. -bool SMPFunction::RemoveIndirectCallTarget(ea_t TargetAddr) { - set<ea_t>::iterator TargetIter = this->IndirectCallTargets.find(TargetAddr); +bool SMPFunction::RemoveIndirectCallTarget(STARS_ea_t TargetAddr) { + set<STARS_ea_t>::iterator TargetIter = this->IndirectCallTargets.find(TargetAddr); bool RemovedTarget = false; if (TargetIter != this->IndirectCallTargets.end()) { this->IndirectCallTargets.erase(TargetIter); @@ -556,12 +558,12 @@ bool SMPFunction::RemoveIndirectCallTarget(ea_t TargetAddr) { } // add map entry to LeaInstOpMap -void SMPFunction::AddLeaOperand(ea_t addr, STARSOpndTypePtr LeaOperand) { - pair<ea_t, STARSOpndTypePtr> InsertValue(addr, LeaOperand); - pair<map<ea_t, STARSOpndTypePtr>::iterator, bool> InsertResult; +void SMPFunction::AddLeaOperand(STARS_ea_t addr, STARSOpndTypePtr LeaOperand) { + pair<STARS_ea_t, STARSOpndTypePtr> InsertValue(addr, LeaOperand); + pair<map<STARS_ea_t, STARSOpndTypePtr>::iterator, bool> InsertResult; InsertResult = this->LeaInstOpMap.insert(InsertValue); if (!(InsertResult.second)) { // already existed; replace - map<ea_t, STARSOpndTypePtr>::iterator FindIter = this->LeaInstOpMap.find(addr); + map<STARS_ea_t, STARSOpndTypePtr>::iterator FindIter = this->LeaInstOpMap.find(addr); assert(FindIter != this->GetLastLeaOperand()); FindIter->second = LeaOperand; } @@ -569,18 +571,18 @@ void SMPFunction::AddLeaOperand(ea_t addr, STARSOpndTypePtr LeaOperand) { } // Add input arguments to the NormalizedStackOpsMap. -void SMPFunction::AddNormalizedStackOperand(STARSOpndTypePtr OldOp, ea_t InstAddr, STARSOpndTypePtr NormalizedOp) { +void SMPFunction::AddNormalizedStackOperand(STARSOpndTypePtr OldOp, STARS_ea_t InstAddr, STARSOpndTypePtr NormalizedOp) { bool DuplicateCase = false; // e.g. inc [esp+8] will have [esp+8] as a DEF and a USE and maps will see [esp+8] twice bool DebugFlag = (InstAddr == 0x8048463); - pair<map<pair<STARSOpndTypePtr, ea_t>, STARSOpndTypePtr, LessDefinition>::iterator, bool> InsertResult; - pair<map<pair<STARSOpndTypePtr, ea_t>, map<pair<STARSOpndTypePtr, ea_t>, STARSOpndTypePtr, LessDefinition>::iterator, LessDefinition>::iterator, bool> InverseInsertResult; - pair<STARSOpndTypePtr, ea_t> OldValue(OldOp, InstAddr); - pair<STARSOpndTypePtr, ea_t> InverseValue(OldOp, InstAddr); // OldOp was NormalizedOp when it was inserted previously - pair<pair<STARSOpndTypePtr, ea_t>, STARSOpndTypePtr> InsertValue(OldValue, NormalizedOp); - pair<STARSOpndTypePtr, ea_t> InverseInsertValue(NormalizedOp, InstAddr); - map<pair<STARSOpndTypePtr, ea_t>, STARSOpndTypePtr, LessDefinition>::iterator OldIter = this->NormalizedStackOpsMap.begin(); - pair<pair<STARSOpndTypePtr, ea_t>, map<pair<STARSOpndTypePtr, ea_t>, STARSOpndTypePtr, LessDefinition>::iterator> InverseInsertTriple(InverseInsertValue, OldIter); - map<pair<STARSOpndTypePtr, ea_t>, map<pair<STARSOpndTypePtr, ea_t>, STARSOpndTypePtr, LessDefinition>::iterator>::iterator InverseIter; + pair<map<pair<STARSOpndTypePtr, STARS_ea_t>, STARSOpndTypePtr, LessDefinition>::iterator, bool> InsertResult; + pair<map<pair<STARSOpndTypePtr, STARS_ea_t>, map<pair<STARSOpndTypePtr, STARS_ea_t>, STARSOpndTypePtr, LessDefinition>::iterator, LessDefinition>::iterator, bool> InverseInsertResult; + pair<STARSOpndTypePtr, STARS_ea_t> OldValue(OldOp, InstAddr); + pair<STARSOpndTypePtr, STARS_ea_t> InverseValue(OldOp, InstAddr); // OldOp was NormalizedOp when it was inserted previously + pair<pair<STARSOpndTypePtr, STARS_ea_t>, STARSOpndTypePtr> InsertValue(OldValue, NormalizedOp); + pair<STARSOpndTypePtr, STARS_ea_t> InverseInsertValue(NormalizedOp, InstAddr); + map<pair<STARSOpndTypePtr, STARS_ea_t>, STARSOpndTypePtr, LessDefinition>::iterator OldIter = this->NormalizedStackOpsMap.begin(); + pair<pair<STARSOpndTypePtr, STARS_ea_t>, map<pair<STARSOpndTypePtr, STARS_ea_t>, STARSOpndTypePtr, LessDefinition>::iterator> InverseInsertTriple(InverseInsertValue, OldIter); + map<pair<STARSOpndTypePtr, STARS_ea_t>, map<pair<STARSOpndTypePtr, STARS_ea_t>, STARSOpndTypePtr, LessDefinition>::iterator>::iterator InverseIter; // If this function calls alloca(), stack operands could be normalized more than once. // Before we proceed, we update an old entry instead of inserting a new entry. @@ -614,13 +616,13 @@ void SMPFunction::AddNormalizedStackOperand(STARSOpndTypePtr OldOp, ea_t InstAdd // fourth call to this method, we will not find a reverse mapping B->A any more, so the if-clause // does not execute. We can only detect this case by finding an existing C->A reverse mapping // and an existing A->C mapping to confirm our inference. - pair<STARSOpndTypePtr, ea_t> TestInverseValue(NormalizedOp, InstAddr); + pair<STARSOpndTypePtr, STARS_ea_t> TestInverseValue(NormalizedOp, InstAddr); InverseIter = this->InverseNormalizedStackOpsMap.find(TestInverseValue); if (InverseIter != this->InverseNormalizedStackOpsMap.end()) { // Found existing C->A inverse mapping. Is there an A->C mapping to confirm // our interpretation of the situation? - pair<STARSOpndTypePtr, ea_t> TestOldValue(InverseIter->second->first.first, InstAddr); - map<pair<STARSOpndTypePtr, ea_t>, STARSOpndTypePtr, LessDefinition>::iterator TestOldIter; + pair<STARSOpndTypePtr, STARS_ea_t> TestOldValue(InverseIter->second->first.first, InstAddr); + map<pair<STARSOpndTypePtr, STARS_ea_t>, STARSOpndTypePtr, LessDefinition>::iterator TestOldIter; TestOldIter = this->NormalizedStackOpsMap.find(TestOldValue); if (TestOldIter != this->NormalizedStackOpsMap.end()) { // We found a mapping from <A, InstAddr>. @@ -653,11 +655,11 @@ void SMPFunction::AddNormalizedStackOperand(STARSOpndTypePtr OldOp, ea_t InstAdd assert(InverseInsertResult.second || DuplicateCase); } if (DebugFlag) { - map<pair<STARSOpndTypePtr, ea_t>, STARSOpndTypePtr, LessDefinition>::iterator StackMapIter; + map<pair<STARSOpndTypePtr, STARS_ea_t>, STARSOpndTypePtr, LessDefinition>::iterator StackMapIter; SMP_msg("DEBUG: NormalizedStackOpsMap size: %zd\n", this->NormalizedStackOpsMap.size()); for (StackMapIter = this->NormalizedStackOpsMap.begin(); StackMapIter != this->NormalizedStackOpsMap.end(); ++ StackMapIter) { STARSOpndTypePtr OldOp = StackMapIter->first.first; - ea_t InstAddr = StackMapIter->first.second; + STARS_ea_t InstAddr = StackMapIter->first.second; SMP_msg("DEBUG: NormalizedStackOps: "); PrintOperand(OldOp); SMP_msg(" addr: %lx\n", (unsigned long) InstAddr); @@ -676,11 +678,11 @@ void SMPFunction::UpdateMaxDirectStackAccessOffset(sval_t NewOffset) { // insert jump type into ControlFlowMap -void SMPFunction::SetControlFlowType(ea_t InstAddr, ControlFlowType JumpTypeCode) { - map<ea_t, unsigned short>::iterator MapIter = this->ControlFlowMap.find(InstAddr); +void SMPFunction::SetControlFlowType(STARS_ea_t InstAddr, ControlFlowType JumpTypeCode) { + map<STARS_ea_t, unsigned short>::iterator MapIter = this->ControlFlowMap.find(InstAddr); if (MapIter == this->ControlFlowMap.end()) { // no old entry; insert - pair<ea_t, unsigned short> InsertPair(InstAddr, (unsigned short) JumpTypeCode); - pair<map<ea_t, unsigned short>::iterator, bool> InsertResult = this->ControlFlowMap.insert(InsertPair); + pair<STARS_ea_t, unsigned short> InsertPair(InstAddr, (unsigned short) JumpTypeCode); + pair<map<STARS_ea_t, unsigned short>::iterator, bool> InsertResult = this->ControlFlowMap.insert(InsertPair); assert(InsertResult.second); MapIter = InsertResult.first; } @@ -708,15 +710,15 @@ map<int, struct STARS_SCCP_Const_Struct>::iterator SMPFunction::InsertGlobalCons // Return RTLop if not stack opnd; return normalized RTLop otherwise. -STARSOpndTypePtr SMPFunction::GetNormalizedOperand(ea_t InstAddr, STARSOpndTypePtr RTLop) { +STARSOpndTypePtr SMPFunction::GetNormalizedOperand(STARS_ea_t InstAddr, STARSOpndTypePtr RTLop) { STARSOpndTypePtr NormOp = nullptr; bool DebugFlag = (0x8048463 == InstAddr); if (DebugFlag) { - map<pair<STARSOpndTypePtr, ea_t>, STARSOpndTypePtr, LessDefinition>::iterator StackMapIter; + map<pair<STARSOpndTypePtr, STARS_ea_t>, STARSOpndTypePtr, LessDefinition>::iterator StackMapIter; SMP_msg("DEBUG: NormalizedStackOpsMap size: %zd\n", this->NormalizedStackOpsMap.size()); for (StackMapIter = this->NormalizedStackOpsMap.begin(); StackMapIter != this->NormalizedStackOpsMap.end(); ++ StackMapIter) { STARSOpndTypePtr OldOp = StackMapIter->first.first; - ea_t InstAddr = StackMapIter->first.second; + STARS_ea_t InstAddr = StackMapIter->first.second; SMP_msg("DEBUG: NormalizedStackOps: "); PrintOperand(OldOp); SMP_msg(" addr: %lx\n", (unsigned long) InstAddr); @@ -725,8 +727,8 @@ STARSOpndTypePtr SMPFunction::GetNormalizedOperand(ea_t InstAddr, STARSOpndTypeP PrintOperand(RTLop); } if (MDIsStackAccessOpnd(RTLop, this->UsesFramePointer())) { - pair<STARSOpndTypePtr, ea_t> OldDefn(RTLop, InstAddr); - map<pair<STARSOpndTypePtr, ea_t>, STARSOpndTypePtr, LessDefinition>::iterator FindIter = this->NormalizedStackOpsMap.find(OldDefn); + pair<STARSOpndTypePtr, STARS_ea_t> OldDefn(RTLop, InstAddr); + map<pair<STARSOpndTypePtr, STARS_ea_t>, STARSOpndTypePtr, LessDefinition>::iterator FindIter = this->NormalizedStackOpsMap.find(OldDefn); assert(this->NormalizedStackOpsMap.end() != FindIter); NormOp = FindIter->second; } @@ -768,8 +770,8 @@ void SMPFunction::UpdateDefSignMiscInfo(int DefHashValue, unsigned short NewInfo return; } // end of SMPFunction::UpdateDefSignMiscInfo() -void SMPFunction::UpdateStackDefSignMiscInfo(ea_t InstAddr, unsigned short NewInfo) { - map<ea_t, struct FineGrainedInfo>::iterator MapIter; +void SMPFunction::UpdateStackDefSignMiscInfo(STARS_ea_t InstAddr, unsigned short NewInfo) { + map<STARS_ea_t, struct FineGrainedInfo>::iterator MapIter; MapIter = this->StackDefFGInfo.find(InstAddr); assert(MapIter != this->StackDefFGInfo.end()); @@ -800,8 +802,8 @@ void SMPFunction::UpdateUseSignMiscInfo(int UseHashValue, unsigned short NewInfo return; } // end of SMPFunction::UpdateUseSignMiscInfo() -void SMPFunction::UpdateStackUseSignMiscInfo(ea_t InstAddr, unsigned short NewInfo) { - map<ea_t, struct FineGrainedInfo>::iterator MapIter; +void SMPFunction::UpdateStackUseSignMiscInfo(STARS_ea_t InstAddr, unsigned short NewInfo) { + map<STARS_ea_t, struct FineGrainedInfo>::iterator MapIter; MapIter = this->StackUseFGInfo.find(InstAddr); assert(MapIter != this->StackUseFGInfo.end()); @@ -904,10 +906,10 @@ void SMPFunction::ClearDefSignedness(int DefHashValue) { // Erase a range of instructions from the Instrs list, usually corresponding // the the range of a basic block. -void SMPFunction::EraseInstRange(ea_t FirstAddr, ea_t LastAddr) { +void SMPFunction::EraseInstRange(STARS_ea_t FirstAddr, STARS_ea_t LastAddr) { list<SMPInstr *>::iterator InstIter = this->Instrs.begin(); SMPInstr *CurrInst; - ea_t InstAddr; + STARS_ea_t InstAddr; while (InstIter != this->Instrs.end()) { CurrInst = (*InstIter); @@ -923,16 +925,16 @@ void SMPFunction::EraseInstRange(ea_t FirstAddr, ea_t LastAddr) { // For instruction address UseAddr, compute the reaching defs for operand TempOp, // placing them into the TempReachingDefs list. -void SMPFunction::ComputeTempReachingDefs(STARSOpndTypePtr TempOp, ea_t UseAddr) { +void SMPFunction::ComputeTempReachingDefs(STARSOpndTypePtr TempOp, STARS_ea_t UseAddr) { this->TempReachingDefs.clear(); SMPBasicBlock *CurrBlock = this->GetBlockFromInstAddr(UseAddr); assert(NULL != CurrBlock); - set<pair<STARSOpndTypePtr, ea_t>, LessDefinition>::iterator ReachesInIter; - pair<set<ea_t, LessAddr>::iterator, bool> InsertResult; + set<pair<STARSOpndTypePtr, STARS_ea_t>, LessDefinition>::iterator ReachesInIter; + pair<set<STARS_ea_t, LessAddr>::iterator, bool> InsertResult; // Start with the matching members of the ReachesIn set for the current basic block. for (ReachesInIter = CurrBlock->GetFirstReachesIn(); ReachesInIter != CurrBlock->GetLastReachesIn(); ++ReachesInIter) { - pair<STARSOpndTypePtr, ea_t> ReachesInDef = *ReachesInIter; + pair<STARSOpndTypePtr, STARS_ea_t> ReachesInDef = *ReachesInIter; if (IsEqOp(TempOp, ReachesInDef.first)) { InsertResult = this->TempReachingDefs.insert(ReachesInDef.second); assert(InsertResult.second); @@ -943,7 +945,7 @@ void SMPFunction::ComputeTempReachingDefs(STARSOpndTypePtr TempOp, ea_t UseAddr) vector<SMPInstr *>::iterator InstIter; for (InstIter = CurrBlock->GetFirstInst(); InstIter != CurrBlock->GetLastInst(); ++InstIter) { SMPInstr *CurrInst = *InstIter; - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); if (CurrInst->IsMarkerInst()) continue; if (InstAddr >= UseAddr) @@ -963,12 +965,12 @@ void SMPFunction::ComputeTempReachingDefs(STARSOpndTypePtr TempOp, ea_t UseAddr) // Put the entries matching TempOp into TempStackDeltaReachesList. void SMPFunction::ComputeTempStackDeltaReachesList(STARSOpndTypePtr TempOp) { bool FoundOperand = false; - set<pair<STARSOpndTypePtr, pair<ea_t, sval_t> >, LessStackDeltaCopy>::iterator CopyIter; + set<pair<STARSOpndTypePtr, pair<STARS_ea_t, sval_t> >, LessStackDeltaCopy>::iterator CopyIter; this->TempStackDeltaReachesList.clear(); for (CopyIter = this->StackPtrCopySet.begin(); CopyIter != this->StackPtrCopySet.end(); ++CopyIter) { - pair<STARSOpndTypePtr, pair<ea_t, sval_t> > CopyEntry = *CopyIter; + pair<STARSOpndTypePtr, pair<STARS_ea_t, sval_t> > CopyEntry = *CopyIter; if (IsEqOp(TempOp, CopyEntry.first)) { - set<ea_t, LessAddr>::iterator FindReachDefIter; + set<STARS_ea_t, LessAddr>::iterator FindReachDefIter; FoundOperand = true; // help us save time later by exiting loop // Match address at which stack ptr copy was made to a reaching def address for TempOp. FindReachDefIter = this->TempReachingDefs.find(CopyEntry.second.first); @@ -1000,7 +1002,7 @@ bool SMPFunction::FindReachingStackDelta(sval_t &StackDelta) { StackDelta = this->TempStackDeltaReachesList.front().second; } - list<pair<ea_t, sval_t> >::iterator DeltaIter; + list<pair<STARS_ea_t, sval_t> >::iterator DeltaIter; for (DeltaIter = this->TempStackDeltaReachesList.begin(); DeltaIter != this->TempStackDeltaReachesList.end(); ++DeltaIter) { sval_t NewDelta = DeltaIter->second; if (NewDelta != StackDelta) { @@ -1015,7 +1017,7 @@ bool SMPFunction::FindReachingStackDelta(sval_t &StackDelta) { // Find any apparent stack adjustment after the call instruction at CallAddr, // confining our search to the basic block containing CallAddr. -sval_t SMPFunction::GetStackAdjustmentForCallee(ea_t CallAddr) { +sval_t SMPFunction::GetStackAdjustmentForCallee(STARS_ea_t CallAddr) { sval_t CalleeAdjustment = 0; SMPBasicBlock *CallBlock = this->GetBlockFromInstAddr(CallAddr); @@ -1037,7 +1039,7 @@ sval_t SMPFunction::GetStackAdjustmentForCallee(ea_t CallAddr) { // detect a stack adjustment after the call instruction, from which we could infer // the stack delta of the callee. We choose the latter approach, and find the smallest // adjustment among all call sites for the callee. -sval_t SMPFunction::GetStackDeltaForCallee(ea_t CallTargetAddr) { +sval_t SMPFunction::GetStackDeltaForCallee(STARS_ea_t CallTargetAddr) { sval_t CalleeDelta = CALLING_CONVENTION_DEFAULT_FUNCTION_STACK_DELTA; SMPFunction *CalleeFunc = this->GetProg()->FindFunction(CallTargetAddr); @@ -1068,12 +1070,12 @@ sval_t SMPFunction::ComputeGlobalStackAdjustment(void) { } if (1 < NumCallSites) { // if only one call site, it is dangerous to draw conclusions about seeming "adjustments." - set<ea_t>::iterator CallSiteIter; + set<STARS_ea_t>::iterator CallSiteIter; for (CallSiteIter = this->AllCallSites.begin(); CallSiteIter != this->AllCallSites.end(); ++CallSiteIter) { - ea_t CallSiteAddr = (*CallSiteIter); + STARS_ea_t CallSiteAddr = (*CallSiteIter); STARS_Function_t *CurrFunc = SMP_get_func(CallSiteAddr); assert(NULL != CurrFunc); - ea_t CallerFirstAddr = CurrFunc->get_startEA(); + STARS_ea_t CallerFirstAddr = CurrFunc->get_startEA(); SMPFunction *CallerFunc = this->GetProg()->FindFunction(CallerFirstAddr); assert(NULL != CallerFunc); sval_t CurrentAdjustment = CallerFunc->GetStackAdjustmentForCallee(CallSiteAddr); @@ -1371,7 +1373,7 @@ bool SMPFunction::AnalyzeStackPointerDeltas(void) { if (CurrInst->IsMarkerInst()) { continue; // skip marker instruction } - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); if (InstAddr == this->GetFirstFrameAllocInstAddr()) { // Record the reset point for frame deallocations this->PreAllocStackDelta = IncomingDelta; @@ -1641,12 +1643,12 @@ bool SMPFunction::AnalyzeStackPointerDeltas(void) { // Insert the arguments into the StackPtrCopySet; or, if a matching entry already exists // with a StackDelta of greater magnitude than StackDelta, update just the StackDelta. // Return true if StackDelta was inserted, false if it was used to update an old entry. -bool SMPFunction::AddToStackPtrCopySet(STARSOpndTypePtr CopyOp, ea_t InstAddr, sval_t StackDelta) { +bool SMPFunction::AddToStackPtrCopySet(STARSOpndTypePtr CopyOp, STARS_ea_t InstAddr, sval_t StackDelta) { bool NewInsertion; - pair<ea_t, sval_t> InsertStackDefn(InstAddr, StackDelta); - pair<STARSOpndTypePtr, pair<ea_t, sval_t> > InsertStackDefnOp(CopyOp, InsertStackDefn); - set<pair<STARSOpndTypePtr, pair<ea_t, sval_t> >, LessStackDeltaCopy>::iterator FindIter; - pair<set<pair<STARSOpndTypePtr, pair<ea_t, sval_t> >, LessStackDeltaCopy>::iterator, bool> InsertResult; + pair<STARS_ea_t, sval_t> InsertStackDefn(InstAddr, StackDelta); + pair<STARSOpndTypePtr, pair<STARS_ea_t, sval_t> > InsertStackDefnOp(CopyOp, InsertStackDefn); + set<pair<STARSOpndTypePtr, pair<STARS_ea_t, sval_t> >, LessStackDeltaCopy>::iterator FindIter; + pair<set<pair<STARSOpndTypePtr, pair<STARS_ea_t, sval_t> >, LessStackDeltaCopy>::iterator, bool> InsertResult; FindIter = this->StackPtrCopySet.find(InsertStackDefnOp); if (FindIter == this->StackPtrCopySet.end()) { @@ -1658,7 +1660,7 @@ bool SMPFunction::AddToStackPtrCopySet(STARSOpndTypePtr CopyOp, ea_t InstAddr, s else { // Already there; see if delta needs to be updated. NewInsertion = false; - pair<STARSOpndTypePtr, pair<ea_t, sval_t> > OldStackDefnOp(*FindIter); + pair<STARSOpndTypePtr, pair<STARS_ea_t, sval_t> > OldStackDefnOp(*FindIter); // Favor a smaller stack frame for the alloca-calling functions, e.g. favor -24 over -32 as a delta. if (StackDelta > OldStackDefnOp.second.second) { // Replace the old entry with a new one. @@ -1763,7 +1765,7 @@ void SMPFunction::FindAllAllocsAndDeallocs(void) { #endif for ( ; InstIter != this->Instrs.end(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); - ea_t addr = CurrInst->GetAddr(); + STARS_ea_t addr = CurrInst->GetAddr(); // Keep the most recent instruction in the DeallocInstr // in case we reach the return without seeing a dealloc. @@ -1857,15 +1859,15 @@ void SMPFunction::FindAllAllocsAndDeallocs(void) { // THE ASSUMPTION THAT WE HAVE ONLY PUSH INSTRUCTIONS BEFORE // THE ALLOCATING INSTR IS ONLY TRUE WHEN LOCALVARSSIZE == 0; else { - ea_t SaveAddr = this->FuncInfo->get_startEA(); + STARS_ea_t SaveAddr = this->FuncInfo->get_startEA(); list<SMPInstr *>::iterator InstIter = this->Instrs.begin(); #if SMP_USE_SSA_FNOP_MARKER ++InstIter; // skip marker instruction #endif for ( ; InstIter != this->Instrs.end(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); - ea_t addr = CurrInst->GetAddr(); - if (CurrInst->GetIDAOpcode() == NN_push) + STARS_ea_t addr = CurrInst->GetAddr(); + if (CurrInst->GetIDAOpcode() == STARS_NN_push) SaveAddr = addr; else break; @@ -2184,7 +2186,7 @@ bool SMPFunction::MDFixFrameInfo(void) { // that IDA is expecting for the local vars region. // If so, we return the address of the instruction at which ESP reaches its value, else // we return BADADDR. -ea_t SMPFunction::FindAllocPoint(STARS_asize_t OriginalLocSize) { +STARS_ea_t SMPFunction::FindAllocPoint(STARS_asize_t OriginalLocSize) { sval_t TargetSize = - ((sval_t) OriginalLocSize); // negate; stack grows down #if SMP_DEBUG_FRAMEFIXUP @@ -2201,7 +2203,7 @@ ea_t SMPFunction::FindAllocPoint(STARS_asize_t OriginalLocSize) { #endif for ( ; InstIter != this->Instrs.end(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); - ea_t addr = CurrInst->GetAddr(); + STARS_ea_t addr = CurrInst->GetAddr(); // get_spd() returns a cumulative delta of ESP sval_t sp_delta = SMP_get_spd(this->GetFuncInfo(), addr); #if SMP_DEBUG_FRAMEFIXUP @@ -2214,7 +2216,7 @@ ea_t SMPFunction::FindAllocPoint(STARS_asize_t OriginalLocSize) { return BADADDR; // cannot back up from first instruction } else { - ea_t PrevAddr = (*(--InstIter))->GetAddr(); + STARS_ea_t PrevAddr = (*(--InstIter))->GetAddr(); #if SMP_USE_SSA_FNOP_MARKER if ((*(this->Instrs.begin()))->GetAddr() == PrevAddr) return BADADDR; // don't return marker instruction @@ -2285,7 +2287,7 @@ bool SMPFunction::MDFixUseFP(void) { bool OldUseFP = this->UsesFramePointer(); bool HasLocals = (0 < this->LocalVarsSize); list<SMPInstr *>::iterator InstIter = this->Instrs.begin(); - ea_t addr; + STARS_ea_t addr; #if SMP_USE_SSA_FNOP_MARKER ++InstIter; // skip marker instruction @@ -2311,7 +2313,7 @@ bool SMPFunction::MDFixUseFP(void) { } } else if (!ESPintoEBP) { // found "push ebp", looking for "mov ebp,esp" - if ((CurrInst->GetIDAOpcode() == NN_mov) + if ((CurrInst->GetIDAOpcode() == STARS_NN_mov) && (CurrInst->GetFirstDef()->GetOp()->MatchesReg(MD_FRAME_POINTER_REG)) && (CurrInst->GetFirstUse()->GetOp()->MatchesReg(MD_STACK_POINTER_REG))) { ESPintoEBP = true; @@ -2377,11 +2379,11 @@ void SMPFunction::MDFindSavedRegs(void) { continue; sval_t CurrOffset = SMP_get_spd(CurrFunc, CurrInst->GetAddr()); - if (CurrInst->GetIDAOpcode() == NN_push) { + if (CurrInst->GetIDAOpcode() == STARS_NN_push) { STARSOpndTypePtr PushedReg = CurrInst->GetPushedOpnd(); if (PushedReg->IsRegOp()) { RegIndex = (int) PushedReg->GetReg(); - if (RegIndex > STARS_MD_LAST_SAVED_REG_NUM) { + if (RegIndex > global_STARS_program->GetSTARS_MD_LAST_SAVED_REG_NUM()) { SMP_msg("WARNING: Skipping save of register %d\n", RegIndex); continue; } @@ -2393,20 +2395,20 @@ void SMPFunction::MDFindSavedRegs(void) { } } // end if register push operand } // end if PUSH instruction - else if (NN_pusha == CurrInst->GetIDAOpcode()) { + else if (STARS_NN_pusha == CurrInst->GetIDAOpcode()) { // **!!** Handle pushes of all regs. - this->SavedRegLoc[(std::size_t) R_ax] = CurrOffset - 4; - this->SavedRegLoc[(std::size_t) R_cx] = CurrOffset - 8; - this->SavedRegLoc[(std::size_t) R_dx] = CurrOffset - 12; - this->SavedRegLoc[(std::size_t) R_bx] = CurrOffset - 16; - this->SavedRegLoc[(std::size_t) R_sp] = CurrOffset - 20; - this->SavedRegLoc[(std::size_t) R_bp] = CurrOffset - 24; - this->SavedRegLoc[(std::size_t) R_si] = CurrOffset - 28; - this->SavedRegLoc[(std::size_t) R_di] = CurrOffset - 32; + this->SavedRegLoc[(std::size_t) STARS_x86_R_ax] = CurrOffset - 4; + this->SavedRegLoc[(std::size_t) STARS_x86_R_cx] = CurrOffset - 8; + this->SavedRegLoc[(std::size_t) STARS_x86_R_dx] = CurrOffset - 12; + this->SavedRegLoc[(std::size_t) STARS_x86_R_bx] = CurrOffset - 16; + this->SavedRegLoc[(std::size_t) STARS_x86_R_sp] = CurrOffset - 20; + this->SavedRegLoc[(std::size_t) STARS_x86_R_bp] = CurrOffset - 24; + this->SavedRegLoc[(std::size_t) STARS_x86_R_si] = CurrOffset - 28; + this->SavedRegLoc[(std::size_t) STARS_x86_R_di] = CurrOffset - 32; break; // all regs accounted for } else if (CurrInst->MDIsEnterInstr()) { - this->SavedRegLoc[(std::size_t) R_bp] = CurrOffset - 4; + this->SavedRegLoc[(std::size_t) STARS_x86_R_bp] = CurrOffset - 4; } } // end for all instructions @@ -2434,7 +2436,7 @@ bool SMPFunction::MDFindReturnTypes(void) { set<DefOrUse, LessDefUse>::iterator CurrUse; for (CurrUse = CurrInst->GetFirstUse(); CurrUse != CurrInst->GetLastUse(); ++CurrUse) { STARSOpndTypePtr UseOp = CurrUse->GetOp(); - if ((! UseOp->IsRegOp()) || (STARS_MD_LAST_SAVED_REG_NUM < UseOp->GetReg())) + if ((! UseOp->IsRegOp()) || (global_STARS_program->GetSTARS_MD_LAST_SAVED_REG_NUM() < UseOp->GetReg())) continue; SMPOperandType OldType = this->ReturnRegTypes.at(UseOp->GetReg()); SMPOperandType NewType = SMPTypeMeet(OldType, CurrUse->GetType()); @@ -2466,12 +2468,12 @@ void SMPFunction::MDFindIncomingTypes(void) { // For each register USE in the marker inst at the top of the function, // see if we have a consistent type inference at all call sites (i.e. // the USEs of the call instructions that call this function). - set<ea_t>::iterator CallSiteIter; + set<STARS_ea_t>::iterator CallSiteIter; for (CallSiteIter = this->AllCallSites.begin(); CallSiteIter != this->AllCallSites.end(); ++CallSiteIter) { - ea_t CallSiteAddr = (*CallSiteIter); + STARS_ea_t CallSiteAddr = (*CallSiteIter); STARS_Function_t *CurrFunc = SMP_get_func(CallSiteAddr); assert(NULL != CurrFunc); - ea_t CallerFirstAddr = CurrFunc->get_startEA(); + STARS_ea_t CallerFirstAddr = CurrFunc->get_startEA(); SMPFunction *CallerFunc = this->GetProg()->FindFunction(CallerFirstAddr); assert(NULL != CallerFunc); SMPInstr *CallSiteInst = CallerFunc->GetInstFromAddr(CallSiteAddr); @@ -2615,7 +2617,7 @@ void SMPFunction::SemiNaiveLocalVarID(void) { #endif for ( ; InstIter != this->Instrs.end(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); - ea_t addr = CurrInst->GetAddr(); + STARS_ea_t addr = CurrInst->GetAddr(); sval_t sp_delta = CurrInst->GetStackPtrOffset(); if (sp_delta < this->MinStackDelta) this->MinStackDelta = sp_delta; @@ -2641,7 +2643,7 @@ void SMPFunction::SemiNaiveLocalVarID(void) { #endif for ( ; InstIter != this->Instrs.end(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); - ea_t addr = CurrInst->GetAddr(); + STARS_ea_t addr = CurrInst->GetAddr(); // Find the min and max stack offsets in DEFs and USEs. STARSOpndTypePtr TempOp; if (CurrInst->HasDestMemoryOperand() || CurrInst->MDIsPushInstr() || CurrInst->MDIsEnterInstr()) { @@ -2807,7 +2809,7 @@ void SMPFunction::SemiNaiveLocalVarID(void) { // Update MinStackAccessOffset and MaxStackAccessLimit if TempOp is stack access void SMPFunction::UpdateMinMaxStackOffsets(SMPInstr *CurrInst, STARSOpndTypePtr TempOp) { - ea_t offset; + STARS_ea_t offset; std::size_t DataSize; bool UsedFramePointer; bool IndexedAccess; @@ -2911,7 +2913,7 @@ bool SMPFunction::AuditLocalVarTable(void) { struct LocalVar TempLocal; char TempStr[20]; TempLocal.offset = this->LocalVarOffsetLimit; - TempLocal.size = STARS_ISA_Bytewidth; + TempLocal.size = global_STARS_program->GetSTARS_ISA_Bytewidth(); if ((TempLocal.size + TempLocal.offset) > ((long) this->MaxStackAccessLimit)) { TempLocal.size = ((long) this->MaxStackAccessLimit) - TempLocal.offset; } @@ -3038,7 +3040,7 @@ void SMPFunction::FindOutgoingArgsSize(void) { #endif for ( ; InstIter != this->Instrs.end(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); sval_t sp_delta = CurrInst->GetStackPtrOffset(); if (0 < sp_delta) { // Stack underflow. @@ -3049,7 +3051,7 @@ void SMPFunction::FindOutgoingArgsSize(void) { return; } assert(0 >= sp_delta); - ea_t offset; + STARS_ea_t offset; std::size_t DataSize; bool UsedFramePointer; bool IndexedAccess; @@ -3117,8 +3119,8 @@ void SMPFunction::FindOutgoingArgsSize(void) { StackDefFG.SignMiscInfo |= FG_MASK_UNSIGNED; } // Insert the StackDefFG into the map of InstAddr to DEF FG info. - pair<map<ea_t, struct FineGrainedInfo>::iterator, bool> InsertResult; - pair<ea_t, struct FineGrainedInfo> InsertValue(InstAddr, StackDefFG); + pair<map<STARS_ea_t, struct FineGrainedInfo>::iterator, bool> InsertResult; + pair<STARS_ea_t, struct FineGrainedInfo> InsertValue(InstAddr, StackDefFG); InsertResult = this->StackDefFGInfo.insert(InsertValue); assert(InsertResult.second); } // end if MDGetStackOffsetAndSize() @@ -3184,8 +3186,8 @@ void SMPFunction::FindOutgoingArgsSize(void) { StackUseFG.SignMiscInfo |= FG_MASK_UNSIGNED; } // Insert the StackUseFG into the map of InstAddr to USE FG info. - pair<map<ea_t, struct FineGrainedInfo>::iterator, bool> InsertResult; - pair<ea_t, struct FineGrainedInfo> InsertValue(InstAddr, StackUseFG); + pair<map<STARS_ea_t, struct FineGrainedInfo>::iterator, bool> InsertResult; + pair<STARS_ea_t, struct FineGrainedInfo> InsertValue(InstAddr, StackUseFG); InsertResult = this->StackUseFGInfo.insert(InsertValue); assert(InsertResult.second); } // end if MDGetStackOffsetAndSize() @@ -3320,14 +3322,14 @@ void SMPFunction::FindOutgoingArgsSize(void) { // BaseValue is either this->MinStackAccessOffset, or this->MinStackDelta (when this->MinStackAccessOffset is still // being computed). // Return true if a stack memory access was found in TempOp, false otherwise. -bool SMPFunction::MDGetStackOffsetAndSize(SMPInstr *Instr, STARSOpndTypePtr TempOp, sval_t BaseValue, ea_t &offset, std::size_t &DataSize, bool &FP, +bool SMPFunction::MDGetStackOffsetAndSize(SMPInstr *Instr, STARSOpndTypePtr TempOp, sval_t BaseValue, STARS_ea_t &offset, std::size_t &DataSize, bool &FP, bool &Indexed, bool &Signed, bool &Unsigned) { int BaseReg; int IndexReg; uint16_t ScaleFactor; int SignedOffset; sval_t sp_delta = Instr->GetStackPtrOffset(); - ea_t InstAddr = Instr->GetAddr(); // helps debugging + STARS_ea_t InstAddr = Instr->GetAddr(); // helps debugging assert((TempOp->IsMemNoDisplacementOp()) || (TempOp->IsMemDisplacementOp())); MDExtractAddressFields(TempOp, BaseReg, IndexReg, ScaleFactor, offset); @@ -3338,20 +3340,20 @@ bool SMPFunction::MDGetStackOffsetAndSize(SMPInstr *Instr, STARSOpndTypePtr Temp SignedOffset = (int) offset; // avoid sign errors during adjustment arithmetic - if ((BaseReg == R_sp) || (IndexReg == R_sp)) { + if ((BaseReg == STARS_x86_R_sp) || (IndexReg == STARS_x86_R_sp)) { // ESP-relative constant offset if (!Instr->AreDefsNormalized()) { SignedOffset += sp_delta; // base offsets from entry ESP value } SignedOffset -= BaseValue; // convert to StackFrameMap index - offset = (ea_t) SignedOffset; // write back to outgoing argument + offset = (STARS_ea_t) SignedOffset; // write back to outgoing argument // Get size of data written DataSize = GetOpDataSize(TempOp); FP = false; - Indexed = ((BaseReg != R_none) && (IndexReg != R_none)); // two regs used + Indexed = ((BaseReg != STARS_x86_R_none) && (IndexReg != STARS_x86_R_none)); // two regs used unsigned short opcode = Instr->GetIDAOpcode(); - Unsigned = (opcode == NN_movzx); - Signed = (opcode == NN_movsx); + Unsigned = (opcode == STARS_NN_movzx); + Signed = (opcode == STARS_NN_movsx); if ((0 > SignedOffset) && (!Indexed) && (BaseValue == this->MinStackAccessOffset)) { // Consider asserting here. SMP_msg("ERROR: Negative offset in MDGetStackOffsetAndSize for inst dump: \n"); @@ -3362,10 +3364,10 @@ bool SMPFunction::MDGetStackOffsetAndSize(SMPInstr *Instr, STARSOpndTypePtr Temp else if (this->UseFP && ((BaseReg == MD_FRAME_POINTER_REG) || (IndexReg == MD_FRAME_POINTER_REG))) { SignedOffset -= this->FuncInfo->GetSavedRegSize(); // base offsets from entry ESP value SignedOffset -= BaseValue; // convert to StackFrameMap index - offset = (ea_t) SignedOffset; + offset = (STARS_ea_t) SignedOffset; DataSize = GetOpDataSize(TempOp); FP = true; - Indexed = ((BaseReg != R_none) && (IndexReg != R_none)); // two regs used + Indexed = ((BaseReg != STARS_x86_R_none) && (IndexReg != STARS_x86_R_none)); // two regs used #if 0 assert(Indexed || (!this->StackPtrAnalysisSucceeded()) || !this->HasSTARSStackPtrAnalysisCompleted()); // Else we should never get here with unnormalized stack operands #else @@ -3375,8 +3377,8 @@ bool SMPFunction::MDGetStackOffsetAndSize(SMPInstr *Instr, STARSOpndTypePtr Temp } #endif unsigned short opcode = Instr->GetIDAOpcode(); - Unsigned = (opcode == NN_movzx); - Signed = (opcode == NN_movsx); + Unsigned = (opcode == STARS_NN_movzx); + Signed = (opcode == STARS_NN_movsx); if ((0 > SignedOffset) && (!Indexed) && (BaseValue == this->MinStackAccessOffset)) { // Consider asserting here. SMP_msg("ERROR: Negative offset %d in MDGetStackOffsetAndSize: frregs: %d MinStackDelta: %ld Inst dump: \n", @@ -3391,11 +3393,11 @@ bool SMPFunction::MDGetStackOffsetAndSize(SMPInstr *Instr, STARSOpndTypePtr Temp } // end of SMPFunction::MDGetStackOffsetAndSize() // Return fine grained stack entry for stack op TempOp from instruction at InstAddr -bool SMPFunction::MDGetFGStackLocInfo(ea_t InstAddr, STARSOpndTypePtr TempOp, struct FineGrainedInfo &FGEntry) { +bool SMPFunction::MDGetFGStackLocInfo(STARS_ea_t InstAddr, STARSOpndTypePtr TempOp, struct FineGrainedInfo &FGEntry) { int BaseReg; int IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; int SignedOffset; assert((TempOp->IsMemNoDisplacementOp()) || (TempOp->IsMemDisplacementOp())); @@ -3435,11 +3437,11 @@ bool SMPFunction::MDGetFGStackLocInfo(ea_t InstAddr, STARSOpndTypePtr TempOp, st } // end of SMPFunction::MDGetFGStackLocInfo() // Return true if we update fine grained stack entry for stack op TempOp from instruction at InstAddr -bool SMPFunction::MDUpdateFGStackLocInfo(ea_t InstAddr, STARSOpndTypePtr TempOp, struct FineGrainedInfo NewFG) { +bool SMPFunction::MDUpdateFGStackLocInfo(STARS_ea_t InstAddr, STARSOpndTypePtr TempOp, struct FineGrainedInfo NewFG) { int BaseReg; int IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; int SignedOffset; struct FineGrainedInfo OldFG, UnionFG; @@ -3493,16 +3495,16 @@ bool SMPFunction::MDUpdateFGStackLocInfo(ea_t InstAddr, STARSOpndTypePtr TempOp, } // end of SMPFunction::MDUpdateFGStackLocInfo() // retrieve DEF addr from GlobalDefAddrBySSA or return BADADDR -ea_t SMPFunction::GetGlobalDefAddr(STARSOpndTypePtr DefOp, int SSANum) { - map<int, ea_t>::iterator MapResult; - ea_t DefAddr = BADADDR; // BADADDR means we did not find it +STARS_ea_t SMPFunction::GetGlobalDefAddr(STARSOpndTypePtr DefOp, int SSANum) { + map<int, STARS_ea_t>::iterator MapResult; + STARS_ea_t DefAddr = BADADDR; // BADADDR means we did not find it bool RegDef = (DefOp->IsRegOp()); if (RegDef) { int HashedName = HashGlobalNameAndSSA(DefOp, SSANum); MapResult = this->GlobalDefAddrBySSA.find(HashedName); if (MapResult != this->GlobalDefAddrBySSA.end()) { // Found it. - DefAddr = (ea_t) MapResult->second; + DefAddr = (STARS_ea_t) MapResult->second; } } else if (MDIsStackAccessOpnd(DefOp, this->UsesFramePointer())) { @@ -3557,8 +3559,8 @@ int SMPFunction::GetBlockNumForPhiDef(STARSOpndTypePtr DefOp, int SSANum) { } // end of SMPFunction::GetBlockNumForPhiDef() // Retrieve block iterator for InstAddr from InstBlockMap; assert if failure -SMPBasicBlock *SMPFunction::GetBlockFromInstAddr(ea_t InstAddr) { - map<ea_t, SMPBasicBlock *>::iterator MapEntry; +SMPBasicBlock *SMPFunction::GetBlockFromInstAddr(STARS_ea_t InstAddr) { + map<STARS_ea_t, SMPBasicBlock *>::iterator MapEntry; MapEntry = this->InstBlockMap.find(InstAddr); assert(MapEntry != this->InstBlockMap.end()); return MapEntry->second; @@ -3576,7 +3578,7 @@ list<SMPBasicBlock *>::iterator SMPFunction::GetBlockIter(SMPBasicBlock *FindBlo } // Retrieve inst pointer for InstAddr; assert if failure on block find. -SMPInstr *SMPFunction::GetInstFromAddr(ea_t InstAddr) { +SMPInstr *SMPFunction::GetInstFromAddr(STARS_ea_t InstAddr) { SMPBasicBlock *CurrBlock = this->GetBlockFromInstAddr(InstAddr); SMPInstr *CurrInst = CurrBlock->FindInstr(InstAddr); return CurrInst; @@ -3609,16 +3611,16 @@ bool SMPFunction::IsInOutgoingArgsRegion(STARSOpndTypePtr DestOp) { bool OutArgWrite = false; int BaseReg, IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; if (this->IsLeaf()) return false; MDExtractAddressFields(DestOp, BaseReg, IndexReg, ScaleFactor, offset); - if ((BaseReg != R_sp) && (IndexReg != R_sp)) + if ((BaseReg != STARS_x86_R_sp) && (IndexReg != STARS_x86_R_sp)) return false; - if (((BaseReg == R_sp) && (IndexReg != R_none)) - || ((IndexReg == R_sp) && (BaseReg != R_none)) + if (((BaseReg == STARS_x86_R_sp) && (IndexReg != STARS_x86_R_none)) + || ((IndexReg == STARS_x86_R_sp) && (BaseReg != STARS_x86_R_none)) || (0 < ScaleFactor)) { #if 0 @@ -3644,12 +3646,12 @@ bool SMPFunction::IsInIncomingArgsRegion(SMPInstr *SourceInst, STARSOpndTypePtr bool InArg = MDIsStackAccessOpnd(SourceOp, false) && SourceInst->AreDefsNormalized(); int BaseReg, IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; if (InArg) { MDExtractAddressFields(SourceOp, BaseReg, IndexReg, ScaleFactor, offset); int SignedOffset = (int) offset; - if (((BaseReg != R_sp) && (IndexReg != R_sp)) || (SignedOffset < 4)) { + if (((BaseReg != STARS_x86_R_sp) && (IndexReg != STARS_x86_R_sp)) || (SignedOffset < 4)) { InArg = false; } } @@ -3658,11 +3660,11 @@ bool SMPFunction::IsInIncomingArgsRegion(SMPInstr *SourceInst, STARSOpndTypePtr } // end of SMPFunction::IsInIncomingArgsRegion() // Is DestOp a direct memory access above the local vars frame? -bool SMPFunction::WritesAboveLocalFrame(STARSOpndTypePtr DestOp, bool OpNormalized, ea_t InstAddr) { +bool SMPFunction::WritesAboveLocalFrame(STARSOpndTypePtr DestOp, bool OpNormalized, STARS_ea_t InstAddr) { bool InArgWrite = false; int BaseReg, IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; long SignedOffset; MDExtractAddressFields(DestOp, BaseReg, IndexReg, ScaleFactor, offset); @@ -3672,7 +3674,7 @@ bool SMPFunction::WritesAboveLocalFrame(STARSOpndTypePtr DestOp, bool OpNormaliz assert(!EBPrelative || !OpNormalized); // stack operands should be normalized by now if (!(ESPrelative || EBPrelative)) return false; - if (((IndexReg != R_none) && (BaseReg != R_none)) + if (((IndexReg != STARS_x86_R_none) && (BaseReg != STARS_x86_R_none)) || (0 < ScaleFactor)) { SMP_msg("WARNING: WritesAboveLocalFrame called with indexed write."); @@ -3698,11 +3700,11 @@ bool SMPFunction::WritesAboveLocalFrame(STARSOpndTypePtr DestOp, bool OpNormaliz }// end of SMPFunction::WritesAboveLocalFrame() // Is StackOp direct stack access to caller's frame? -bool SMPFunction::AccessAboveLocalFrame(STARSOpndTypePtr StackOp, bool OpNormalized, ea_t InstAddr, bool WriteAccess){ +bool SMPFunction::AccessAboveLocalFrame(STARSOpndTypePtr StackOp, bool OpNormalized, STARS_ea_t InstAddr, bool WriteAccess){ bool InArgAccess = false; int BaseReg, IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; long SignedOffset; MDExtractAddressFields(StackOp, BaseReg, IndexReg, ScaleFactor, offset); @@ -3712,7 +3714,7 @@ bool SMPFunction::AccessAboveLocalFrame(STARSOpndTypePtr StackOp, bool OpNormali assert(!EBPrelative || !OpNormalized); // stack operands should be normalized by now if (!(ESPrelative || EBPrelative)) return false; - if (((IndexReg != R_none) && (BaseReg != R_none)) + if (((IndexReg != STARS_x86_R_none) && (BaseReg != STARS_x86_R_none)) || (0 < ScaleFactor)) { SMP_msg("WARNING: AccessAboveLocalFrame called with indexed operand."); @@ -3750,7 +3752,7 @@ bool SMPFunction::IndexedWritesAboveLocalFrame(STARSOpndTypePtr DestOp) { bool InArgWrite = false; int BaseReg, IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; int SignedOffset; MDExtractAddressFields(DestOp, BaseReg, IndexReg, ScaleFactor, offset); @@ -3775,9 +3777,9 @@ bool SMPFunction::IsInStackPtrCopySet(STARSOpndTypePtr CurrOp) { bool found = false; // Set is composed of triples, so we have to iterate through it and compare operands. - set<pair<STARSOpndTypePtr, pair<ea_t, sval_t> >, LessStackDeltaCopy>::iterator CopyIter; + set<pair<STARSOpndTypePtr, pair<STARS_ea_t, sval_t> >, LessStackDeltaCopy>::iterator CopyIter; for (CopyIter = this->StackPtrCopySet.begin(); CopyIter != this->StackPtrCopySet.end(); ++CopyIter) { - pair<STARSOpndTypePtr, pair<ea_t, sval_t> > CurrCopy = *CopyIter; + pair<STARSOpndTypePtr, pair<STARS_ea_t, sval_t> > CurrCopy = *CopyIter; STARSOpndTypePtr CopyOp = CurrCopy.first; if (IsEqOp(CopyOp, CurrOp)) { // Found it. @@ -3801,7 +3803,7 @@ bool SMPFunction::FindAlloca(void) { bool FoundAlloca = false; list<SMPInstr *>::iterator InstIter = this->Instrs.begin(); SMPInstr *CurrInst; - ea_t InstAddr; + STARS_ea_t InstAddr; #if SMP_USE_SSA_FNOP_MARKER ++InstIter; // skip marker instruction #endif @@ -3825,7 +3827,7 @@ bool SMPFunction::FindAlloca(void) { // Emit the annotations describing the regions of the stack frame. void SMPFunction::EmitStackFrameAnnotations(FILE *AnnotFile, SMPInstr *Instr) { - ea_t addr = Instr->GetAddr(); + STARS_ea_t addr = Instr->GetAddr(); #if 0 if (0 < IncomingArgsSize) { @@ -3844,7 +3846,8 @@ void SMPFunction::EmitStackFrameAnnotations(FILE *AnnotFile, SMPInstr *Instr) { (unsigned long) addr, this->CalleeSavedRegsSize, (unsigned long) this->LocalVarsSize); } if ((0 < this->LocalVarsSize) && this->GoodLocalVarTable) { - unsigned long ParentReferentID = DataReferentID++; + unsigned long ParentReferentID = global_STARS_program->GetDataReferentID(); + global_STARS_program->IncrementDataReferentID(); SMP_fprintf(AnnotFile, "%10lx %6lu DATAREF STACK %lu esp + %d PARENT LocalFrame LOCALFRAME\n", (unsigned long) addr, (unsigned long) this->LocalVarsSize, ParentReferentID, 0); #if SMP_COMPUTE_STACK_GRANULARITY @@ -3852,8 +3855,8 @@ void SMPFunction::EmitStackFrameAnnotations(FILE *AnnotFile, SMPInstr *Instr) { // We can only fine-grain the stack frame if we were able to analyze the stack if (this->OutgoingArgsSize > 0) { SMP_fprintf(AnnotFile, "%10lx %6zu DATAREF STACK %lu esp + %d CHILDOF %lu OFFSET %d OutArgsRegion OUTARGS\n", - (unsigned long) addr, this->OutgoingArgsSize, DataReferentID, 0, ParentReferentID, 0); - ++DataReferentID; + (unsigned long) addr, this->OutgoingArgsSize, global_STARS_program->GetDataReferentID(), 0, ParentReferentID, 0); + global_STARS_program->IncrementDataReferentID(); } #if SMP_DEBUG_STACK_GRANULARITY SMP_msg("LocalVarTable of size %d for function %s\n", this->LocalVarTable.size(), @@ -3870,10 +3873,10 @@ void SMPFunction::EmitStackFrameAnnotations(FILE *AnnotFile, SMPInstr *Instr) { || (this->LocalVarTable[i].offset < (long) this->OutgoingArgsSize)) continue; SMP_fprintf(AnnotFile, "%10lx %6zu DATAREF STACK %lu esp + %ld CHILDOF %lu OFFSET %ld LOCALVAR %s \n", - (unsigned long) addr, this->LocalVarTable[i].size, DataReferentID, + (unsigned long) addr, this->LocalVarTable[i].size, global_STARS_program->GetDataReferentID(), this->LocalVarTable[i].offset, ParentReferentID, this->LocalVarTable[i].offset, this->LocalVarTable[i].VarName); - ++DataReferentID; + global_STARS_program->IncrementDataReferentID(); } } // end if (this->AnalyzedSP and not Alloca .... ) #endif @@ -3896,14 +3899,14 @@ void SMPFunction::MDAuditJumpXrefs(void) { // Rebuild AllCallTargets as the union of the direct and indirect call targets. void SMPFunction::RebuildCallTargets(void) { - set<ea_t>::iterator TargetIter; + set<STARS_ea_t>::iterator TargetIter; this->AllCallTargets.clear(); for (TargetIter = this->DirectCallTargets.begin(); TargetIter != this->DirectCallTargets.end(); ++TargetIter) { - ea_t TargetAddr = (*TargetIter); + STARS_ea_t TargetAddr = (*TargetIter); this->AllCallTargets.push_back(TargetAddr); } for (TargetIter = this->IndirectCallTargets.begin(); TargetIter != this->IndirectCallTargets.end(); ++TargetIter) { - ea_t TargetAddr = (*TargetIter); + STARS_ea_t TargetAddr = (*TargetIter); this->AllCallTargets.push_back(TargetAddr); } return; @@ -3913,8 +3916,8 @@ void SMPFunction::RebuildCallTargets(void) { // fills all objects for instructions, basic blocks, and the function // itself. void SMPFunction::AnalyzeFunc(void) { - set<ea_t> FragmentWorkList; // Distant code fragments that belong to this function and need processing - ea_t InstAddr; // grab address to help in debugging, conditional breakpoints, etc. + set<STARS_ea_t> FragmentWorkList; // Distant code fragments that belong to this function and need processing + STARS_ea_t InstAddr; // grab address to help in debugging, conditional breakpoints, etc. #if SMP_DEBUG_CONTROLFLOW SMP_msg("Entering SMPFunction::Analyze.\n"); @@ -3973,7 +3976,7 @@ void SMPFunction::AnalyzeFunc(void) { SMPitype InstDataFlowType = CurrInst->GetDataFlowType(); if ((CALL == InstDataFlowType) || (INDIR_CALL == InstDataFlowType)) { CurrBlock->SetHasCallInst(); - ea_t CallTarget = CurrInst->GetCallTarget(); + STARS_ea_t CallTarget = CurrInst->GetCallTarget(); if (0 == CallTarget) { // Some libc functions have a call to a debug function that is set to a "call 0" // when the library is not compiled with debug options. The basic block is @@ -4043,7 +4046,7 @@ void SMPFunction::AdvancedAnalysis(void) { } for ( ; InstIter != this->Instrs.end(); ++InstIter) { CurrInst = (*InstIter); - ea_t InstAddr = CurrInst->GetAddr(); // for debugging breakpoints + STARS_ea_t InstAddr = CurrInst->GetAddr(); // for debugging breakpoints if (CurrInst->HasGoodRTL()) CurrInst->SyncAllRTs(this->UsesFramePointer(), this->GetFramePtrStackDelta()); @@ -4064,8 +4067,8 @@ void SMPFunction::AdvancedAnalysis(void) { // for functions with scattered chunks. if ((!this->AllCallTargets.empty()) || this->UnresolvedIndirectCalls) { bool FoundInternalCallTarget = false; - vector<ea_t>::iterator CurrTarget = this->AllCallTargets.begin(); - set<ea_t>::iterator CurrDirectTarget, CurrIndirectTarget; + vector<STARS_ea_t>::iterator CurrTarget = this->AllCallTargets.begin(); + set<STARS_ea_t>::iterator CurrDirectTarget, CurrIndirectTarget; while (CurrTarget != this->AllCallTargets.end()) { if ((this->GetFirstFuncAddr() <= *CurrTarget) && (this->FuncInfo->get_endEA() >= *CurrTarget)) { // Found a call target that is within the function. @@ -4085,10 +4088,10 @@ void SMPFunction::AdvancedAnalysis(void) { // Audit direct call targets. CurrDirectTarget = this->DirectCallTargets.begin(); - set<ea_t>::iterator CopyOfIterator; + set<STARS_ea_t>::iterator CopyOfIterator; bool CallTargetRemoved = false; while (CurrDirectTarget != this->DirectCallTargets.end()) { - ea_t TargetAddr = (*CurrDirectTarget); + STARS_ea_t TargetAddr = (*CurrDirectTarget); if ((this->GetFirstFuncAddr() <= TargetAddr) && (this->FuncInfo->get_endEA() >= TargetAddr)) { // Found a call target that is within the function. CopyOfIterator = CurrDirectTarget; @@ -4104,7 +4107,7 @@ void SMPFunction::AdvancedAnalysis(void) { // Audit indirect call targets. CurrIndirectTarget = this->IndirectCallTargets.begin(); while (CurrIndirectTarget != this->IndirectCallTargets.end()) { - ea_t TargetAddr = (*CurrIndirectTarget); + STARS_ea_t TargetAddr = (*CurrIndirectTarget); if ((this->GetFirstFuncAddr() <= TargetAddr) && (this->FuncInfo->get_endEA() >= TargetAddr)) { // Found a call target that is within the function. CopyOfIterator = CurrIndirectTarget; @@ -4199,11 +4202,11 @@ std::size_t SMPFunction::UnprocessedCalleesCount(void) { return UnprocessedTargetsCount; } // end of SMPFunction::UnprocessedCalleesCount() -ea_t SMPFunction::GetFirstUnprocessedCallee(void) { - ea_t CalleeAddr = BADADDR; +STARS_ea_t SMPFunction::GetFirstUnprocessedCallee(void) { + STARS_ea_t CalleeAddr = BADADDR; std::size_t TargetIndex; for (TargetIndex = 0; TargetIndex < this->AllCallTargets.size(); ++TargetIndex) { - ea_t TargetAddr = this->AllCallTargets.at(TargetIndex); + STARS_ea_t TargetAddr = this->AllCallTargets.at(TargetIndex); SMPFunction *CurrTarget = this->GetProg()->FindFunction(TargetAddr); if ((NULL != CurrTarget) && (!(CurrTarget->IsFuncProcessed()))) { CalleeAddr = TargetAddr; @@ -4219,7 +4222,7 @@ ea_t SMPFunction::GetFirstUnprocessedCallee(void) { // code fragments that are not really functions (i.e. don't have a stack frame, jump straight back // into our function after executing a few instructions, not a chunk shared among other functions). // These code fragments are found in the locking and unlocking code of the gcc stdlib, for example. -bool SMPFunction::FindDistantCodeFragment(ea_t TargetAddr) { +bool SMPFunction::FindDistantCodeFragment(STARS_ea_t TargetAddr) { return GetFuncInfo()->FindDistantCodeFragment(this,TargetAddr); } // end of SMPFunction::FindDistantCodeFragment() @@ -4236,7 +4239,7 @@ void SMPFunction::FreeUnusedMemory2(void) { if (0 < UnusedElements) { UnusedIntCount += (unsigned long) UnusedElements; #if SMP_SHRINK_TO_FIT - std::vector<ea_t>(this->DirectCallTargets).swap(this->DirectCallTargets); + std::vector<STARS_ea_t>(this->DirectCallTargets).swap(this->DirectCallTargets); #else this->DirectCallTargets.resize(CurrSize); #endif @@ -4247,7 +4250,7 @@ void SMPFunction::FreeUnusedMemory2(void) { if (0 < UnusedElements) { UnusedIntCount += (unsigned long) UnusedElements; #if SMP_SHRINK_TO_FIT - std::vector<ea_t>(this->IndirectCallTargets).swap(this->IndirectCallTargets); + std::vector<STARS_ea_t>(this->IndirectCallTargets).swap(this->IndirectCallTargets); #else this->IndirectCallTargets.resize(CurrSize); #endif @@ -4259,7 +4262,7 @@ void SMPFunction::FreeUnusedMemory2(void) { if (0 < UnusedElements) { UnusedIntCount += (unsigned long) UnusedElements; #if SMP_SHRINK_TO_FIT - std::vector<ea_t>(this->AllCallTargets).swap(this->AllCallTargets); + std::vector<STARS_ea_t>(this->AllCallTargets).swap(this->AllCallTargets); #else this->AllCallTargets.resize(CurrSize); #endif @@ -4406,7 +4409,7 @@ void SMPFunction::AnalyzeMetadataLiveness(void) { int BaseReg; int IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; list<SMPInstr *>::iterator InstIter; list<SMPInstr *>::reverse_iterator RevInstIter; set<DefOrUse, LessDefUse>::iterator CurrDef; @@ -4431,7 +4434,7 @@ void SMPFunction::AnalyzeMetadataLiveness(void) { } for (RevInstIter = this->Instrs.rbegin(); RevInstIter != this->Instrs.rend(); ++RevInstIter) { SMPInstr *CurrInst = (*RevInstIter); - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); SafeMemDest = false; // true for some SafeFunc instructions #if 0 // Skip the SSA marker instruction. @@ -4447,10 +4450,8 @@ void SMPFunction::AnalyzeMetadataLiveness(void) { if (DEF_METADATA_UNANALYZED == CurrDef->GetMetadataStatus()) { STARSOpndTypePtr DefOp = CurrDef->GetOp(); // Handle special registers never used as address regs. - if (DefOp->MatchesReg(X86_FLAGS_REG) - || ((o_trreg <= DefOp->GetOpType()) && (o_ymmreg >= DefOp->GetOpType()))) { - CurrDef = CurrInst->SetDefMetadata(DefOp, - DEF_METADATA_UNUSED); + if (DefOp->MatchesReg(X86_FLAGS_REG) || DefOp->MDIsSpecialRegOpType()) { + CurrDef = CurrInst->SetDefMetadata(DefOp, DEF_METADATA_UNUSED); changed = true; } else if (MDIsStackOrFramePointerReg(DefOp, UseFP)) { @@ -4479,7 +4480,7 @@ void SMPFunction::AnalyzeMetadataLiveness(void) { changed = true; MDExtractAddressFields(DefOp, BaseReg, IndexReg, ScaleFactor, offset); - if (R_none != BaseReg) { + if (STARS_x86_R_none != BaseReg) { STARSOpndTypePtr BaseOp = CurrInst->MakeRegOpnd(MDCanonicalizeSubReg((uint16_t) BaseReg)); if (MDIsStackOrFramePointerReg(BaseOp, UseFP)) { ; // do nothing; DEF handled by case above @@ -4501,8 +4502,8 @@ void SMPFunction::AnalyzeMetadataLiveness(void) { DEF_METADATA_USED, CurrUse->GetSSANum(), InstAddr); } } - } // end if R_none != BaseReg - if (R_none != IndexReg) { + } // end if STARS_x86_R_none != BaseReg + if (STARS_x86_R_none != IndexReg) { STARSOpndTypePtr IndexOp = CurrInst->MakeRegOpnd(MDCanonicalizeSubReg((uint16_t) IndexReg)); if (MDIsStackOrFramePointerReg(IndexOp, UseFP)) { ; // do nothing; DEF handled by case above @@ -4528,7 +4529,7 @@ void SMPFunction::AnalyzeMetadataLiveness(void) { DEF_METADATA_USED, CurrUse->GetSSANum(), InstAddr); } } - } // end if R_none != IndexReg + } // end if STARS_x86_R_none != IndexReg } // end if X86_FLAGS_REG .. else if stack ptr ... } // end if unanalyzed metadata usage ++CurrDef; @@ -4617,7 +4618,7 @@ void SMPFunction::AnalyzeMetadataLiveness(void) { // be marked as DEF_METADATA_UNUSED. for (InstIter = this->Instrs.begin(); InstIter != this->Instrs.end(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); #if 0 // important to know if incoming values are dead metadata if (CurrInst->IsMarkerInst()) continue; @@ -4646,7 +4647,7 @@ void SMPFunction::AnalyzeMetadataLiveness(void) { // Propagate the metadata Status for UseOp/SSANum to its global DEF. // Return true if successful. -bool SMPFunction::PropagateGlobalMetadata(STARSOpndTypePtr UseOp, SMPMetadataType Status, int SSANum, ea_t UseAddr) { +bool SMPFunction::PropagateGlobalMetadata(STARSOpndTypePtr UseOp, SMPMetadataType Status, int SSANum, STARS_ea_t UseAddr) { bool changed = false; bool UseFP = this->UsesFramePointer(); @@ -4654,7 +4655,7 @@ bool SMPFunction::PropagateGlobalMetadata(STARSOpndTypePtr UseOp, SMPMetadataTyp return false; // Find the DEF of UseOp with SSANum. - ea_t DefAddr; + STARS_ea_t DefAddr; SMPBasicBlock *UseBlock; SMPBasicBlock *DefBlock; @@ -4673,7 +4674,7 @@ bool SMPFunction::PropagateGlobalMetadata(STARSOpndTypePtr UseOp, SMPMetadataTyp if (!STARS_IsBlockNumPseudoID(DefAddr)) { // found a DEF inst. SMPInstr *CurrInst = this->GetInstFromAddr(DefAddr); - ea_t InstAddr = DefAddr; + STARS_ea_t InstAddr = DefAddr; DefBlock = this->GetBlockFromInstAddr(DefAddr); set<DefOrUse, LessDefUse>::iterator CurrDef; set<DefOrUse, LessDefUse>::iterator CurrUse; @@ -4725,9 +4726,9 @@ bool SMPFunction::PropagateGlobalMetadata(STARSOpndTypePtr UseOp, SMPMetadataTyp PropThroughUses = false; // load address regs are not live metadata } else if ((5 == CurrInst->GetOptType()) - || (NN_and == CurrInst->GetIDAOpcode()) - || (NN_or == CurrInst->GetIDAOpcode()) - || (NN_xor == CurrInst->GetIDAOpcode())) { + || (STARS_NN_and == CurrInst->GetIDAOpcode()) + || (STARS_NN_or == CurrInst->GetIDAOpcode()) + || (STARS_NN_xor == CurrInst->GetIDAOpcode())) { // add, subtract, and, or with memsrc // Find the DEF reg in the USE list. CurrUse = CurrInst->FindUse(UseOp); @@ -5009,7 +5010,7 @@ void SMPFunction::SparseConditionalConstantPropagation(void) { CurrBlock->SetUnreachableBlock(true); FoundUnreachableBlock = true; #if STARS_DEBUG_SCCP - ea_t BlockAddr = CurrBlock->GetFirstAddr(); + STARS_ea_t BlockAddr = CurrBlock->GetFirstAddr(); SMP_msg("INFO: SCCP found unreachable block at %lx\n", (unsigned long) BlockAddr); #endif this->GetProg()->AddBlockToRemovalList(CurrBlock); @@ -5485,7 +5486,7 @@ void SMPFunction::AliasAnalysis(void) { list<SMPInstr *>::iterator InstIter; for (InstIter = this->Instrs.begin(); InstIter != this->Instrs.end(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); if (CurrInst->HasDestMemoryOperand()) { // Starting with the DEF instruction, traverse the control flow // until we run into (A) the re-definition of the operand, including @@ -5532,7 +5533,7 @@ bool SMPFunction::FindPossibleChainAlias(SMPInstr *CurrInst, STARSOpndTypePtr De return false; // block already processed // Proceed by cases: - ea_t DefAddr = CurrInst->GetAddr(); + STARS_ea_t DefAddr = CurrInst->GetAddr(); vector<SMPInstr *>::iterator InstIter = CurrBlock->GetInstIterFromAddr(DefAddr); bool IndWriteFound, ReDef; ++InstIter; @@ -5688,7 +5689,7 @@ bool SMPFunction::FindChainAliasHelper(list<SMPBasicBlock *>::iterator BlockIter void SMPFunction::RemoveBlock(SMPBasicBlock *CurrBlock, list<SMPBasicBlock *>::iterator &BlockIter) { // Remove this block from the predecessors list of its successors. list<SMPBasicBlock *>::iterator SuccIter; - ea_t TempAddr = CurrBlock->GetFirstAddr(); + STARS_ea_t TempAddr = CurrBlock->GetFirstAddr(); for (SuccIter = CurrBlock->GetFirstSucc(); SuccIter != CurrBlock->GetLastSucc(); ++SuccIter) { (*SuccIter)->ErasePred(TempAddr); } @@ -5703,10 +5704,10 @@ void SMPFunction::RemoveBlock(SMPBasicBlock *CurrBlock, list<SMPBasicBlock *>::i this->GetProg()->AddUnreachableBlock(CurrBlock); // Remove the unreachable instructions from the function inst list. vector<SMPInstr *>::iterator InstIter = CurrBlock->GetFirstInst(); - ea_t FirstBadAddr = (*InstIter)->GetAddr(); + STARS_ea_t FirstBadAddr = (*InstIter)->GetAddr(); InstIter = CurrBlock->GetLastInst(); --InstIter; // get last real instruction - ea_t LastBadAddr = (*InstIter)->GetAddr(); + STARS_ea_t LastBadAddr = (*InstIter)->GetAddr(); this->EraseInstRange(FirstBadAddr, LastBadAddr); // Remove the block from the blocks list. @@ -5717,9 +5718,9 @@ void SMPFunction::RemoveBlock(SMPBasicBlock *CurrBlock, list<SMPBasicBlock *>::i // Func is empty, so add all blocks that call it to Program->BlocksPendingRemoval. void SMPFunction::RemoveCallingBlocks(void) const { - for (set<ea_t>::iterator CallSiteIter = this->AllCallSites.begin(); CallSiteIter != this->AllCallSites.end(); ++CallSiteIter) { - ea_t CallInstAddr = (*CallSiteIter); - ea_t CallingFuncAddr = BADADDR; + for (set<STARS_ea_t>::iterator CallSiteIter = this->AllCallSites.begin(); CallSiteIter != this->AllCallSites.end(); ++CallSiteIter) { + STARS_ea_t CallInstAddr = (*CallSiteIter); + STARS_ea_t CallingFuncAddr = BADADDR; if (this->GetProg()->IsInstAddrStillInFunction(CallInstAddr, CallingFuncAddr)) { SMPFunction *CallingFunc = this->GetProg()->FindFunction(CallingFuncAddr); if (NULL == CallingFunc) { @@ -5742,7 +5743,7 @@ void SMPFunction::SetLinks(void) { list<SMPBasicBlock *>::iterator BlockIter; SMPBasicBlock *CurrBlock; list<SMPBasicBlock *> UnresolvedBranchWorkList; - ea_t InstAddr; + STARS_ea_t InstAddr; #if SMP_DEBUG_DATAFLOW_VERBOSE SMP_msg("SetLinks called for %s\n", this->GetFuncName()); #endif @@ -5752,7 +5753,7 @@ void SMPFunction::SetLinks(void) { vector<SMPInstr *>::iterator InstIter; for (InstIter = CurrBlock->GetFirstInst(); InstIter != CurrBlock->GetLastInst(); ++InstIter) { InstAddr = (*InstIter)->GetAddr(); - pair<ea_t, SMPBasicBlock *> MapItem(InstAddr, CurrBlock); + pair<STARS_ea_t, SMPBasicBlock *> MapItem(InstAddr, CurrBlock); InstBlockMap.insert(MapItem); } } @@ -5796,7 +5797,7 @@ void SMPFunction::SetLinks(void) { for (bool ok = CurrXrefs.SMP_first_from(CurrInst->GetAddr(), XREF_ALL); ok; ok = CurrXrefs.SMP_next_from()) { - ea_t TargetAddr = CurrXrefs.GetTo(); + STARS_ea_t TargetAddr = CurrXrefs.GetTo(); if ((TargetAddr != 0) && (CurrXrefs.GetIscode())) { // Found a code target, with its address in CurrXrefs.to if ((CallFlag || IndirCallFlag || TailCallFlag) @@ -5808,7 +5809,7 @@ void SMPFunction::SetLinks(void) { // is a jump target from elsewhere. continue; } - map<ea_t, SMPBasicBlock *>::iterator MapEntry; + map<STARS_ea_t, SMPBasicBlock *>::iterator MapEntry; MapEntry = this->InstBlockMap.find(TargetAddr); if (MapEntry == this->InstBlockMap.end()) { ; // do nothing; probably a tail call (not yet identified) @@ -5966,7 +5967,7 @@ void SMPFunction::SetLinks(void) { SMP_msg("Removing block with no predecessors at %x\n", CurrBlock->GetFirstAddr()); // Remove this block from the predecessors list of its successors. list<SMPBasicBlock *>::iterator SuccIter; - ea_t TempAddr = CurrBlock->GetFirstAddr(); + STARS_ea_t TempAddr = CurrBlock->GetFirstAddr(); for (SuccIter = CurrBlock->GetFirstSucc(); SuccIter != CurrBlock->GetLastSucc(); ++SuccIter) { (*SuccIter)->ErasePred(TempAddr); } @@ -5975,10 +5976,10 @@ void SMPFunction::SetLinks(void) { // Remove the unreachable instructions from the function inst list. vector<SMPInstr *>::iterator InstIter; InstIter = CurrBlock->GetFirstInst(); - ea_t FirstBadAddr = (*InstIter)->GetAddr(); + STARS_ea_t FirstBadAddr = (*InstIter)->GetAddr(); InstIter = CurrBlock->GetLastInst(); --InstIter; // get last real instruction - ea_t LastBadAddr = (*InstIter)->GetAddr(); + STARS_ea_t LastBadAddr = (*InstIter)->GetAddr(); this->EraseInstRange(FirstBadAddr, LastBadAddr); // Finally, remove the block from the blocks list. @@ -6123,7 +6124,7 @@ void SMPFunction::RPONumberBlocks(void) { // all predecessors numbered. Take the WorkList item with the lowest address // and number it so we can proceed. CurrListItem = WorkList.begin(); - ea_t LowAddr = (*CurrListItem)->GetFirstAddr(); + STARS_ea_t LowAddr = (*CurrListItem)->GetFirstAddr(); list<SMPBasicBlock *>::iterator SaveItem = CurrListItem; ++CurrListItem; while (CurrListItem != WorkList.end()) { @@ -6833,13 +6834,13 @@ void SMPFunction::SSARename(int BlockNumber) { TempPhiList.push_back(TempPhi); if (PhiDefOp->IsRegOp()) { - if (DumpFlag && PhiDefOp->MatchesReg(R_ax)) { + if (DumpFlag && PhiDefOp->MatchesReg(STARS_x86_R_ax)) { SMP_msg("New EAX Phi Def SSANum: %d Block %d\n", NewSSANum, BlockNumber); } // Map the final SSA number to the block number. int DefHashValue = HashGlobalNameAndSSA(PhiDefOp, NewSSANum); - pair<int, ea_t> DefMapEntry(DefHashValue, (STARS_PSEUDO_ID_MIN + CurrBlock->GetNumber())); - pair<map<int, ea_t>::iterator, bool> MapReturnValue; + pair<int, STARS_ea_t> DefMapEntry(DefHashValue, (STARS_PSEUDO_ID_MIN + CurrBlock->GetNumber())); + pair<map<int, STARS_ea_t>::iterator, bool> MapReturnValue; MapReturnValue = this->GlobalDefAddrBySSA.insert(DefMapEntry); assert(MapReturnValue.second); } @@ -6863,7 +6864,7 @@ void SMPFunction::SSARename(int BlockNumber) { for (InstIter = CurrBlock->GetFirstInst(); InstIter != CurrBlock->GetLastInst(); ++InstIter) { CurrInst = (*InstIter); set<DefOrUse, LessDefUse>::iterator CurrUse = CurrInst->GetFirstUse(); - ea_t InstAddr = CurrInst->GetAddr(); // for debugging break points + STARS_ea_t InstAddr = CurrInst->GetAddr(); // for debugging break points while (CurrUse != CurrInst->GetLastUse()) { // See if Use is a global name. STARSOpndTypePtr UseOp = CurrUse->GetOp(); @@ -6897,7 +6898,7 @@ void SMPFunction::SSARename(int BlockNumber) { NewSSANum = this->SSAStack.at(GlobIndex).back(); } CurrUse = CurrInst->SetUseSSA(UseOp, NewSSANum); - if (DumpFlag && (UseOp->IsRegOp()) && UseOp->MatchesReg(R_ax)) { + if (DumpFlag && (UseOp->IsRegOp()) && UseOp->MatchesReg(STARS_x86_R_ax)) { SMP_msg("New EAX Use SSANum: %d at %lx\n", NewSSANum, (unsigned long) CurrInst->GetAddr()); } } @@ -6914,15 +6915,15 @@ void SMPFunction::SSARename(int BlockNumber) { int NewSSANum = this->SSANewNumber(GlobIndex); CurrDef = CurrInst->SetDefSSA(DefOp, NewSSANum); if (DefOp->IsRegOp()) { - ea_t DefAddr = InstAddr; - if (DumpFlag && DefOp->MatchesReg(R_ax)) { + STARS_ea_t DefAddr = InstAddr; + if (DumpFlag && DefOp->MatchesReg(STARS_x86_R_ax)) { SMP_msg("New EAX Def SSANum: %d at %lx\n", NewSSANum, (unsigned long) DefAddr); } // Map the final SSA number to the DEF address. int DefHashValue = HashGlobalNameAndSSA(DefOp, NewSSANum); - pair<int, ea_t> DefMapEntry(DefHashValue, DefAddr); - pair<map<int, ea_t>::iterator, bool> MapReturnValue; + pair<int, STARS_ea_t> DefMapEntry(DefHashValue, DefAddr); + pair<map<int, STARS_ea_t>::iterator, bool> MapReturnValue; MapReturnValue = this->GlobalDefAddrBySSA.insert(DefMapEntry); assert(MapReturnValue.second); } @@ -7105,7 +7106,7 @@ void SMPFunction::InferTypes(bool FirstIter) { set<DefOrUse, LessDefUse>::iterator NextDef; list<SMPBasicBlock *>::iterator BlockIter; SMPBasicBlock *CurrBlock; - ea_t InstAddr; + STARS_ea_t InstAddr; #if SMP_DEBUG_TYPE_INFERENCE if (DebugFlag) { @@ -7167,7 +7168,7 @@ void SMPFunction::InferTypes(bool FirstIter) { changed = (changed || NewChange); #if SMP_ANALYZE_INFER_TYPES_TIME if (DebugFlag2 && NewChange) { - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); ++NewChangeCount; } #endif @@ -7225,7 +7226,7 @@ void SMPFunction::InferTypes(bool FirstIter) { ++CurrDef; continue; } - ea_t DefAddr = InstAddr; + STARS_ea_t DefAddr = InstAddr; // Call inference method based on whether it is a block-local // name or a global name. CurrBlock = CurrInst->GetBlock(); @@ -7404,11 +7405,11 @@ void SMPFunction::ApplyProfilerInformation(ProfilerInformation* pi) } // lookup whether this instruction has been profiled as an indirect call - set<ea_t> indirect_call_targets = pi->GetIndirectCallTargets(CurrInst->GetAddr()); + set<STARS_ea_t> indirect_call_targets = pi->GetIndirectCallTargets(CurrInst->GetAddr()); - for (set<ea_t>::iterator ict_iter = indirect_call_targets.begin(); ict_iter != indirect_call_targets.end(); ++ict_iter) { - ea_t target = *ict_iter; - pair<set<ea_t>::iterator, bool> InsertResult; + for (set<STARS_ea_t>::iterator ict_iter = indirect_call_targets.begin(); ict_iter != indirect_call_targets.end(); ++ict_iter) { + STARS_ea_t target = *ict_iter; + pair<set<STARS_ea_t>::iterator, bool> InsertResult; if (BADADDR != target) { InsertResult = this->IndirectCallTargets.insert(target); if (InsertResult.second && (!vector_exists(target, AllCallTargets))) { @@ -7425,7 +7426,7 @@ void SMPFunction::ApplyProfilerInformation(ProfilerInformation* pi) // If so, set the DEF to that type and return type, // else return UNINIT. // If DefAddr == BADADDR, then the DEF is in a Phi function, not an instruction. -SMPOperandType SMPFunction::InferGlobalDefType(STARSOpndTypePtr DefOp, int SSANum, SMPBasicBlock *DefBlock, bool CallInst, ea_t DefAddr) { +SMPOperandType SMPFunction::InferGlobalDefType(STARSOpndTypePtr DefOp, int SSANum, SMPBasicBlock *DefBlock, bool CallInst, STARS_ea_t DefAddr) { bool DebugFlag = false; bool FoundNumeric = false; bool FoundPointer = false; @@ -7509,7 +7510,7 @@ SMPOperandType SMPFunction::InferGlobalDefType(STARSOpndTypePtr DefOp, int SSANu if (DefEscapes) { // Need to recurse into successor blocks list<SMPBasicBlock *>::iterator SuccIter; - ea_t TempAddr; + STARS_ea_t TempAddr; this->ResetProcessedBlocks(); // set up recursion for (SuccIter = DefBlock->GetFirstSucc(); SuccIter != DefBlock->GetLastSucc(); ++SuccIter) { SMPBasicBlock *CurrBlock = (*SuccIter); @@ -7580,10 +7581,10 @@ void SMPFunction::FindCounterVariables(void) { } STARSOpndTypePtr DefOp = DefIter->GetOp(); if (DefOp->IsRegOp()) { - list<pair<int, ea_t> > CounterSSANums; // SSA numbers that are definitely counters for DefOp + list<pair<int, STARS_ea_t> > CounterSSANums; // SSA numbers that are definitely counters for DefOp int DefSSANum = DefIter->GetSSANum(); - ea_t DefAddr = CurrInst->GetAddr(); - pair<int, ea_t> ListItem(DefSSANum, DefAddr); + STARS_ea_t DefAddr = CurrInst->GetAddr(); + pair<int, STARS_ea_t> ListItem(DefSSANum, DefAddr); CounterSSANums.push_back(ListItem); SMPBasicBlock *CurrBlock = CurrInst->GetBlock(); int BlockNum = CurrBlock->GetNumber(); @@ -7591,7 +7592,7 @@ void SMPFunction::FindCounterVariables(void) { if (this->CounterVarHelper(DefOp, DefSSANum, BlockNum, LocalName, CounterSSANums)) { while (!CounterSSANums.empty()) { int CurrSSANum = CounterSSANums.front().first; - ea_t CurrDefAddr = CounterSSANums.front().second; + STARS_ea_t CurrDefAddr = CounterSSANums.front().second; bool Propagated; if (LocalName) { Propagated = CurrBlock->PropagateLocalDefType(DefOp, NUMERIC, CurrDefAddr, CurrSSANum, false); @@ -7603,7 +7604,7 @@ void SMPFunction::FindCounterVariables(void) { CounterSSANums.pop_front(); } } - } // end if o_reg type + } // end if reg type } // end if const value of 0 } // end if simple assignment } // end for all instructions @@ -7613,7 +7614,7 @@ void SMPFunction::FindCounterVariables(void) { // recursive helper for FindCounterVariables() // Return true if we added to the DefSSANums list. -bool SMPFunction::CounterVarHelper(STARSOpndTypePtr DefOp, int DefSSANum, int BlockNum, bool LocalName, list<pair<int, ea_t> > &CounterSSANums) { +bool SMPFunction::CounterVarHelper(STARSOpndTypePtr DefOp, int DefSSANum, int BlockNum, bool LocalName, list<pair<int, STARS_ea_t> > &CounterSSANums) { bool ListExpanded = false; std::size_t IncomingListSize = CounterSSANums.size(); set<int> NonEscapingRegisterHashes; @@ -7628,7 +7629,7 @@ bool SMPFunction::CounterVarHelper(STARSOpndTypePtr DefOp, int DefSSANum, int Bl // We will expand this to loops that are not in a single block later. SMPBasicBlock *CurrBlock = this->GetBlockByNum((std::size_t) BlockNum); assert(NULL != CurrBlock); - ea_t DefAddr = CounterSSANums.front().second; + STARS_ea_t DefAddr = CounterSSANums.front().second; if (CurrBlock->DoesDefReachBlockEnd(DefAddr, DefOp, DefSSANum, NonEscapingRegisterHashes)) { NonEscapingRegisterHashes.clear(); // Not memoizing for this use of DoesDefReachBlockEnd() bool LoopSuccFound = false; @@ -7669,7 +7670,7 @@ bool SMPFunction::CounterVarHelper(STARSOpndTypePtr DefOp, int DefSSANum, int Bl // Found a redefinition of DefOp. Is it just a counter operation that redefines DefOp? if (CurrInst->IsCounterOperation()) { // We will add the new DEF SSA # to the list of counter SSAs. - pair<int, ea_t> CounterPair(DefIter->GetSSANum(), CurrInst->GetAddr()); + pair<int, STARS_ea_t> CounterPair(DefIter->GetSSANum(), CurrInst->GetAddr()); CounterSSANums.push_back(CounterPair); // We don't need to push the PhiDefSSANum discovered earlier, because if // it follows the simple pattern of only using two counter DEFs as its USEs, @@ -7957,7 +7958,7 @@ void SMPFunction::MarkSpecialNumericErrorCases(void) { list<SMPInstr *>::iterator InstIter; for (InstIter = this->Instrs.begin(); InstIter != this->Instrs.end(); ++InstIter) { CurrInst = (*InstIter); - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); SMPitype CurrDataFlowType = CurrInst->GetDataFlowType(); // Find all conditional and unconditional jumps within the function. @@ -8013,9 +8014,9 @@ void SMPFunction::MarkSpecialNumericErrorCases(void) { // So, do not claim success unless the later addition DEF reaches the end // of the block. DefIter = CurrInst->GetFirstNonFlagsDef(); - ea_t DefAddr = CurrInst->GetAddr(); + STARS_ea_t DefAddr = CurrInst->GetAddr(); STARSOpndTypePtr DefOp = DefIter->GetOp(); - ea_t AdditionAddr = BADADDR; + STARS_ea_t AdditionAddr = BADADDR; ShiftFound = CurrBlock->IsDefInvolvedInAddition(DefAddr, DefOp, AdditionAddr); if (ShiftFound) { SMPInstr *AdditionInst = this->GetInstFromAddr(AdditionAddr); @@ -8067,10 +8068,10 @@ void SMPFunction::GatherIncomingArgTypes(void) { for (set<DefOrUse, LessDefUse>::iterator DefIter = MarkerInst->GetFirstDef(); DefIter != MarkerInst->GetLastDef(); ++DefIter) { STARSOpndTypePtr DefOp = DefIter->GetOp(); std::size_t ArgIndex = 0; - if (STARS_ISA_Bitwidth == 64) { + if (global_STARS_program->GetSTARS_ISA_Bitwidth() == 64) { if (DefOp->IsRegOp()) { - uint16 RegNum = DefOp->GetReg(); - for (list<uint16>::iterator ArgRegIter = GetFirstArgumentReg(); ArgRegIter != GetLastArgumentReg(); ++ArgRegIter) { + uint16_t RegNum = DefOp->GetReg(); + for (list<uint16_t>::iterator ArgRegIter = global_STARS_program->GetFirstArgumentReg(); ArgRegIter != global_STARS_program->GetLastArgumentReg(); ++ArgRegIter) { if (RegNum == (*ArgRegIter)) { // found an incoming argument ++ArgCount; this->InArgTypes[ArgIndex] = (unsigned short) DefIter->GetType(); @@ -8179,15 +8180,15 @@ void SMPFunction::EmitAnnotations(FILE *AnnotFile, FILE *InfoAnnotFile) { // Emit annotations about how to restore register values SMP_fprintf(AnnotFile, "%10lx %6d FUNC FRAMERESTORE ", (unsigned long) this->FuncInfo->get_startEA(), 0); - for (int i = R_ax; i <= STARS_MD_LAST_SAVED_REG_NUM; i++) { + for (int i = STARS_x86_R_ax; i <= global_STARS_program->GetSTARS_MD_LAST_SAVED_REG_NUM(); i++) { SMP_fprintf(AnnotFile, "%d %d %d ", i, this->SavedRegLoc[i], this->ReturnRegTypes[i]); } SMP_fprintf(AnnotFile, "ZZ\n"); // Print type left in the return register. - if (MD_RETURN_VALUE_REG != R_none) { + if (MD_RETURN_VALUE_REG != STARS_x86_R_none) { SMP_fprintf(InfoAnnotFile, "%10lx %6u FUNC RETURNTYPE ", (unsigned long) this->FuncInfo->get_startEA(), this->Size); - SMP_fprintf(InfoAnnotFile, "%s %d\n", MDGetRegNumName(MD_RETURN_VALUE_REG, STARS_ISA_Bytewidth), this->ReturnRegTypes[MD_RETURN_VALUE_REG]); + SMP_fprintf(InfoAnnotFile, "%s %d\n", MDGetRegNumName(MD_RETURN_VALUE_REG, global_STARS_program->GetSTARS_ISA_Bytewidth()), this->ReturnRegTypes[MD_RETURN_VALUE_REG]); } // Print types of incoming arguments, if any. if (this->GetIncomingArgCount() > 0) { @@ -8238,7 +8239,7 @@ void SMPFunction::EmitAnnotations(FILE *AnnotFile, FILE *InfoAnnotFile) { SMP_fprintf(InfoAnnotFile, "\n"); } - if (STARS_PerformReducedAnalysis) { + if (global_STARS_program->ShouldSTARSPerformReducedAnalysis()) { list<SMPInstr *>::iterator InstIter = Instrs.begin(); #if SMP_USE_SSA_FNOP_MARKER ++InstIter; // skip marker instruction @@ -8247,7 +8248,7 @@ void SMPFunction::EmitAnnotations(FILE *AnnotFile, FILE *InfoAnnotFile) { bool DeallocTrigger = false; for ( ; InstIter != Instrs.end(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); - ea_t addr = CurrInst->GetAddr(); + STARS_ea_t addr = CurrInst->GetAddr(); if (CurrInst->IsFloatNop()) { SMP_msg("WARNING: FloatNop not used as marker instruction at %llx\n", (uint64) addr); } @@ -8328,7 +8329,7 @@ void SMPFunction::EmitAnnotations(FILE *AnnotFile, FILE *InfoAnnotFile) { bool DeallocTrigger = false; for ( ; InstIter != Instrs.end(); ++InstIter) { SMPInstr *CurrInst = (*InstIter); - ea_t addr = CurrInst->GetAddr(); + STARS_ea_t addr = CurrInst->GetAddr(); if (CurrInst->IsFloatNop()) { SMP_msg("WARNING: FloatNop not used as marker instruction at %llx\n", (uint64) addr); } @@ -8351,7 +8352,7 @@ void SMPFunction::EmitAnnotations(FILE *AnnotFile, FILE *InfoAnnotFile) { if (xrefs.GetTo() != 0) { if (xrefs.GetIscode() && (xrefs.GetType() != fl_F)) { // Found a code target, with its address in xrefs.to - PrintCodeToCodeXref(addr, xrefs.GetTo(), CurrInst->GetSize()); + global_STARS_program->PrintCodeToCodeXref(addr, xrefs.GetTo(), CurrInst->GetSize()); } } } @@ -8424,7 +8425,7 @@ void SMPFunction::EmitAnnotations(FILE *AnnotFile, FILE *InfoAnnotFile) { CurrInst = CurrBlock->GetFirstInst(); if ((*CurrInst)->IsMarkerInst()) ++CurrInst; - ea_t addr = (*CurrInst)->GetAddr(); + STARS_ea_t addr = (*CurrInst)->GetAddr(); SMP_fprintf(AnnotFile, "%10x %6d BLOCK PROFILECOUNT %s\n", addr, (*CurrInst)->GetSize(), (*CurrInst)->GetDisasm()); #endif @@ -8486,17 +8487,17 @@ void SMPFunction::Dump(void) { #define STARS_DEBUG_DUPLICATE_SEARCHES 1 // Is DefOp+DefSSANum at DefAddr used as address reg or as source operand in memory write? -bool SMPFunction::IsDefUsedInMemWrite(STARSOpndTypePtr DefOp, int DefSSANum, ea_t DefAddr) { +bool SMPFunction::IsDefUsedInMemWrite(STARSOpndTypePtr DefOp, int DefSSANum, STARS_ea_t DefAddr) { bool FoundMemWriteUse = false; - list<pair<pair<STARSOpndTypePtr, int>, ea_t> > DefWorkList; + list<pair<pair<STARSOpndTypePtr, int>, STARS_ea_t> > DefWorkList; pair<STARSOpndTypePtr, int> InitialSearchDef(DefOp, DefSSANum); - pair<pair<STARSOpndTypePtr, int>, ea_t> InitialItem(InitialSearchDef, DefAddr); + pair<pair<STARSOpndTypePtr, int>, STARS_ea_t> InitialItem(InitialSearchDef, DefAddr); DefWorkList.push_back(InitialItem); - set<pair<ea_t, int>, LessSearchOperand> AlreadySearchedSet; + set<pair<STARS_ea_t, int>, LessSearchOperand> AlreadySearchedSet; do { // process DefWorkList - pair<pair<STARSOpndTypePtr, int>, ea_t> HeadItem = DefWorkList.front(); + pair<pair<STARSOpndTypePtr, int>, STARS_ea_t> HeadItem = DefWorkList.front(); DefOp = HeadItem.first.first; DefSSANum = HeadItem.first.second; DefAddr = HeadItem.second; @@ -8506,8 +8507,8 @@ bool SMPFunction::IsDefUsedInMemWrite(STARSOpndTypePtr DefOp, int DefSSANum, ea_ // Ensure that we don't have a data dependence loop that causes // duplicate searches. int DefHashIndex = HashGlobalNameAndSSA(DefOp, DefSSANum); - pair<ea_t, int> SearchItem(DefAddr, DefHashIndex); - pair<set<pair<ea_t, int>, LessSearchOperand>::iterator, bool> InsertResult = AlreadySearchedSet.insert(SearchItem); + pair<STARS_ea_t, int> SearchItem(DefAddr, DefHashIndex); + pair<set<pair<STARS_ea_t, int>, LessSearchOperand>::iterator, bool> InsertResult = AlreadySearchedSet.insert(SearchItem); if (InsertResult.second) { // not previously in the AlreadySearchedSet // Find DefBlock and get the recursion started. SMPBasicBlock *DefBlock = this->GetBlockFromInstAddr(DefAddr); @@ -8531,10 +8532,10 @@ bool SMPFunction::IsDefUsedInMemWrite(STARSOpndTypePtr DefOp, int DefSSANum, ea_ // Can the return address of any caller be read or written directly from this function? bool SMPFunction::IsCallerReturnAddressReadOrWritten(void) { - set<ea_t>::iterator CallerIter; + set<STARS_ea_t>::iterator CallerIter; bool CallerVulnerable = false; for (CallerIter = this->AllCallSources.begin(); CallerIter != this->AllCallSources.end(); ++CallerIter) { - ea_t CallerFirstAddr = (*CallerIter); // we store first addrs of funcs that call us, not the call inst addrs, in AllCallSources. + STARS_ea_t CallerFirstAddr = (*CallerIter); // we store first addrs of funcs that call us, not the call inst addrs, in AllCallSources. SMPFunction *CallerFunc = this->GetProg()->FindFunction(CallerFirstAddr); if ((NULL != CallerFunc) && CallerFunc->StackPtrAnalysisSucceeded()) { if (CallerFunc->GetLocalVarsSize() < this->GetMaxDirectStackAccessDelta()) { @@ -8585,10 +8586,10 @@ void SMPFunction::MarkFunctionSafe() { #endif } - ea_t FirstAddr = this->GetFirstFuncAddr(); + STARS_ea_t FirstAddr = this->GetFirstFuncAddr(); SMP_xref_t xrefs; for (bool ok = xrefs.SMP_first_to(FirstAddr, XREF_ALL); ok; ok = xrefs.SMP_next_to()) { - ea_t FromAddr = xrefs.GetFrom(); + STARS_ea_t FromAddr = xrefs.GetFrom(); if (FromAddr != 0) { if (!xrefs.GetIscode()) { // found data xref IsIndirectCallTarget = true; // addr of func appears in data; assume indirect calls to func @@ -8642,14 +8643,14 @@ void SMPFunction::MarkFunctionSafe() { } } else if (!XferESPtoEBP) { // found "push ebp", looking for "mov ebp,esp" - if ((CurrInst->GetIDAOpcode() == NN_mov) + if ((CurrInst->GetIDAOpcode() == STARS_NN_mov) && (CurrInst->GetFirstDef()->GetOp()->MatchesReg(MD_FRAME_POINTER_REG)) && (CurrInst->GetFirstUse()->GetOp()->MatchesReg(MD_STACK_POINTER_REG))) { XferESPtoEBP = true; continue; } } - ea_t address = CurrInst->GetAddr(); + STARS_ea_t address = CurrInst->GetAddr(); if ((CurrInst->IsTailCall()) || (CurrInst->IsCondTailCall())) { // Moved up here because a tail call can be the point at which the stack // frame returns to its prior state, making it the DeallocInstr. @@ -8723,14 +8724,14 @@ void SMPFunction::MarkFunctionSafe() { int BaseReg; int IndexReg; uint16_t ScaleFactor; - ea_t offset; + STARS_ea_t offset; if (Operand->IsStaticMemOp()) { // now o_mem can have sib byte as well, as - // reported by IDA. Check if the base reg is R_none - // and index reg is R_none. If they are, then this is + // reported by IDA. Check if the base reg is STARS_x86_R_none + // and index reg is STARS_x86_R_none. If they are, then this is // a direct global write and can be marked safe. MDExtractAddressFields(Operand, BaseReg, IndexReg, ScaleFactor, offset); - if ((BaseReg == R_none) && (IndexReg == R_none)) { + if ((BaseReg == STARS_x86_R_none) && (IndexReg == STARS_x86_R_none)) { // go onto next def continue; } @@ -8743,7 +8744,7 @@ void SMPFunction::MarkFunctionSafe() { bool FramePointerRelative = (this->UseFP && (BaseReg == MD_FRAME_POINTER_REG)); bool StackPointerRelative = (BaseReg == MD_STACK_POINTER_REG); if (StackPointerRelative || FramePointerRelative) { - if (IndexReg == R_none) { + if (IndexReg == STARS_x86_R_none) { bool tempWritesAboveLocalFrame = this->WritesAboveLocalFrame(Operand, CurrInst->AreDefsNormalized(), address); WritesAboveLocalFrame |= tempWritesAboveLocalFrame; #if SMP_DEBUG_FUNC @@ -8795,7 +8796,7 @@ void SMPFunction::MarkFunctionSafe() { // check the base reg // if index reg is used mark as unsafe if (MDIsStackPtrReg(BaseReg, this->UseFP)) { - if (IndexReg == R_none) { + if (IndexReg == STARS_x86_R_none) { /* addressing mode is *esp or *ebp */ continue; } @@ -8939,8 +8940,8 @@ void SMPFunction::EmitFuncSPARKAda(void) { } #endif - FILE *OutFile = ZST_SPARKSourceFile; - FILE *HeaderFile = ZST_SPARKHeaderFile; + FILE *OutFile = global_STARS_program->GetSPARKSourceFile(); + FILE *HeaderFile = global_STARS_program->GetSPARKHeaderFile(); list<SMPInstr *>::iterator InstIter = this->Instrs.begin(); #if SMP_USE_SSA_FNOP_MARKER @@ -8948,7 +8949,7 @@ void SMPFunction::EmitFuncSPARKAda(void) { #endif while (InstIter != this->Instrs.end()) { SMPInstr *CurrInst = (*InstIter); - ea_t InstAddr = CurrInst->GetAddr(); + STARS_ea_t InstAddr = CurrInst->GetAddr(); CurrInst->EmitSPARKAda(OutFile); ++InstIter; } // end while all instrs diff --git a/src/base/SMPInstr.cpp b/src/base/SMPInstr.cpp index 45da0676..46351ccb 100644 --- a/src/base/SMPInstr.cpp +++ b/src/base/SMPInstr.cpp @@ -18,7 +18,7 @@ * e-mail: jwd@virginia.com * URL : http://www.cs.virginia.edu/ * - * Additional copyrights 2010, 2011 by Zephyr Software LLC + * Additional copyrights 2010, 2011, 2012, 2013, 2014, 2015 by Zephyr Software LLC * e-mail: {clc,jwd}@zephyr-software.com * URL : http://www.zephyr-software.com/ * @@ -33,26 +33,30 @@ using namespace std; +#include <memory> #include <string> + #include <cstring> -#include <memory> #include <cstddef> +#include <cassert> #include <pro.h> -#include <assert.h> #include <ua.hpp> +#include <intel.hpp> + +#if 0 #include <ida.hpp> #include <idp.hpp> #include <auto.hpp> #include <bytes.hpp> #include <funcs.hpp> -#include <intel.hpp> #include <loader.hpp> #include <lines.hpp> #include <name.hpp> +#endif +#include "interfaces/STARSTypes.h" #include "interfaces/SMPDBInterface.h" -#include "base/SMPStaticAnalyzer.h" #include "base/SMPDataFlowAnalysis.h" #include "base/SMPInstr.h" #include "base/SMPProgram.h" @@ -93,6 +97,7 @@ static uint32_t UseMacros[UA_MAXOP] = {CF_USE1, CF_USE2, CF_USE3, CF_USE4, CF_US // Text to be printed in each optimizing annotation explaining why // the annotation was emitted. +#define LAST_TYPE_CATEGORY 15 static const char *OptExplanation[LAST_TYPE_CATEGORY + 1] = { "NoOpt", "NoMetaUpdate", "AlwaysNUM", "NUMVia2ndSrcIMMEDNUM", "Always1stSrc", "1stSrcVia2ndSrcIMMEDNUM", "AlwaysPtr", @@ -340,7 +345,7 @@ void PrintSPARKIndentTabs(FILE *OutFile) { void SMPInstr::PrintSPARKAdaOperand(STARSOpndTypePtr Opnd, FILE *OutFile, bool LeftHandSide, bool UseFP) { std::size_t OpndByteWidth = Opnd->GetByteWidth(); bool MemOpnd = IsMemOperand(Opnd); - bool SubwordWidth = (STARS_ISA_Bytewidth > OpndByteWidth); + bool SubwordWidth = (global_STARS_program->GetSTARS_ISA_Bytewidth() > OpndByteWidth); bool MemWrite = LeftHandSide && MemOpnd; bool MemRead = MemOpnd && (!LeftHandSide); char MemWriteString[40] = { '\0' }; @@ -375,7 +380,7 @@ void SMPInstr::PrintSPARKAdaOperand(STARSOpndTypePtr Opnd, FILE *OutFile, bool L else { // no SIB info uint16_t BaseReg = Opnd->GetReg(); STARSOpndTypePtr BaseOp = this->STARSInstPtr->MakeRegOpnd(BaseReg); - if (Opnd->HasSegReg() && (!((R_ss == Opnd->GetSegReg()) && MDIsStackAccessOpnd(Opnd, UseFP)))) { + if (Opnd->HasSegReg() && (!((STARS_x86_R_ss == Opnd->GetSegReg()) && MDIsStackAccessOpnd(Opnd, UseFP)))) { // We have a segment selector that is not just a redundant SS: selector for an RSP-relative access. STARSOpndTypePtr SegRegOp = this->STARSInstPtr->MakeRegOpnd(Opnd->GetSegReg()); SMP_fprintf(OutFile, " %s X86.%s + X86.%s ", MemWriteString, MDGetRegName(SegRegOp), MDGetRegName(BaseOp)); @@ -383,7 +388,7 @@ void SMPInstr::PrintSPARKAdaOperand(STARSOpndTypePtr Opnd, FILE *OutFile, bool L else { SMP_fprintf(OutFile, " %s X86.%s ", MemWriteString, MDGetRegName(BaseOp)); } - if (STARS_ISA_Bytewidth > BaseOp->GetByteWidth()) { + if (global_STARS_program->GetSTARS_ISA_Bytewidth() > BaseOp->GetByteWidth()) { ++SubwordAddressRegCount; } } @@ -409,7 +414,7 @@ void SMPInstr::PrintSPARKAdaOperand(STARSOpndTypePtr Opnd, FILE *OutFile, bool L else { uint16_t BaseReg = Opnd->GetReg(); STARSOpndTypePtr BaseOp = this->STARSInstPtr->MakeRegOpnd(BaseReg); - if (Opnd->HasSegReg() && (!((R_ss == Opnd->GetSegReg()) && MDIsStackAccessOpnd(Opnd, UseFP)))) { + if (Opnd->HasSegReg() && (!((STARS_x86_R_ss == Opnd->GetSegReg()) && MDIsStackAccessOpnd(Opnd, UseFP)))) { // We have a segment selector that is not just a redundant SS: selector for an RSP-relative access. STARSOpndTypePtr SegRegOp = this->STARSInstPtr->MakeRegOpnd(Opnd->GetSegReg()); SMP_fprintf(OutFile, " %s X86.%s + X86.%s ", MemWriteString, MDGetRegName(SegRegOp), MDGetRegName(BaseOp)); @@ -421,7 +426,7 @@ void SMPInstr::PrintSPARKAdaOperand(STARSOpndTypePtr Opnd, FILE *OutFile, bool L SMP_fprintf(OutFile, "+ %d ", SignedOffset); else // minus sign will print automatically SMP_fprintf(OutFile, "%d ", SignedOffset); - if (STARS_ISA_Bytewidth > BaseOp->GetByteWidth()) { + if (global_STARS_program->GetSTARS_ISA_Bytewidth() > BaseOp->GetByteWidth()) { ++SubwordAddressRegCount; } } @@ -1024,7 +1029,7 @@ bool SMPRegTransfer::IsTruncatedWidthRTL(std::size_t &LeftBitWidth) const { bool TruncatedWidth = false; STARSOpndTypePtr LeftOp = this->GetLeftOperand(); std::size_t LeftOpByteWidth = (std::size_t) LeftOp->GetByteWidth(); - if (LeftOpByteWidth < STARS_ISA_Bytewidth) { // Forget it unless LeftOp is reduced width. + if (LeftOpByteWidth < global_STARS_program->GetSTARS_ISA_Bytewidth()) { // Forget it unless LeftOp is reduced width. // Search right hand side for wider operands. LeftBitWidth = 8 * LeftOpByteWidth; STARSOpndTypePtr RightOp = nullptr; @@ -1050,8 +1055,8 @@ bool SMPRegTransfer::IsTruncatedWidthRTL(std::size_t &LeftBitWidth) const { #define STARS_ESP_ADDITION_OVERFLOW_THRESHOLD 0xf0000000 // Compute operand-dependent change in stack pointer value. -sval_t SMPRegTransfer::ComputeStackPointerAlteration(bool IsLeaveInstr, sval_t IncomingDelta, sval_t FramePtrDelta) { - sval_t delta = 0; +STARS_sval_t SMPRegTransfer::ComputeStackPointerAlteration(bool IsLeaveInstr, STARS_sval_t IncomingDelta, STARS_sval_t FramePtrDelta) { + STARS_sval_t delta = 0; // Search for the pattern: stack_pointer := ... if (SMP_ASSIGN == this->GetOperator()) { @@ -1081,7 +1086,7 @@ sval_t SMPRegTransfer::ComputeStackPointerAlteration(bool IsLeaveInstr, sval_t I // !!!!****!!!!**** Need to look up deltas for registers that // were used to hold a copy of the stack pointer. // For now, just consider it an error. - delta = (sval_t) SMP_STACK_DELTA_ERROR_CODE; + delta = (STARS_sval_t) SMP_STACK_DELTA_ERROR_CODE; } } else { @@ -1096,11 +1101,11 @@ sval_t SMPRegTransfer::ComputeStackPointerAlteration(bool IsLeaveInstr, sval_t I assert(SMP_ADD == RightOperator); assert(!RightRT->HasRightSubTree()); assert(RightDefOp->MatchesReg(X86_FRAME_POINTER_REG)); - delta = STARS_ISA_Bytewidth + FramePtrDelta - IncomingDelta; + delta = global_STARS_program->GetSTARS_ISA_Bytewidth() + FramePtrDelta - IncomingDelta; } else if (RightRT->HasRightSubTree()) { // Not the right code pattern; unknown effect on stack pointer. - delta = (sval_t) SMP_STACK_DELTA_ERROR_CODE; + delta = (STARS_sval_t) SMP_STACK_DELTA_ERROR_CODE; } else if (!RightDefOp->MatchesReg(MD_STACK_POINTER_REG)) { // We have stack_pointer := something1 operator something2 @@ -1120,14 +1125,14 @@ sval_t SMPRegTransfer::ComputeStackPointerAlteration(bool IsLeaveInstr, sval_t I } else { // Not the right code pattern; unknown effect on stack pointer. - delta = (sval_t) SMP_STACK_DELTA_ERROR_CODE; + delta = (STARS_sval_t) SMP_STACK_DELTA_ERROR_CODE; } } else { // !!!!****!!!!**** Need to look up deltas for registers that // were used to hold a copy of the stack pointer. // For now, just consider it an error. - delta = (sval_t) SMP_STACK_DELTA_ERROR_CODE; + delta = (STARS_sval_t) SMP_STACK_DELTA_ERROR_CODE; } } else { @@ -1135,20 +1140,20 @@ sval_t SMPRegTransfer::ComputeStackPointerAlteration(bool IsLeaveInstr, sval_t I STARSOpndTypePtr RightUseOp = RightRT->GetRightOperand(); // Check the operator if (SMP_BITWISE_AND == RightOperator) { - delta = (sval_t) SMP_STACK_POINTER_BITWISE_AND_CODE; + delta = (STARS_sval_t) SMP_STACK_POINTER_BITWISE_AND_CODE; } else { if (! RightUseOp->IsImmedOp()) { // Don't know how to deal with adding non-constant to stack pointer - delta = (sval_t) SMP_STACK_DELTA_ERROR_CODE; + delta = (STARS_sval_t) SMP_STACK_DELTA_ERROR_CODE; } else if (SMP_ADD == RightOperator) { - delta = (sval_t) RightUseOp->GetImmedValue(); + delta = (STARS_sval_t) RightUseOp->GetImmedValue(); if (delta > STARS_ESP_ADDITION_OVERFLOW_THRESHOLD) { // Really a subtraction via addition of a negative. // E.g. add esp, 0xfffffff0 is sub esp,16 int32 TempDelta = (int32) (delta & 0xffffffff); - delta = (sval_t) TempDelta; + delta = (STARS_sval_t) TempDelta; } } else if (SMP_SUBTRACT == RightOperator) { @@ -1156,14 +1161,14 @@ sval_t SMPRegTransfer::ComputeStackPointerAlteration(bool IsLeaveInstr, sval_t I // Really a subtraction via addition of a negative. // E.g. add esp, 0xfffffff0 is sub esp,16 int32 TempDelta = (int32) (RightUseOp->GetImmedValue() & 0xffffffff); - delta = (0 - ((sval_t) TempDelta)); + delta = (0 - ((STARS_sval_t) TempDelta)); } else { - delta = (0 - ((sval_t) RightUseOp->GetImmedValue())); + delta = (0 - ((STARS_sval_t) RightUseOp->GetImmedValue())); } } else { - delta = (sval_t) SMP_STACK_DELTA_ERROR_CODE; + delta = (STARS_sval_t) SMP_STACK_DELTA_ERROR_CODE; } } } @@ -1409,7 +1414,7 @@ void SMPRegTransfer::EmitSPARKAda(FILE *OutFile) { STARSOpndTypePtr LeftOp = this->GetLeftOperandNoNorm(); uint16_t LeftByteWidth = LeftOp->GetByteWidth(); bool MemWrite = LeftOp->IsMemOp(); - bool SubregWrite = (LeftOp->IsRegOp() && (STARS_ISA_Bytewidth > LeftByteWidth)); + bool SubregWrite = (LeftOp->IsRegOp() && (global_STARS_program->GetSTARS_ISA_Bytewidth() > LeftByteWidth)); bool OperatorIsProcCall = false; bool PrefixUnaryOperator = false; bool UseFP = this->ParentInst->GetBlock()->GetFunc()->UsesFramePointer(); @@ -1514,9 +1519,9 @@ void SMPRTL::Dump(void) const { } // end of SMPRTL::Dump() // Accumulate stack pointer alteration total across all RTs. -sval_t SMPRTL::TotalStackPointerAlteration(bool IsLeaveInstr, sval_t IncomingDelta, sval_t FramePtrDelta) { - sval_t TotalDelta = 0; - sval_t IncrementalDelta; +STARS_sval_t SMPRTL::TotalStackPointerAlteration(bool IsLeaveInstr, STARS_sval_t IncomingDelta, STARS_sval_t FramePtrDelta) { + STARS_sval_t TotalDelta = 0; + STARS_sval_t IncrementalDelta; for (std::size_t index = 0; index < this->RTCount; ++index) { IncrementalDelta = this->RTvector[index]->ComputeStackPointerAlteration(IsLeaveInstr, IncomingDelta, FramePtrDelta); @@ -1706,8 +1711,8 @@ STARSOpndTypePtr SMPInstr::GetMoveSource(void) { STARSOpndTypePtr SMPInstr::GetUseOnlyAddSubOp(void) const { unsigned short opcode = this->GetIDAOpcode(); - bool IsAddSubInst = ((NN_adc == opcode) || (NN_add == opcode) || (NN_inc == opcode) - || (NN_dec == opcode) || (NN_sbb == opcode) || (NN_sub == opcode)); + bool IsAddSubInst = ((STARS_NN_adc == opcode) || (STARS_NN_add == opcode) || (STARS_NN_inc == opcode) + || (STARS_NN_dec == opcode) || (STARS_NN_sbb == opcode) || (STARS_NN_sub == opcode)); if ((this->RTL.GetCount() < 1) || (!IsAddSubInst)) return this->STARSInstPtr->MakeVoidOpnd(); // no RTL or not an addition or subtraction @@ -1716,7 +1721,7 @@ STARSOpndTypePtr SMPInstr::GetUseOnlyAddSubOp(void) const { STARSOpndTypePtr RightOp = nullptr; #if SMP_BUILD_SPECIAL_ADC_SBB_RTL - if ((NN_adc != opcode) && (NN_sbb != opcode)) { + if ((STARS_NN_adc != opcode) && (STARS_NN_sbb != opcode)) { assert(!(RightTree->HasRightSubTree())); RightOp = RightTree->GetRightOperand(); // Src (non-DEF) operand } @@ -1738,8 +1743,8 @@ STARSOpndTypePtr SMPInstr::GetUseOnlyAddSubOp(void) const { STARSOpndTypePtr SMPInstr::GetDefUseAddSubOp(void) const { unsigned short opcode = this->GetIDAOpcode(); - bool IsAddSubInst = ((NN_adc == opcode) || (NN_add == opcode) || (NN_inc == opcode) - || (NN_dec == opcode) || (NN_sbb == opcode) || (NN_sub == opcode)); + bool IsAddSubInst = ((STARS_NN_adc == opcode) || (STARS_NN_add == opcode) || (STARS_NN_inc == opcode) + || (STARS_NN_dec == opcode) || (STARS_NN_sbb == opcode) || (STARS_NN_sub == opcode)); if ((this->RTL.GetCount() < 1) || (!IsAddSubInst)) return this->STARSInstPtr->MakeVoidOpnd(); // no RTL or not an addition or subtraction @@ -1824,7 +1829,7 @@ set<DefOrUse, LessDefUse>::iterator SMPInstr::GetPointerAddressReg(STARSOpndType MDExtractAddressFields(MemOp, BaseReg, IndexReg, ScaleFactor, displacement); - if ((R_none != BaseReg) && (!MDIsStackPtrReg(BaseReg, UseFP))) { + if ((STARS_x86_R_none != BaseReg) && (!MDIsStackPtrReg(BaseReg, UseFP))) { STARSOpndTypePtr BaseOp = this->STARSInstPtr->MakeRegOpnd((uint16_t) BaseReg); PtrIter = this->FindUse(BaseOp); assert(PtrIter != this->GetLastUse()); @@ -1832,7 +1837,7 @@ set<DefOrUse, LessDefUse>::iterator SMPInstr::GetPointerAddressReg(STARSOpndType return PtrIter; } } - if ((R_none != IndexReg) && (!MDIsStackPtrReg(IndexReg, UseFP))) { + if ((STARS_x86_R_none != IndexReg) && (!MDIsStackPtrReg(IndexReg, UseFP))) { STARSOpndTypePtr IndexOp = this->STARSInstPtr->MakeRegOpnd((uint16_t) IndexReg); PtrIter = this->FindUse(IndexOp); assert(PtrIter != this->GetLastUse()); @@ -1879,7 +1884,7 @@ void SMPInstr::SetAddSubSourceType(void) { STARSOpndTypePtr RightOp = nullptr; STARSOpndTypePtr LeftOp = RightTree->GetLeftOperand(); // Use (also DEF) operand #if SMP_BUILD_SPECIAL_ADC_SBB_RTL - if ((NN_adc != opcode) && (NN_sbb != opcode)) { + if ((STARS_NN_adc != opcode) && (STARS_NN_sbb != opcode)) { assert(!(RightTree->HasRightSubTree())); RightOp = RightTree->GetRightOperand(); // Src (non-DEF) operand } @@ -1922,7 +1927,7 @@ bool SMPInstr::AllDefsNumeric(void) { for (CurrDef = this->GetFirstDef(); CurrDef != this->GetLastDef(); ++CurrDef) { // We ignore the stack pointer for pop instructions and consider only // the register DEF of the pop. - if (this->MDIsPopInstr() && CurrDef->GetOp()->MatchesReg(R_sp)) + if (this->MDIsPopInstr() && CurrDef->GetOp()->MatchesReg(STARS_x86_R_sp)) continue; AllNumeric = (AllNumeric && IsNumeric(CurrDef->GetType())); } @@ -2062,7 +2067,7 @@ char * SMPInstr::DestString(int OptType) { continue; // We want to ignore the stack pointer DEF for pops and just include // the register DEF for the pop. - if (DefOpnd->MatchesReg(R_sp) && this->MDIsPopInstr()) + if (DefOpnd->MatchesReg(STARS_x86_R_sp) && this->MDIsPopInstr()) continue; if (DefOpnd->IsRegOp()) { uint16_t DestReg = DefOpnd->GetReg(); @@ -2115,7 +2120,7 @@ void SMPInstr::MDEmitSPARKAdaStringOperation(FILE *OutFile) { bool HasRepeatNEQPrefix = this->STARSInstPtr->HasRepeatIfNotEqualPrefix(); uint16_t opcode = this->GetIDAOpcode(); - if (opcode == NN_cmps) { + if (opcode == STARS_NN_cmps) { PrintSPARKIndentTabs(OutFile); SMP_fprintf(OutFile, " "); if (HasRepeatEQPrefix) { @@ -2126,7 +2131,7 @@ void SMPInstr::MDEmitSPARKAdaStringOperation(FILE *OutFile) { } SMP_fprintf(OutFile, "cmpsb;\n"); // procedure call } - else if (opcode == NN_scas) { + else if (opcode == STARS_NN_scas) { PrintSPARKIndentTabs(OutFile); SMP_fprintf(OutFile, " "); if (HasRepeatEQPrefix) { @@ -2137,7 +2142,7 @@ void SMPInstr::MDEmitSPARKAdaStringOperation(FILE *OutFile) { } SMP_fprintf(OutFile, "scasb;\n"); // procedure call } - else { // don't expect to see port I/O opcodes NN_ins or NN_outs yet. + else { // don't expect to see port I/O opcodes STARS_NN_ins or STARS_NN_outs yet. SMP_fprintf(OutFile, "ERROR: Unknown string opcode at %llx\n", (unsigned long long) this->GetAddr()); } @@ -2150,8 +2155,8 @@ void SMPInstr::MDEmitSPARKAdaCompareOrTest(FILE *OutFile) { uint16_t opcode = this->GetIDAOpcode(); bool EmitCarryFlag = false; // no carry flag for test; but yes for compare bool EmitOverflowFlag = false; // no overflow flag for test; but yes for compare - bool BitwiseAndOperation = (NN_test == opcode); - bool SubtractionOperation = (NN_cmp == opcode); + bool BitwiseAndOperation = (STARS_NN_test == opcode); + bool SubtractionOperation = (STARS_NN_cmp == opcode); bool UseFP = this->GetBlock()->GetFunc()->UsesFramePointer(); assert(BitwiseAndOperation || SubtractionOperation); @@ -2242,7 +2247,7 @@ void SMPInstr::MDEmitSPARKAdaSetCondCodeIntoReg(FILE *OutFile) { SMPRegTransfer *CurrRT = this->RTL.GetRT(0); STARSOpndTypePtr LeftOp = CurrRT->GetLeftOperandNoNorm(); std::size_t LeftOpndByteWidth = LeftOp->GetByteWidth(); - bool LeftSubwordWidth = (STARS_ISA_Bytewidth > LeftOpndByteWidth); + bool LeftSubwordWidth = (global_STARS_program->GetSTARS_ISA_Bytewidth() > LeftOpndByteWidth); bool UseFP = this->GetBlock()->GetFunc()->UsesFramePointer(); // We will produce conditional assignments, Ada 2012 style: @@ -2262,81 +2267,81 @@ void SMPInstr::MDEmitSPARKAdaSetCondCodeIntoReg(FILE *OutFile) { uint16_t opcode = this->GetIDAOpcode(); switch (opcode) { - case NN_seta: // Set Byte if Above (CF=0 & ZF=0) - case NN_setnbe: // Set Byte if Not Below or Equal (CF=0 & ZF=0) + case STARS_NN_seta: // Set Byte if Above (CF=0 & ZF=0) + case STARS_NN_setnbe: // Set Byte if Not Below or Equal (CF=0 & ZF=0) SMP_fprintf(OutFile, "(not (X86.CarryFlag or X86.ZeroFlag))"); break; - case NN_setae: // Set Byte if Above or Equal (CF=0) - case NN_setnb: // Set Byte if Not Below (CF=0) - case NN_setnc: // Set Byte if Not Carry (CF=0) + case STARS_NN_setae: // Set Byte if Above or Equal (CF=0) + case STARS_NN_setnb: // Set Byte if Not Below (CF=0) + case STARS_NN_setnc: // Set Byte if Not Carry (CF=0) SMP_fprintf(OutFile, "(not X86.CarryFlag)"); break; - case NN_setb: // Set Byte if Below (CF=1) - case NN_setc: // Set Byte if Carry (CF=1) - case NN_setnae: // Set Byte if Not Above or Equal (CF=1) + case STARS_NN_setb: // Set Byte if Below (CF=1) + case STARS_NN_setc: // Set Byte if Carry (CF=1) + case STARS_NN_setnae: // Set Byte if Not Above or Equal (CF=1) SMP_fprintf(OutFile, "(X86.CarryFlag)"); break; - case NN_setbe: // Set Byte if Below or Equal (CF=1 | ZF=1) - case NN_setna: // Set Byte if Not Above (CF=1 | ZF=1) + case STARS_NN_setbe: // Set Byte if Below or Equal (CF=1 | ZF=1) + case STARS_NN_setna: // Set Byte if Not Above (CF=1 | ZF=1) SMP_fprintf(OutFile, "(X86.CarryFlag or X86.ZeroFlag)"); break; - case NN_sete: // Set Byte if Equal (ZF=1) - case NN_setz: // Set Byte if Zero (ZF=1) + case STARS_NN_sete: // Set Byte if Equal (ZF=1) + case STARS_NN_setz: // Set Byte if Zero (ZF=1) SMP_fprintf(OutFile, "(X86.ZeroFlag)"); break; - case NN_setg: // Set Byte if Greater (ZF=0 & SF=OF) - case NN_setnle: // Set Byte if Not Less or Equal (ZF=0 & SF=OF) + case STARS_NN_setg: // Set Byte if Greater (ZF=0 & SF=OF) + case STARS_NN_setnle: // Set Byte if Not Less or Equal (ZF=0 & SF=OF) SMP_fprintf(OutFile, "((not X86.ZeroFlag) and then (X86.SignFlag = X86.OverflowFlag))"); break; - case NN_setge: // Set Byte if Greater or Equal (SF=OF) - case NN_setnl: // Set Byte if Not Less (SF=OF) + case STARS_NN_setge: // Set Byte if Greater or Equal (SF=OF) + case STARS_NN_setnl: // Set Byte if Not Less (SF=OF) SMP_fprintf(OutFile, "(X86.SignFlag = X86.OverflowFlag)"); break; - case NN_setl: // Set Byte if Less (SF!=OF) - case NN_setnge: // Set Byte if Not Greater or Equal (ZF=1) + case STARS_NN_setl: // Set Byte if Less (SF!=OF) + case STARS_NN_setnge: // Set Byte if Not Greater or Equal (ZF=1) SMP_fprintf(OutFile, "(X86.SignFlag /= X86.OverflowFlag)"); break; - case NN_setle: // Set Byte if Less or Equal (ZF=1 | SF!=OF) - case NN_setng: // Set Byte if Not Greater (ZF=1 | SF!=OF) + case STARS_NN_setle: // Set Byte if Less or Equal (ZF=1 | SF!=OF) + case STARS_NN_setng: // Set Byte if Not Greater (ZF=1 | SF!=OF) SMP_fprintf(OutFile, "(X86.ZeroFlag or (X86.SignFlag /= X86.OverflowFlag))"); break; - case NN_setne: // Set Byte if Not Equal (ZF=0) - case NN_setnz: // Set Byte if Not Zero (ZF=0) + case STARS_NN_setne: // Set Byte if Not Equal (ZF=0) + case STARS_NN_setnz: // Set Byte if Not Zero (ZF=0) SMP_fprintf(OutFile, "(not X86.ZeroFlag)"); break; - case NN_setno: // Set Byte if Not Overflow (OF=0) + case STARS_NN_setno: // Set Byte if Not Overflow (OF=0) SMP_fprintf(OutFile, "(not X86.OverflowFlag)"); break; - case NN_setnp: // Set Byte if Not Parity (PF=0) - case NN_setpo: // Set Byte if Parity Odd (PF=0) + case STARS_NN_setnp: // Set Byte if Not Parity (PF=0) + case STARS_NN_setpo: // Set Byte if Parity Odd (PF=0) SMP_fprintf(OutFile, "(not X86.ParityFlag)"); break; - case NN_setns: // Set Byte if Not Sign (SF=0) + case STARS_NN_setns: // Set Byte if Not Sign (SF=0) SMP_fprintf(OutFile, "(not X86.SignFlag)"); break; - case NN_seto: // Set Byte if Overflow (OF=1) + case STARS_NN_seto: // Set Byte if Overflow (OF=1) SMP_fprintf(OutFile, "(X86.OverflowFlag)"); break; - case NN_setp: // Set Byte if Parity (PF=1) - case NN_setpe: // Set Byte if Parity Even (PF=1) + case STARS_NN_setp: // Set Byte if Parity (PF=1) + case STARS_NN_setpe: // Set Byte if Parity Even (PF=1) SMP_fprintf(OutFile, "(X86.ParityFlag)"); break; - case NN_sets: // Set Byte if Sign (SF=1) + case STARS_NN_sets: // Set Byte if Sign (SF=1) SMP_fprintf(OutFile, "(X86.SignFlag)"); break; @@ -2358,109 +2363,109 @@ void SMPInstr::MDEmitSPARKAdaSetCondCodeIntoReg(FILE *OutFile) { void SMPInstr::MDEmitSPARKAdaCondition(FILE *OutFile) { uint16_t opcode = this->GetIDAOpcode(); switch (opcode) { - case NN_ja: // Jump if Above (CF=0 & ZF=0) - case NN_jnbe: // Jump if Not Below or Equal (CF=0 & ZF=0) - case NN_cmova: // Move if Above (CF=0 & ZF=0) + case STARS_NN_ja: // Jump if Above (CF=0 & ZF=0) + case STARS_NN_jnbe: // Jump if Not Below or Equal (CF=0 & ZF=0) + case STARS_NN_cmova: // Move if Above (CF=0 & ZF=0) SMP_fprintf(OutFile, "(not (X86.CarryFlag or X86.ZeroFlag))"); break; - case NN_jae: // Jump if Above or Equal (CF=0) - case NN_jnb: // Jump if Not Below (CF=0) - case NN_jnc: // Jump if Not Carry (CF=0) - case NN_cmovnb: // Move if Not Below (CF=0) + case STARS_NN_jae: // Jump if Above or Equal (CF=0) + case STARS_NN_jnb: // Jump if Not Below (CF=0) + case STARS_NN_jnc: // Jump if Not Carry (CF=0) + case STARS_NN_cmovnb: // Move if Not Below (CF=0) SMP_fprintf(OutFile, "(not X86.CarryFlag)"); break; - case NN_jb: // Jump if Below (CF=1) - case NN_jc: // Jump if Carry (CF=1) - case NN_jnae: // Jump if Not Above or Equal (CF=1) - case NN_cmovb: // Move if Below (CF=1) + case STARS_NN_jb: // Jump if Below (CF=1) + case STARS_NN_jc: // Jump if Carry (CF=1) + case STARS_NN_jnae: // Jump if Not Above or Equal (CF=1) + case STARS_NN_cmovb: // Move if Below (CF=1) SMP_fprintf(OutFile, "(X86.CarryFlag)"); break; - case NN_jbe: // Jump if Below or Equal (CF=1 | ZF=1) - case NN_jna: // Jump if Not Above (CF=1 | ZF=1) - case NN_cmovbe: // Move if Below or Equal (CF=1 | ZF=1) + case STARS_NN_jbe: // Jump if Below or Equal (CF=1 | ZF=1) + case STARS_NN_jna: // Jump if Not Above (CF=1 | ZF=1) + case STARS_NN_cmovbe: // Move if Below or Equal (CF=1 | ZF=1) SMP_fprintf(OutFile, "(X86.CarryFlag or X86.ZeroFlag)"); break; - case NN_jcxz: // Jump if CX is 0 + case STARS_NN_jcxz: // Jump if CX is 0 SMP_fprintf(OutFile, "(X86.CX = 0)"); break; - case NN_jecxz: // Jump if ECX is 0 + case STARS_NN_jecxz: // Jump if ECX is 0 SMP_fprintf(OutFile, "(X86.ECX = 0)"); break; - case NN_jrcxz: // Jump if RCX is 0 + case STARS_NN_jrcxz: // Jump if RCX is 0 SMP_fprintf(OutFile, "(X86.RCX = 0)"); break; - case NN_je: // Jump if Equal (ZF=1) - case NN_jz: // Jump if Zero (ZF=1) - case NN_cmovz: // Move if Zero (ZF=1) + case STARS_NN_je: // Jump if Equal (ZF=1) + case STARS_NN_jz: // Jump if Zero (ZF=1) + case STARS_NN_cmovz: // Move if Zero (ZF=1) SMP_fprintf(OutFile, "(X86.ZeroFlag)"); break; - case NN_jg: // Jump if Greater (ZF=0 & SF=OF) - case NN_jnle: // Jump if Not Less or Equal (ZF=0 & SF=OF) - case NN_cmovg: // Move if Greater (ZF=0 & SF=OF) + case STARS_NN_jg: // Jump if Greater (ZF=0 & SF=OF) + case STARS_NN_jnle: // Jump if Not Less or Equal (ZF=0 & SF=OF) + case STARS_NN_cmovg: // Move if Greater (ZF=0 & SF=OF) SMP_fprintf(OutFile, "((not X86.ZeroFlag) and then (X86.SignFlag = X86.OverflowFlag))"); break; - case NN_jge: // Jump if Greater or Equal (SF=OF) - case NN_jnl: // Jump if Not Less (SF=OF) - case NN_cmovge: // Move if Greater or Equal (SF=OF) + case STARS_NN_jge: // Jump if Greater or Equal (SF=OF) + case STARS_NN_jnl: // Jump if Not Less (SF=OF) + case STARS_NN_cmovge: // Move if Greater or Equal (SF=OF) SMP_fprintf(OutFile, "(X86.SignFlag = X86.OverflowFlag)"); break; - case NN_jl: // Jump if Less (SF!=OF) - case NN_jnge: // Jump if Not Greater or Equal (SF!=OF) - case NN_cmovl: // Move if Less (SF!=OF) + case STARS_NN_jl: // Jump if Less (SF!=OF) + case STARS_NN_jnge: // Jump if Not Greater or Equal (SF!=OF) + case STARS_NN_cmovl: // Move if Less (SF!=OF) SMP_fprintf(OutFile, "(X86.SignFlag /= X86.OverflowFlag)"); break; - case NN_jle: // Jump if Less or Equal (ZF=1 | SF!=OF) - case NN_jng: // Jump if Not Greater (ZF=1 | SF!=OF) - case NN_cmovle: // Move if Less or Equal (ZF=1 | SF!=OF) + case STARS_NN_jle: // Jump if Less or Equal (ZF=1 | SF!=OF) + case STARS_NN_jng: // Jump if Not Greater (ZF=1 | SF!=OF) + case STARS_NN_cmovle: // Move if Less or Equal (ZF=1 | SF!=OF) SMP_fprintf(OutFile, "(X86.ZeroFlag or (X86.SignFlag /= X86.OverflowFlag))"); break; - case NN_jne: // Jump if Not Equal (ZF=0) - case NN_jnz: // Jump if Not Zero (ZF=0) - case NN_cmovnz: // Move if Not Zero (ZF=0) + case STARS_NN_jne: // Jump if Not Equal (ZF=0) + case STARS_NN_jnz: // Jump if Not Zero (ZF=0) + case STARS_NN_cmovnz: // Move if Not Zero (ZF=0) SMP_fprintf(OutFile, "(not X86.ZeroFlag)"); break; - case NN_jno: // Jump if Not Overflow (OF=0) - case NN_cmovno: // Move if Not Overflow (OF=0) + case STARS_NN_jno: // Jump if Not Overflow (OF=0) + case STARS_NN_cmovno: // Move if Not Overflow (OF=0) SMP_fprintf(OutFile, "(not X86.OverflowFlag)"); break; - case NN_jnp: // Jump if Not Parity (PF=0) - case NN_jpo: // Jump if Parity Odd (PF=0) - case NN_cmovnp: // Move if Not Parity (PF=0) + case STARS_NN_jnp: // Jump if Not Parity (PF=0) + case STARS_NN_jpo: // Jump if Parity Odd (PF=0) + case STARS_NN_cmovnp: // Move if Not Parity (PF=0) SMP_fprintf(OutFile, "(not X86.ParityFlag)"); break; - case NN_jns: // Jump if Not Sign (SF=0) - case NN_cmovns: // Move if Not Sign (SF=0) + case STARS_NN_jns: // Jump if Not Sign (SF=0) + case STARS_NN_cmovns: // Move if Not Sign (SF=0) SMP_fprintf(OutFile, "(not X86.SignFlag)"); break; - case NN_jo: // Jump if Overflow (OF=1) - case NN_cmovo: // Move if Overflow (OF=1) + case STARS_NN_jo: // Jump if Overflow (OF=1) + case STARS_NN_cmovo: // Move if Overflow (OF=1) SMP_fprintf(OutFile, "(X86.OverflowFlag)"); break; - case NN_jp: // Jump if Parity (PF=1) - case NN_jpe: // Jump if Parity Even (PF=1) - case NN_cmovp: // Move if Parity (PF=1) + case STARS_NN_jp: // Jump if Parity (PF=1) + case STARS_NN_jpe: // Jump if Parity Even (PF=1) + case STARS_NN_cmovp: // Move if Parity (PF=1) SMP_fprintf(OutFile, "(X86.ParityFlag)"); break; - case NN_js: // Jump if Sign (SF=1) - case NN_cmovs: // Move if Sign (SF=1) + case STARS_NN_js: // Jump if Sign (SF=1) + case STARS_NN_cmovs: // Move if Sign (SF=1) SMP_fprintf(OutFile, "(X86.SignFlag)"); break; @@ -2475,93 +2480,93 @@ void SMPInstr::MDEmitSPARKAdaCondition(FILE *OutFile) { void SMPInstr::MDEmitSPARKAdaInvertedCondition(FILE *OutFile) { uint16_t opcode = this->GetIDAOpcode(); switch (opcode) { - case NN_ja: // Jump if Above (CF=0 & ZF=0) - case NN_jnbe: // Jump if Not Below or Equal (CF=0 & ZF=0) + case STARS_NN_ja: // Jump if Above (CF=0 & ZF=0) + case STARS_NN_jnbe: // Jump if Not Below or Equal (CF=0 & ZF=0) SMP_fprintf(OutFile, "(X86.CarryFlag or X86.ZeroFlag)"); break; - case NN_jae: // Jump if Above or Equal (CF=0) - case NN_jnb: // Jump if Not Below (CF=0) - case NN_jnc: // Jump if Not Carry (CF=0) + case STARS_NN_jae: // Jump if Above or Equal (CF=0) + case STARS_NN_jnb: // Jump if Not Below (CF=0) + case STARS_NN_jnc: // Jump if Not Carry (CF=0) SMP_fprintf(OutFile, "(X86.CarryFlag)"); break; - case NN_jb: // Jump if Below (CF=1) - case NN_jc: // Jump if Carry (CF=1) - case NN_jnae: // Jump if Not Above or Equal (CF=1) + case STARS_NN_jb: // Jump if Below (CF=1) + case STARS_NN_jc: // Jump if Carry (CF=1) + case STARS_NN_jnae: // Jump if Not Above or Equal (CF=1) SMP_fprintf(OutFile, "(not X86.CarryFlag)"); break; - case NN_jbe: // Jump if Below or Equal (CF=1 | ZF=1) - case NN_jna: // Jump if Not Above (CF=1 | ZF=1) + case STARS_NN_jbe: // Jump if Below or Equal (CF=1 | ZF=1) + case STARS_NN_jna: // Jump if Not Above (CF=1 | ZF=1) SMP_fprintf(OutFile, "(not (X86.CarryFlag or X86.ZeroFlag))"); break; - case NN_jcxz: // Jump if CX is 0 + case STARS_NN_jcxz: // Jump if CX is 0 SMP_fprintf(OutFile, "(X86.CX /= 0)"); break; - case NN_jecxz: // Jump if ECX is 0 + case STARS_NN_jecxz: // Jump if ECX is 0 SMP_fprintf(OutFile, "(X86.ECX /= 0)"); break; - case NN_jrcxz: // Jump if RCX is 0 + case STARS_NN_jrcxz: // Jump if RCX is 0 SMP_fprintf(OutFile, "(X86.RCX /= 0)"); break; - case NN_je: // Jump if Equal (ZF=1) - case NN_jz: // Jump if Zero (ZF=1) + case STARS_NN_je: // Jump if Equal (ZF=1) + case STARS_NN_jz: // Jump if Zero (ZF=1) SMP_fprintf(OutFile, "(not X86.ZeroFlag)"); break; - case NN_jg: // Jump if Greater (ZF=0 & SF=OF) - case NN_jnle: // Jump if Not Less or Equal (ZF=0 & SF=OF) + case STARS_NN_jg: // Jump if Greater (ZF=0 & SF=OF) + case STARS_NN_jnle: // Jump if Not Less or Equal (ZF=0 & SF=OF) SMP_fprintf(OutFile, "(X86.ZeroFlag or (X86.SignFlag /= X86.OverflowFlag))"); break; - case NN_jge: // Jump if Greater or Equal (SF=OF) - case NN_jnl: // Jump if Not Less (SF=OF) + case STARS_NN_jge: // Jump if Greater or Equal (SF=OF) + case STARS_NN_jnl: // Jump if Not Less (SF=OF) SMP_fprintf(OutFile, "(X86.SignFlag /= X86.OverflowFlag)"); break; - case NN_jl: // Jump if Less (SF!=OF) - case NN_jnge: // Jump if Not Greater or Equal (SF!=OF) + case STARS_NN_jl: // Jump if Less (SF!=OF) + case STARS_NN_jnge: // Jump if Not Greater or Equal (SF!=OF) SMP_fprintf(OutFile, "(X86.SignFlag = X86.OverflowFlag)"); break; - case NN_jle: // Jump if Less or Equal (ZF=1 | SF!=OF) - case NN_jng: // Jump if Not Greater (ZF=1 | SF!=OF) + case STARS_NN_jle: // Jump if Less or Equal (ZF=1 | SF!=OF) + case STARS_NN_jng: // Jump if Not Greater (ZF=1 | SF!=OF) SMP_fprintf(OutFile, "((not X86.ZeroFlag) and (X86.SignFlag = X86.OverflowFlag))"); break; - case NN_jne: // Jump if Not Equal (ZF=0) - case NN_jnz: // Jump if Not Zero (ZF=0) + case STARS_NN_jne: // Jump if Not Equal (ZF=0) + case STARS_NN_jnz: // Jump if Not Zero (ZF=0) SMP_fprintf(OutFile, "(X86.ZeroFlag)"); break; - case NN_jno: // Jump if Not Overflow (OF=0) + case STARS_NN_jno: // Jump if Not Overflow (OF=0) SMP_fprintf(OutFile, "(X86.OverflowFlag)"); break; - case NN_jnp: // Jump if Not Parity (PF=0) - case NN_jpo: // Jump if Parity Odd (PF=0) + case STARS_NN_jnp: // Jump if Not Parity (PF=0) + case STARS_NN_jpo: // Jump if Parity Odd (PF=0) SMP_fprintf(OutFile, "(X86.ParityFlag)"); break; - case NN_jns: // Jump if Not Sign (SF=0) + case STARS_NN_jns: // Jump if Not Sign (SF=0) SMP_fprintf(OutFile, "(X86.SignFlag)"); break; - case NN_jo: // Jump if Overflow (OF=1) + case STARS_NN_jo: // Jump if Overflow (OF=1) SMP_fprintf(OutFile, "(not X86.OverflowFlag)"); break; - case NN_jp: // Jump if Parity (PF=1) - case NN_jpe: // Jump if Parity Even (PF=1) + case STARS_NN_jp: // Jump if Parity (PF=1) + case STARS_NN_jpe: // Jump if Parity Even (PF=1) SMP_fprintf(OutFile, "(not X86.ParityFlag)"); break; - case NN_js: // Jump if Sign (SF=1) + case STARS_NN_js: // Jump if Sign (SF=1) SMP_fprintf(OutFile, "(not X86.SignFlag)"); break; @@ -2588,6 +2593,7 @@ void SMPInstr::EmitSPARKAda(FILE *OutFile) { SMPitype CurrDataFlowType = this->GetDataFlowType(); std::string FuncTarget; STARS_ea_t NextAddr; + std::size_t STARS_ISA_Bitwidth = global_STARS_program->GetSTARS_ISA_Bitwidth(); // Detect start of a loop. if (this->IsFirstInBlock()) { @@ -2633,9 +2639,9 @@ void SMPInstr::EmitSPARKAda(FILE *OutFile) { NextAddr = InstAddr + (STARS_ea_t) this->GetSize(); PrintSPARKIndentTabs(OutFile); SMP_fprintf(OutFile, " X86.WriteMem%d(Unsigned%d(X86.RSP - %d), %llx );\n", STARS_ISA_Bitwidth, STARS_ISA_Bitwidth, - STARS_ISA_Bytewidth, (unsigned long long) NextAddr); + global_STARS_program->GetSTARS_ISA_Bytewidth(), (unsigned long long) NextAddr); PrintSPARKIndentTabs(OutFile); - SMP_fprintf(OutFile, " X86.RSP := X86.RSP - %d;\n", STARS_ISA_Bytewidth); + SMP_fprintf(OutFile, " X86.RSP := X86.RSP - %d;\n", global_STARS_program->GetSTARS_ISA_Bytewidth()); } // Detect loop-related control flow first, then simple if-else control flow otherwise. FuncControlFlowType = this->GetBlock()->GetFunc()->GetControlFlowType(InstAddr); @@ -2729,9 +2735,9 @@ void SMPInstr::EmitSPARKAda(FILE *OutFile) { NextAddr = InstAddr + (STARS_ea_t) this->GetSize(); PrintSPARKIndentTabs(OutFile); SMP_fprintf(OutFile, " X86.WriteMem%d(Unsigned%d(X86.RSP - %d), %llu );\n", - STARS_ISA_Bitwidth, STARS_ISA_Bitwidth, STARS_ISA_Bytewidth, (unsigned long long) NextAddr); + STARS_ISA_Bitwidth, STARS_ISA_Bitwidth, global_STARS_program->GetSTARS_ISA_Bytewidth(), (unsigned long long) NextAddr); PrintSPARKIndentTabs(OutFile); - SMP_fprintf(OutFile, " X86.RSP := X86.RSP - %d;\n", STARS_ISA_Bytewidth); + SMP_fprintf(OutFile, " X86.RSP := X86.RSP - %d;\n", global_STARS_program->GetSTARS_ISA_Bytewidth()); PrintSPARKIndentTabs(OutFile); SMP_fprintf(OutFile, " %s ;\n", FuncTarget.c_str()); break; @@ -2743,7 +2749,7 @@ void SMPInstr::EmitSPARKAda(FILE *OutFile) { // We increase the stack size by 8 to swallow the return address, then // execute a SPARK Ada return instruction. PrintSPARKIndentTabs(OutFile); - SMP_fprintf(OutFile, " X86.RSP := X86.RSP + %d;\n", STARS_ISA_Bytewidth); + SMP_fprintf(OutFile, " X86.RSP := X86.RSP + %d;\n", global_STARS_program->GetSTARS_ISA_Bytewidth()); PrintSPARKIndentTabs(OutFile); SMP_fprintf(OutFile, " return;\n"); break; @@ -2826,16 +2832,16 @@ int SMPInstr::operator<=(const SMPInstr &rhs) const { return (this->GetAddr() <= rhs.GetAddr()); } -#define MD_FIRST_ENTER_INSTR NN_enterw -#define MD_LAST_ENTER_INSTR NN_enterq +#define MD_FIRST_ENTER_INSTR STARS_NN_enterw +#define MD_LAST_ENTER_INSTR STARS_NN_enterq // Is this instruction one that allocates space on the // stack for the local variables? bool SMPInstr::MDIsFrameAllocInstr(void) { // The frame allocating instruction should look like: // sub esp,48 or add esp,-64 etc. - STARSOpndTypePtr ESPOp = this->STARSInstPtr->MakeRegOpnd(R_sp); + STARSOpndTypePtr ESPOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_sp); unsigned short opcode = this->GetIDAOpcode(); - if ((opcode == NN_sub) || (opcode == NN_add)) { + if ((opcode == STARS_NN_sub) || (opcode == STARS_NN_add)) { if (this->GetLastDef() != this->Defs.FindRef(ESPOp)) { // We know that an addition or subtraction is being // performed on the stack pointer. This should not be @@ -2857,14 +2863,14 @@ bool SMPInstr::MDIsFrameAllocInstr(void) { for (CurrUse = this->GetFirstUse(); CurrUse != this->GetLastUse(); ++CurrUse) { if (CurrUse->GetOp()->IsImmedOp()) { signed long TempImm = (signed long) CurrUse->GetOp()->GetImmedValue(); - if (((0 > TempImm) && (opcode == NN_add)) - || ((0 < TempImm) && (opcode == NN_sub))) { + if (((0 > TempImm) && (opcode == STARS_NN_add)) + || ((0 < TempImm) && (opcode == STARS_NN_sub))) { return true; } } else if (CurrUse->GetOp()->IsRegOp() - && (!CurrUse->GetOp()->MatchesReg(R_sp)) // skip the ESP operand - && (opcode == NN_sub)) { // sub esp,reg: alloca() ? + && (!CurrUse->GetOp()->MatchesReg(STARS_x86_R_sp)) // skip the ESP operand + && (opcode == STARS_NN_sub)) { // sub esp,reg: alloca() ? return true; } } @@ -2876,8 +2882,8 @@ bool SMPInstr::MDIsFrameAllocInstr(void) { return false; } // end of SMPInstr::MDIsFrameAllocInstr() -#define MD_FIRST_LEAVE_INSTR NN_leavew -#define MD_LAST_LEAVE_INSTR NN_leaveq +#define MD_FIRST_LEAVE_INSTR STARS_NN_leavew +#define MD_LAST_LEAVE_INSTR STARS_NN_leaveq // Is this instruction in the epilogue the one that deallocates the local // vars region of the stack frame? bool SMPInstr::MDIsFrameDeallocInstr(bool UseFP, STARS_asize_t LocalVarsSize) { @@ -2899,11 +2905,11 @@ bool SMPInstr::MDIsFrameDeallocInstr(bool UseFP, STARS_asize_t LocalVarsSize) { // from memory operands, e.g. mov eax,[ebp-20] return false; } - else if (UseFP && (opcode == NN_mov) + else if (UseFP && (opcode == STARS_NN_mov) && (FirstDef->GetOp()->MatchesReg(MD_STACK_POINTER_REG)) && (FirstUse->GetOp()->MatchesReg(MD_FRAME_POINTER_REG))) return true; - else if ((opcode == NN_add) && (FirstDef->GetOp()->MatchesReg(MD_STACK_POINTER_REG))) { + else if ((opcode == STARS_NN_add) && (FirstDef->GetOp()->MatchesReg(MD_STACK_POINTER_REG))) { set<DefOrUse, LessDefUse>::iterator SecondUse = ++FirstUse; if (SecondUse == this->Uses.GetLastRef()) return false; // no more USEs ... strange for ADD instruction @@ -2930,9 +2936,9 @@ bool SMPInstr::MDIsNop(void) const { bool IsNop = false; unsigned short opcode = this->GetIDAOpcode(); - if ((NN_nop == opcode) || (NN_lock == opcode)) + if ((STARS_NN_nop == opcode) || (STARS_NN_lock == opcode)) IsNop = true; - else if ((NN_mov == opcode) || (NN_xchg == opcode)) { + else if ((STARS_NN_mov == opcode) || (STARS_NN_xchg == opcode)) { if (this->STARSInstPtr->GetOpnd(0)->IsRegOp() && this->STARSInstPtr->GetOpnd(1)->MatchesReg(this->STARSInstPtr->GetOpnd(0)->GetReg())) { // We have a register to register move with source == destination, @@ -2940,7 +2946,7 @@ bool SMPInstr::MDIsNop(void) const { IsNop = true; } } - else if (NN_lea == opcode) { + else if (STARS_NN_lea == opcode) { if (this->STARSInstPtr->GetOpnd(0)->IsRegOp() && (this->STARSInstPtr->GetOpnd(1)->IsMemDisplacementOp() || this->STARSInstPtr->GetOpnd(1)->IsMemNoDisplacementOp()) @@ -2949,8 +2955,8 @@ bool SMPInstr::MDIsNop(void) const { uint16_t destreg = this->STARSInstPtr->GetOpnd(0)->GetReg(); if ((this->STARSInstPtr->GetOpnd(1)->HasSIBByte()) && (destreg == (uint16_t) MD_STARS_sib_base(this->STARSInstPtr->GetOpnd(1))) - && (R_sp == MD_STARS_sib_index(this->STARSInstPtr->GetOpnd(1)))) { - // R_sp signifies no SIB index register. So, we have + && (STARS_x86_R_sp == MD_STARS_sib_index(this->STARSInstPtr->GetOpnd(1)))) { + // STARS_x86_R_sp signifies no SIB index register. So, we have // lea reg,[reg+0] with reg being the same in both place, // once as Operands[0] and once as the base reg in Operands[1]. IsNop = true; @@ -2966,73 +2972,73 @@ bool SMPInstr::MDIsNop(void) const { // Opcode always produces an UNSIGNED DEF. bool SMPInstr::MDAlwaysUnsignedDEF(void) const { unsigned short opcode = this->GetIDAOpcode(); - return ((opcode == NN_bsf) || (opcode == NN_bsr) || (opcode == NN_div) - || (opcode == NN_lahf) || (opcode == NN_lar) || (opcode == NN_lgs) - || (opcode == NN_lss) || (opcode == NN_lds) || (opcode == NN_les) - || (opcode == NN_lfs) || (opcode == NN_lsl) || (opcode == NN_movzx) - || (opcode == NN_rcl) || (opcode == NN_rcr) || (opcode == NN_rol) - || (opcode == NN_ror) || (opcode == NN_shl) || (opcode == NN_shr) - || ((opcode >= NN_seta) && (opcode <= NN_setz)) || (opcode == NN_cpuid) - || (opcode == NN_rdtsc) || (opcode == NN_rdpmc) || (opcode == NN_fstsw) - || (opcode == NN_setalc) || (opcode == NN_packuswb) || (opcode == NN_paddusb) - || (opcode == NN_paddusw) || (opcode == NN_psllw) || (opcode == NN_pslld) - || (opcode == NN_psllq) || (opcode == NN_psrlw) || (opcode == NN_psrld) - || (opcode == NN_psrlq) || (opcode == NN_psubusb) || (opcode == NN_psubusw) - || (opcode == NN_pxor) || (opcode == NN_pavgusb) || (opcode == NN_pavgb) - || (opcode == NN_pavgw) || (opcode == NN_pextrw) || (opcode == NN_pmaxub) - || ((opcode >= NN_pminub) && (opcode <= NN_psadbw)) - || (opcode == NN_movmskpd) || (opcode == NN_pmuludq) || (opcode == NN_pslldq) - || (opcode == NN_psrldq) || ((opcode >= NN_pabsb) && (opcode <= NN_pabsd)) - || (opcode == NN_rdtscp) || (opcode == NN_mpsadbw) || (opcode == NN_packusdw) - || ((opcode >= NN_pcmpeqq) && (opcode <= NN_phminposuw)) || (opcode == NN_pmaxud) - || (opcode == NN_pmaxuw) || (opcode == NN_pminud) || (opcode == NN_pminuw) - || ((opcode >= NN_pmovzxbw) && (opcode <= NN_pmovzxdq)) || ((opcode >= NN_crc32) - && (opcode <= NN_pcmpistrm)) || (opcode == NN_popcnt) || (opcode == NN_lzcnt) - || ((opcode >= NN_aesenc) && (opcode <= NN_aeskeygenassist))); + return ((opcode == STARS_NN_bsf) || (opcode == STARS_NN_bsr) || (opcode == STARS_NN_div) + || (opcode == STARS_NN_lahf) || (opcode == STARS_NN_lar) || (opcode == STARS_NN_lgs) + || (opcode == STARS_NN_lss) || (opcode == STARS_NN_lds) || (opcode == STARS_NN_les) + || (opcode == STARS_NN_lfs) || (opcode == STARS_NN_lsl) || (opcode == STARS_NN_movzx) + || (opcode == STARS_NN_rcl) || (opcode == STARS_NN_rcr) || (opcode == STARS_NN_rol) + || (opcode == STARS_NN_ror) || (opcode == STARS_NN_shl) || (opcode == STARS_NN_shr) + || ((opcode >= STARS_NN_seta) && (opcode <= STARS_NN_setz)) || (opcode == STARS_NN_cpuid) + || (opcode == STARS_NN_rdtsc) || (opcode == STARS_NN_rdpmc) || (opcode == STARS_NN_fstsw) + || (opcode == STARS_NN_setalc) || (opcode == STARS_NN_packuswb) || (opcode == STARS_NN_paddusb) + || (opcode == STARS_NN_paddusw) || (opcode == STARS_NN_psllw) || (opcode == STARS_NN_pslld) + || (opcode == STARS_NN_psllq) || (opcode == STARS_NN_psrlw) || (opcode == STARS_NN_psrld) + || (opcode == STARS_NN_psrlq) || (opcode == STARS_NN_psubusb) || (opcode == STARS_NN_psubusw) + || (opcode == STARS_NN_pxor) || (opcode == STARS_NN_pavgusb) || (opcode == STARS_NN_pavgb) + || (opcode == STARS_NN_pavgw) || (opcode == STARS_NN_pextrw) || (opcode == STARS_NN_pmaxub) + || ((opcode >= STARS_NN_pminub) && (opcode <= STARS_NN_psadbw)) + || (opcode == STARS_NN_movmskpd) || (opcode == STARS_NN_pmuludq) || (opcode == STARS_NN_pslldq) + || (opcode == STARS_NN_psrldq) || ((opcode >= STARS_NN_pabsb) && (opcode <= STARS_NN_pabsd)) + || (opcode == STARS_NN_rdtscp) || (opcode == STARS_NN_mpsadbw) || (opcode == STARS_NN_packusdw) + || ((opcode >= STARS_NN_pcmpeqq) && (opcode <= STARS_NN_phminposuw)) || (opcode == STARS_NN_pmaxud) + || (opcode == STARS_NN_pmaxuw) || (opcode == STARS_NN_pminud) || (opcode == STARS_NN_pminuw) + || ((opcode >= STARS_NN_pmovzxbw) && (opcode <= STARS_NN_pmovzxdq)) || ((opcode >= STARS_NN_crc32) + && (opcode <= STARS_NN_pcmpistrm)) || (opcode == STARS_NN_popcnt) || (opcode == STARS_NN_lzcnt) + || ((opcode >= STARS_NN_aesenc) && (opcode <= STARS_NN_aeskeygenassist))); } // end of SMPInstr::MDAlwaysUnsignedDEF() // Opcode always produces a SIGNED DEF. bool SMPInstr::MDAlwaysSignedDEF(void) const { unsigned short opcode = this->GetIDAOpcode(); - return ((opcode == NN_cbw) || (opcode == NN_cwde) || (opcode == NN_cdqe) - || (opcode == NN_cwd) || (opcode == NN_cdq) || (opcode == NN_cqo) - || (opcode == NN_idiv) || (opcode == NN_movsx) || (opcode == NN_neg) - || (opcode == NN_sal) || (opcode == NN_sar) || (opcode == NN_fist) - || (opcode == NN_fistp) || (opcode == NN_fbstp) || (opcode == NN_packsswb) - || (opcode == NN_packssdw) || (opcode == NN_paddsb) || (opcode == NN_paddsw) - || (opcode == NN_pmaddwd) || (opcode == NN_pmulhw) || (opcode == NN_pmullw) - || (opcode == NN_psraw) || (opcode == NN_psrad) || (opcode == NN_psubsb) - || (opcode == NN_psubsw) || (opcode == NN_pfadd) || (opcode == NN_pfsub) - || (opcode == NN_pfsubr) || (opcode == NN_pfacc) || (opcode == NN_pfmin) - || (opcode == NN_pfmax) || (opcode == NN_pf2id) || (opcode == NN_pfrcp) - || (opcode == NN_pfrsqrt) || (opcode == NN_pfmul) - || (opcode == NN_pfrcpit1) || (opcode == NN_pfrsqit1) || (opcode == NN_pfrcpit2) - || (opcode == NN_pmulhrw) || ((opcode >= NN_addps) && (opcode <= NN_andps)) - || ((opcode >= NN_cvtpi2ps) && (opcode <= NN_divss)) || ((opcode >= NN_maxps) - && (opcode <= NN_movlps)) || ((opcode >= NN_movss) && (opcode <= NN_sqrtss)) - || (opcode == NN_subps) || (opcode == NN_subss) || (opcode == NN_unpckhps) - || (opcode == NN_unpcklps) || (opcode == NN_pmaxsw) || (opcode == NN_pminsw) - || (opcode == NN_movntps) || (opcode == NN_pf2iw) || (opcode == NN_pfnacc) - || (opcode == NN_pfpnacc) || (opcode == NN_pi2fw) || ((opcode >= NN_addpd) - && (opcode <= NN_andpd)) || ((opcode >= NN_cvtdq2pd) && (opcode <= NN_divsd)) - || (opcode == NN_maxpd) || (opcode == NN_maxsd) || ((opcode >= NN_minpd) - && (opcode <= NN_movapd)) || (opcode == NN_movhpd) || (opcode == NN_movlpd) - || (opcode == NN_movntpd) || ((opcode >= NN_movsd) && (opcode <= NN_orpd)) - || ((opcode >= NN_sqrtpd) && (opcode <= NN_subsd)) && ((opcode >= NN_unpckhpd) - && (opcode <= NN_xorpd)) || ((opcode >= NN_movddup) && (opcode <= NN_movsxd)) - || ((opcode >= NN_addsubpd) && (opcode <= NN_hsubps)) || (opcode == NN_fisttp) - || ((opcode >= NN_psignb) && (opcode <= NN_psignd)) || ((opcode >= NN_pmulhrsw) - && (opcode <= NN_phsubd)) || (opcode == NN_pfrcpv) || (opcode == NN_pfrsqrtv) - || ((opcode >= NN_blendpd) && (opcode <= NN_insertps)) || (opcode == NN_pmaxsb) - || (opcode == NN_pmaxsd) || (opcode == NN_pminsb) || (opcode == NN_pminsd) - || ((opcode >= NN_pmovsxbw) && (opcode <= NN_pmovsxdq)) || (opcode == NN_pmuldq) - || (opcode == NN_pmulld) || ((opcode >= NN_roundpd) && (opcode <= NN_roundss)) - || (opcode == NN_movntsd) || (opcode == NN_movntss)); + return ((opcode == STARS_NN_cbw) || (opcode == STARS_NN_cwde) || (opcode == STARS_NN_cdqe) + || (opcode == STARS_NN_cwd) || (opcode == STARS_NN_cdq) || (opcode == STARS_NN_cqo) + || (opcode == STARS_NN_idiv) || (opcode == STARS_NN_movsx) || (opcode == STARS_NN_neg) + || (opcode == STARS_NN_sal) || (opcode == STARS_NN_sar) || (opcode == STARS_NN_fist) + || (opcode == STARS_NN_fistp) || (opcode == STARS_NN_fbstp) || (opcode == STARS_NN_packsswb) + || (opcode == STARS_NN_packssdw) || (opcode == STARS_NN_paddsb) || (opcode == STARS_NN_paddsw) + || (opcode == STARS_NN_pmaddwd) || (opcode == STARS_NN_pmulhw) || (opcode == STARS_NN_pmullw) + || (opcode == STARS_NN_psraw) || (opcode == STARS_NN_psrad) || (opcode == STARS_NN_psubsb) + || (opcode == STARS_NN_psubsw) || (opcode == STARS_NN_pfadd) || (opcode == STARS_NN_pfsub) + || (opcode == STARS_NN_pfsubr) || (opcode == STARS_NN_pfacc) || (opcode == STARS_NN_pfmin) + || (opcode == STARS_NN_pfmax) || (opcode == STARS_NN_pf2id) || (opcode == STARS_NN_pfrcp) + || (opcode == STARS_NN_pfrsqrt) || (opcode == STARS_NN_pfmul) + || (opcode == STARS_NN_pfrcpit1) || (opcode == STARS_NN_pfrsqit1) || (opcode == STARS_NN_pfrcpit2) + || (opcode == STARS_NN_pmulhrw) || ((opcode >= STARS_NN_addps) && (opcode <= STARS_NN_andps)) + || ((opcode >= STARS_NN_cvtpi2ps) && (opcode <= STARS_NN_divss)) || ((opcode >= STARS_NN_maxps) + && (opcode <= STARS_NN_movlps)) || ((opcode >= STARS_NN_movss) && (opcode <= STARS_NN_sqrtss)) + || (opcode == STARS_NN_subps) || (opcode == STARS_NN_subss) || (opcode == STARS_NN_unpckhps) + || (opcode == STARS_NN_unpcklps) || (opcode == STARS_NN_pmaxsw) || (opcode == STARS_NN_pminsw) + || (opcode == STARS_NN_movntps) || (opcode == STARS_NN_pf2iw) || (opcode == STARS_NN_pfnacc) + || (opcode == STARS_NN_pfpnacc) || (opcode == STARS_NN_pi2fw) || ((opcode >= STARS_NN_addpd) + && (opcode <= STARS_NN_andpd)) || ((opcode >= STARS_NN_cvtdq2pd) && (opcode <= STARS_NN_divsd)) + || (opcode == STARS_NN_maxpd) || (opcode == STARS_NN_maxsd) || ((opcode >= STARS_NN_minpd) + && (opcode <= STARS_NN_movapd)) || (opcode == STARS_NN_movhpd) || (opcode == STARS_NN_movlpd) + || (opcode == STARS_NN_movntpd) || ((opcode >= STARS_NN_movsd) && (opcode <= STARS_NN_orpd)) + || ((opcode >= STARS_NN_sqrtpd) && (opcode <= STARS_NN_subsd)) && ((opcode >= STARS_NN_unpckhpd) + && (opcode <= STARS_NN_xorpd)) || ((opcode >= STARS_NN_movddup) && (opcode <= STARS_NN_movsxd)) + || ((opcode >= STARS_NN_addsubpd) && (opcode <= STARS_NN_hsubps)) || (opcode == STARS_NN_fisttp) + || ((opcode >= STARS_NN_psignb) && (opcode <= STARS_NN_psignd)) || ((opcode >= STARS_NN_pmulhrsw) + && (opcode <= STARS_NN_phsubd)) || (opcode == STARS_NN_pfrcpv) || (opcode == STARS_NN_pfrsqrtv) + || ((opcode >= STARS_NN_blendpd) && (opcode <= STARS_NN_insertps)) || (opcode == STARS_NN_pmaxsb) + || (opcode == STARS_NN_pmaxsd) || (opcode == STARS_NN_pminsb) || (opcode == STARS_NN_pminsd) + || ((opcode >= STARS_NN_pmovsxbw) && (opcode <= STARS_NN_pmovsxdq)) || (opcode == STARS_NN_pmuldq) + || (opcode == STARS_NN_pmulld) || ((opcode >= STARS_NN_roundpd) && (opcode <= STARS_NN_roundss)) + || (opcode == STARS_NN_movntsd) || (opcode == STARS_NN_movntss)); } // end of SMPInstr::MDAlwaysSignedDEF() bool SMPInstr::MDIsAddition(void) const { unsigned short opcode = this->GetIDAOpcode(); - bool FoundAddition = ((NN_adc == opcode) || (NN_add == opcode)); + bool FoundAddition = ((STARS_NN_adc == opcode) || (STARS_NN_add == opcode)); if (this->MDIsLoadEffectiveAddressInstr()) { SMPRegTransfer *CurrRT = this->RTL.GetRT(0); @@ -3050,29 +3056,29 @@ bool SMPInstr::MDIsAddition(void) const { bool SMPInstr::MDIsOverflowingOpcode(void) const { unsigned short opcode = this->GetIDAOpcode(); - return ((NN_adc == opcode) || (NN_add == opcode) || (NN_inc == opcode) - || (NN_neg == opcode) || (NN_xadd == opcode)); + return ((STARS_NN_adc == opcode) || (STARS_NN_add == opcode) || (STARS_NN_inc == opcode) + || (STARS_NN_neg == opcode) || (STARS_NN_xadd == opcode)); } // Is non-multiply arithmetic instruction that can possibly underflow? bool SMPInstr::MDIsUnderflowingOpcode(void) const { unsigned short opcode = this->GetIDAOpcode(); - return ((NN_dec == opcode) || (NN_sbb == opcode) || (NN_sub == opcode)); + return ((STARS_NN_dec == opcode) || (STARS_NN_sbb == opcode) || (STARS_NN_sub == opcode)); } // Is potentially benign overflow instruction? bool SMPInstr::MDIsMaybeBenignOverflowOpcode(void) const { unsigned short opcode = this->GetIDAOpcode(); - return ((NN_adc == opcode) || (NN_add == opcode)); + return ((STARS_NN_adc == opcode) || (STARS_NN_add == opcode)); } // Is potentially benign underflow instruction? bool SMPInstr::MDIsMaybeBenignUnderflowOpcode(void) const { unsigned short opcode = this->GetIDAOpcode(); - return ((NN_neg == opcode) || (NN_sbb == opcode) || (NN_sub == opcode)); + return ((STARS_NN_neg == opcode) || (STARS_NN_sbb == opcode) || (STARS_NN_sub == opcode)); } // Is definitely benign underflow instruction? @@ -3084,7 +3090,7 @@ bool SMPInstr::MDIsDefiniteBenignUnderflowOpcode(int &IdiomCode) { // (Some sort of saturation? Often treated as 0 or -1, i.e. it becomes SIGNED // even if it used to be UNSIGNED.) // The "underflow" on the subtraction is irrelevant and benign. - bool benign = ((NN_sbb == opcode) && (this->SubtractsFromItself())); + bool benign = ((STARS_NN_sbb == opcode) && (this->SubtractsFromItself())); if (benign) { IdiomCode = 4; } @@ -3155,7 +3161,7 @@ bool SMPInstr::SubtractsImmedASCII(void) { #define SMP_ASCII_CARRIAGE_RETURN 13 bool SMPInstr::MDComparesImmedASCII(void) { bool ComparesToASCII = false; - if (this->GetIDAOpcode() == NN_cmp) { + if (this->GetIDAOpcode() == STARS_NN_cmp) { SMPRegTransfer *CurrRT = this->RTL.GetRT(0); if ((CurrRT != NULL) && (CurrRT->HasRightSubTree())) { CurrRT = CurrRT->GetRightTree(); @@ -3178,21 +3184,21 @@ bool SMPInstr::MDComparesImmedASCII(void) { bool SMPInstr::MDDestroysSignBit(void) const { bool SignBitDestroyed; unsigned short opcode = this->GetIDAOpcode(); - SignBitDestroyed = (NN_shl == opcode); // add more cases later. + SignBitDestroyed = (STARS_NN_shl == opcode); // add more cases later. return SignBitDestroyed; } // end of SMPInstr::MDDestroysSignBit() // Inst is cond branch depending only on zero/non-zero status, i.e. uses only the zero flag bool SMPInstr::MDIsZeroFlagCondBranch(void) const { unsigned short opcode = this->GetIDAOpcode(); - bool ZeroFlagBranch = ((opcode == NN_je) || (opcode == NN_jne) || (opcode == NN_jz) || (opcode == NN_jnz)); + bool ZeroFlagBranch = ((opcode == STARS_NN_je) || (opcode == STARS_NN_jne) || (opcode == STARS_NN_jz) || (opcode == STARS_NN_jnz)); return ZeroFlagBranch; } // end of SMPInstr::MDIsZeroFlagCondBranch() // Inst is x86 string opcode that can have a repeat prefix to make it loop. bool SMPInstr::MDIsPossibleStringLoopingOpcode(void) const { unsigned short opcode = this->GetIDAOpcode(); - bool LoopingStringOperation = ((opcode == NN_cmps) || (opcode == NN_scas) || (opcode == NN_ins) || (opcode == NN_outs)); + bool LoopingStringOperation = ((opcode == STARS_NN_cmps) || (opcode == STARS_NN_scas) || (opcode == STARS_NN_ins) || (opcode == STARS_NN_outs)); return LoopingStringOperation; } // end of SMPInstr::MDIsPossibleStringLoopingOpcode() @@ -3342,20 +3348,20 @@ bool SMPInstr::IsSetToZero(void) const { // MACHINE DEPENDENT: Is instruction a return instruction? bool SMPInstr::MDIsReturnInstr(void) const { - return ((this->GetIDAOpcode() == NN_retn) || (this->GetIDAOpcode() == NN_retf)); + return ((this->GetIDAOpcode() == STARS_NN_retn) || (this->GetIDAOpcode() == STARS_NN_retf)); } // MACHINE DEPENDENT: Is instruction a POP instruction? -#define FIRST_POP_INST NN_pop -#define LAST_POP_INST NN_popfq +#define FIRST_POP_INST STARS_NN_pop +#define LAST_POP_INST STARS_NN_popfq bool SMPInstr::MDIsPopInstr(void) const { return ((this->GetIDAOpcode() >= FIRST_POP_INST) && (this->GetIDAOpcode() <= LAST_POP_INST)); } // MACHINE DEPENDENT: Is instruction a PUSH instruction? -#define FIRST_PUSH_INST NN_push -#define LAST_PUSH_INST NN_pushfq +#define FIRST_PUSH_INST STARS_NN_push +#define LAST_PUSH_INST STARS_NN_pushfq bool SMPInstr::MDIsPushInstr(void) const { return ((this->GetIDAOpcode() >= FIRST_PUSH_INST) && (this->GetIDAOpcode() <= LAST_PUSH_INST)); @@ -3375,11 +3381,11 @@ bool SMPInstr::MDIsLeaveInstr(void) const { // MACHINE DEPENDENT: Is instruction a HALT instruction? bool SMPInstr::MDIsHaltInstr(void) const { - return (NN_hlt == this->GetIDAOpcode()); + return (STARS_NN_hlt == this->GetIDAOpcode()); } -#define MD_FIRST_COND_MOVE_INSTR NN_cmova -#define MD_LAST_COND_MOVE_INSTR NN_fcmovnu +#define MD_FIRST_COND_MOVE_INSTR STARS_NN_cmova +#define MD_LAST_COND_MOVE_INSTR STARS_NN_fcmovnu // MACHINE DEPENDENT: Is instruction a conditional move? bool SMPInstr::MDIsConditionalMoveInstr(void) const { return ((this->GetIDAOpcode() >= MD_FIRST_COND_MOVE_INSTR) @@ -3388,17 +3394,17 @@ bool SMPInstr::MDIsConditionalMoveInstr(void) const { // MACHINE DEPENDENT: Is instruction any kind of move? bool SMPInstr::MDIsMoveInstr(void) const { - return ((NN_mov == this->GetIDAOpcode()) || (NN_movsx == this->GetIDAOpcode()) - || (NN_movzx == this->GetIDAOpcode()) || this->MDIsConditionalMoveInstr()); + return ((STARS_NN_mov == this->GetIDAOpcode()) || (STARS_NN_movsx == this->GetIDAOpcode()) + || (STARS_NN_movzx == this->GetIDAOpcode()) || this->MDIsConditionalMoveInstr()); } // MACHINE DEPENDENT: Do opcode/operands definitely indicate signed arithmetic? // Generally, this is only true for certain variants of multiplication and division. bool SMPInstr::MDIsSignedArithmetic(void) const { unsigned short opcode = this->GetIDAOpcode(); - if (NN_idiv == opcode) + if (STARS_NN_idiv == opcode) return true; - if (NN_imul == opcode) { + if (STARS_NN_imul == opcode) { // If we discard the upper N bits of the multiplication result, then the // lower N bits are the same for signed and unsigned multiplication, and // gcc/g++ often use the IMUL opcode for both signed and unsigned multiplies @@ -3414,49 +3420,49 @@ bool SMPInstr::MDIsSignedArithmetic(void) const { // MACHINE DEPENDENT: Is instruction a conditional jump based on an unsigned condition? bool SMPInstr::MDIsUnsignedBranch(void) const { unsigned short opcode = this->GetIDAOpcode(); - return ((NN_ja == opcode) || (NN_jae == opcode) || (NN_jb == opcode) || (NN_jbe == opcode) - || (NN_jna == opcode) || (NN_jnae == opcode) || (NN_jnb == opcode) || (NN_jnbe == opcode)); + return ((STARS_NN_ja == opcode) || (STARS_NN_jae == opcode) || (STARS_NN_jb == opcode) || (STARS_NN_jbe == opcode) + || (STARS_NN_jna == opcode) || (STARS_NN_jnae == opcode) || (STARS_NN_jnb == opcode) || (STARS_NN_jnbe == opcode)); } // MACHINE DEPENDENT: Is instruction a conditional jump based on a signed condition? bool SMPInstr::MDIsSignedBranch(void) const { unsigned short opcode = this->GetIDAOpcode(); - return ((NN_jg == opcode) || (NN_jge == opcode) || (NN_jl == opcode) || (NN_jle == opcode) - || (NN_jng == opcode) || (NN_jnge == opcode) || (NN_jnl == opcode) || (NN_jnle == opcode) - || (NN_js == opcode) || (NN_jns == opcode)); + return ((STARS_NN_jg == opcode) || (STARS_NN_jge == opcode) || (STARS_NN_jl == opcode) || (STARS_NN_jle == opcode) + || (STARS_NN_jng == opcode) || (STARS_NN_jnge == opcode) || (STARS_NN_jnl == opcode) || (STARS_NN_jnle == opcode) + || (STARS_NN_js == opcode) || (STARS_NN_jns == opcode)); } // MACHINE DEPENDENT: Is instruction a boolean set based on an unsigned condition? bool SMPInstr::MDIsUnsignedSetValue(void) const { unsigned short opcode = this->GetIDAOpcode(); - return ((NN_seta == opcode) || (NN_setae == opcode) || (NN_setb == opcode) || (NN_setbe == opcode) - || (NN_setna == opcode) || (NN_setnae == opcode) || (NN_setnb == opcode) || (NN_setnbe == opcode)); + return ((STARS_NN_seta == opcode) || (STARS_NN_setae == opcode) || (STARS_NN_setb == opcode) || (STARS_NN_setbe == opcode) + || (STARS_NN_setna == opcode) || (STARS_NN_setnae == opcode) || (STARS_NN_setnb == opcode) || (STARS_NN_setnbe == opcode)); } // MACHINE DEPENDENT: Is instruction a boolean set based on a signed condition? bool SMPInstr::MDIsSignedSetValue(void) const { unsigned short opcode = this->GetIDAOpcode(); - return ((NN_setg == opcode) || (NN_setge == opcode) || (NN_setl == opcode) || (NN_setle == opcode) - || (NN_setng == opcode) || (NN_setnge == opcode) || (NN_setnl == opcode) || (NN_setnle == opcode) - || (NN_sets == opcode) || (NN_setns == opcode)); + return ((STARS_NN_setg == opcode) || (STARS_NN_setge == opcode) || (STARS_NN_setl == opcode) || (STARS_NN_setle == opcode) + || (STARS_NN_setng == opcode) || (STARS_NN_setnge == opcode) || (STARS_NN_setnl == opcode) || (STARS_NN_setnle == opcode) + || (STARS_NN_sets == opcode) || (STARS_NN_setns == opcode)); } // MACHINE DEPENDENT: Is instruction a boolean set based on any condition? bool SMPInstr::MDIsAnySetValue(void) const { unsigned short opcode = this->GetIDAOpcode(); - return ((NN_seta <= opcode) && (NN_setz >= opcode)); + return ((STARS_NN_seta <= opcode) && (STARS_NN_setz >= opcode)); } // MACHINE DEPENDENT: Is instruction a left shift instruction? bool SMPInstr::MDIsLeftShift(void) const { unsigned short opcode = this->GetIDAOpcode(); - return ((NN_sal == opcode) || (NN_shl == opcode)); + return ((STARS_NN_sal == opcode) || (STARS_NN_shl == opcode)); } // MACHINE DEPENDENT: Is instruction a right shift instruction? bool SMPInstr::MDIsRightShift(void) const { unsigned short opcode = this->GetIDAOpcode(); - return ((NN_sar == opcode) || (NN_shr == opcode)); + return ((STARS_NN_sar == opcode) || (STARS_NN_shr == opcode)); } // Is kind of shift or rotate that is used in hash functions @@ -3465,11 +3471,11 @@ bool SMPInstr::MDIsHashingArithmetic(void) const { bool FoundHashShift = false; unsigned short opcode = this->GetIDAOpcode(); // We are looking for shifts in the leftward direction, or rotates in either directon. - bool IsRotate = ((opcode == NN_ror) || (opcode == NN_rcr) || (opcode == NN_rcl) || (opcode == NN_rol)); + bool IsRotate = ((opcode == STARS_NN_ror) || (opcode == STARS_NN_rcr) || (opcode == STARS_NN_rcl) || (opcode == STARS_NN_rol)); if (IsRotate) { FoundHashShift = true; } - else if ((opcode == NN_shl) || (opcode == NN_shld)) { + else if ((opcode == STARS_NN_shl) || (opcode == STARS_NN_shld)) { SMPRegTransfer *CurrRT = this->RTL.GetRT(0); assert(CurrRT->HasRightSubTree()); do { // double-shift is a deeply nested RTL tree @@ -3493,7 +3499,7 @@ bool SMPInstr::MDIsHashingArithmetic(void) const { bool SMPInstr::MDIsCompareToPositiveConstant(STARSOpndTypePtr &NonConstOperand, STARS_uval_t &ConstValue) const { bool CompareToConst = false; - if (NN_cmp == this->GetIDAOpcode()) { + if (STARS_NN_cmp == this->GetIDAOpcode()) { SMPRegTransfer *CurrRT = this->RTL.GetRT(0); assert(CurrRT->HasRightSubTree()); CurrRT = CurrRT->GetRightTree(); @@ -3517,7 +3523,7 @@ bool SMPInstr::MDIsCompareToPositiveConstant(STARSOpndTypePtr &NonConstOperand, // Opcode is compare or test bool SMPInstr::MDIsCompareOrTest(void) const { - return ((NN_cmp == this->GetIDAOpcode()) || (NN_test == this->GetIDAOpcode())); + return ((STARS_NN_cmp == this->GetIDAOpcode()) || (STARS_NN_test == this->GetIDAOpcode())); } // end of SMPInstr::MDIsCompareOrTest() bool SMPInstr::IsSubtractionOfConstant(STARSOpndTypePtr &NonConstOperand, STARS_uval_t &ConstValue) const { @@ -3596,8 +3602,8 @@ bool SMPInstr::MDUsesCalleeSavedReg(void) { set<DefOrUse, LessDefUse>::iterator CurrUse; for (CurrUse = this->GetFirstUse(); CurrUse != this->GetLastUse(); ++CurrUse) { STARSOpndTypePtr CurrOp = CurrUse->GetOp(); - if (CurrOp->MatchesReg(MD_FRAME_POINTER_REG) || CurrOp->MatchesReg(R_si) - || CurrOp->MatchesReg(R_di) || CurrOp->MatchesReg(R_bx)) { + if (CurrOp->MatchesReg(MD_FRAME_POINTER_REG) || CurrOp->MatchesReg(STARS_x86_R_si) + || CurrOp->MatchesReg(STARS_x86_R_di) || CurrOp->MatchesReg(STARS_x86_R_bx)) { return true; } } @@ -3614,7 +3620,7 @@ bool SMPInstr::MDIsStackPointerCopy(bool UseFP) { if (((this->OptType == 3) || this->MDIsLoadEffectiveAddressInstr()) && this->IsAnalyzeable() && (this->GetFirstDef()->GetOp()->IsRegOp()) - && (!(this->GetFirstDef()->GetOp()->MatchesReg(R_sp))) + && (!(this->GetFirstDef()->GetOp()->MatchesReg(STARS_x86_R_sp))) && (!(this->HasSourceMemoryOperand()))) { // reg to reg move set<DefOrUse, LessDefUse>::iterator UseIter = this->GetFirstUse(); if (UseIter == this->GetLastUse()) { @@ -3662,7 +3668,7 @@ bool SMPInstr::HasAllocaRTL(void) { // register (whichever was restored), leave StackDelta alone for later computation // based on reaching definitions, and return true. // For most instructions, no save or restore of a stack pointer, so return false. -bool SMPInstr::MDIsStackPtrSaveOrRestore(bool UseFP, sval_t FPDelta, bool &Save, sval_t &StackDelta, STARSOpndTypePtr &CopyOp, bool &Error) { +bool SMPInstr::MDIsStackPtrSaveOrRestore(bool UseFP, STARS_sval_t FPDelta, bool &Save, STARS_sval_t &StackDelta, STARSOpndTypePtr &CopyOp, bool &Error) { bool StackPointerSaveOrRestore; std::size_t RTLCount = this->RTL.GetCount(); std::size_t RTLIndex; @@ -3672,7 +3678,7 @@ bool SMPInstr::MDIsStackPtrSaveOrRestore(bool UseFP, sval_t FPDelta, bool &Save, STARS_ea_t offset; SMPoperator CurrOper; bool LookUpStackDelta; // Get stack delta from reaching defs for TempOp - sval_t DeltaAdjust; // add to StackDelta after computing from reaching defs, e.g. lea esp,[ecx-4] get TempOp of ecx + STARS_sval_t DeltaAdjust; // add to StackDelta after computing from reaching defs, e.g. lea esp,[ecx-4] get TempOp of ecx // and DeltaAdjust of -4 Error = false; @@ -3794,13 +3800,13 @@ bool SMPInstr::MDIsStackPtrSaveOrRestore(bool UseFP, sval_t FPDelta, bool &Save, } else { TempOp = RightLeftOp; - DeltaAdjust = (sval_t) RightRightOp->GetImmedValue(); + DeltaAdjust = (STARS_sval_t) RightRightOp->GetImmedValue(); if (DeltaAdjust > STARS_ESP_ADDITION_OVERFLOW_THRESHOLD) { // Really a subtraction via addition of a negative, // or addition via subtraction of a negative. // E.g. add esp, 0xfffffff0 is sub esp,16 and sub esp,0xfffffff0 is add esp,16 int32_t TempDelta = (int32_t) (DeltaAdjust & 0xffffffff); - DeltaAdjust = (sval_t) TempDelta; + DeltaAdjust = (STARS_sval_t) TempDelta; } if (SMP_SUBTRACT == CurrOper) { // Negate the stack delta adjustment, e.g. lea esp,[ecx-4] needs DeltaAdjust of -4, not 4. @@ -3859,7 +3865,7 @@ bool SMPInstr::MDIsStackPtrSaveOrRestore(bool UseFP, sval_t FPDelta, bool &Save, else { MDExtractAddressFields(TempOp, BaseReg, IndexReg, Scale, offset); CopyReg = BaseReg; - bool IndexedAccess = ((R_none != BaseReg) && (R_none != IndexReg)); + bool IndexedAccess = ((STARS_x86_R_none != BaseReg) && (STARS_x86_R_none != IndexReg)); if (IndexedAccess) { StackPointerSaveOrRestore = false; // Cannot analyze indexed accesses into the stack } @@ -3869,7 +3875,7 @@ bool SMPInstr::MDIsStackPtrSaveOrRestore(bool UseFP, sval_t FPDelta, bool &Save, else { // memory expr that is not stack or frame pointer NonStackMemAccess = true; // something like [ecx] might actually turn out to be stack access - DeltaAdjust = (sval_t) TempOp->GetAddr(); // get normalized delta from addr field + DeltaAdjust = (STARS_sval_t) TempOp->GetAddr(); // get normalized delta from addr field } } @@ -3897,7 +3903,7 @@ bool SMPInstr::MDIsStackPtrSaveOrRestore(bool UseFP, sval_t FPDelta, bool &Save, // frame pointer. We need to look up the normalized stack address [esp+StackDelta] // in the StackPtrCopySet just like we did for ECX before we conclude that a // stack pointer save or restore is happening. - FindOp = this->STARSInstPtr->MakeMemDisplacementOpnd(MD_STACK_POINTER_REG, R_none, 0, (STARS_ea_t) StackDelta); + FindOp = this->STARSInstPtr->MakeMemDisplacementOpnd(MD_STACK_POINTER_REG, STARS_x86_R_none, 0, (STARS_ea_t) StackDelta); if (this->GetBlock()->GetFunc()->IsInStackPtrCopySet(FindOp)) { // Screened out time wasters that are not in copy set; now, // look up reaching defs. @@ -3941,7 +3947,7 @@ bool SMPInstr::MDIsStackPtrSaveOrRestore(bool UseFP, sval_t FPDelta, bool &Save, } // end of SMPInstr::MDIsStackPtrSaveOrRestore() // Make list of regs and their stack offsets in RTLs for any push instruction -bool SMPInstr::GetPushedRegsList(map<uint32_t, sval_t> &PushedRegs) { +bool SMPInstr::GetPushedRegsList(map<uint32_t, STARS_sval_t> &PushedRegs) { std::size_t RTLCount = this->RTL.GetCount(); std::size_t RTLIndex; STARSOpndTypePtr LeftOp = nullptr, RightOp = nullptr; @@ -3960,12 +3966,12 @@ bool SMPInstr::GetPushedRegsList(map<uint32_t, sval_t> &PushedRegs) { if (RightOp->IsRegOp()) { MDExtractAddressFields(LeftOp, BaseReg, IndexReg, Scale, offset); // Exclude indexed stack writes. - if (R_none == IndexReg) { - sval_t ESPOffset = (sval_t) offset; - map<uint32_t, sval_t>::iterator FindIter = PushedRegs.find((uint32_t) RightOp->GetReg()); + if (STARS_x86_R_none == IndexReg) { + STARS_sval_t ESPOffset = (STARS_sval_t) offset; + map<uint32_t, STARS_sval_t>::iterator FindIter = PushedRegs.find((uint32_t) RightOp->GetReg()); if (FindIter == PushedRegs.end()) { // Not already pushed earlier - pair<uint32_t, sval_t> TempPair((uint32_t) RightOp->GetReg(), ESPOffset); - pair<map<uint32_t, sval_t>::iterator, bool> InsertResult; + pair<uint32_t, STARS_sval_t> TempPair((uint32_t) RightOp->GetReg(), ESPOffset); + pair<map<uint32_t, STARS_sval_t>::iterator, bool> InsertResult; InsertResult = PushedRegs.insert(TempPair); assert(InsertResult.second); } @@ -3978,7 +3984,7 @@ bool SMPInstr::GetPushedRegsList(map<uint32_t, sval_t> &PushedRegs) { } // end of SMPInstr::GetPushedRegsList() // Make list of regs and their stack offsets in RTLs for any pop instruction -bool SMPInstr::GetPoppedRegsList(bool FirstReturnBlock, map<uint32_t, sval_t> &PoppedRegs) { +bool SMPInstr::GetPoppedRegsList(bool FirstReturnBlock, map<uint32_t, STARS_sval_t> &PoppedRegs) { std::size_t RTLCount = this->RTL.GetCount(); std::size_t RTLIndex; std::size_t IncomingSize = PoppedRegs.size(); // from return blocks already processed @@ -3999,13 +4005,13 @@ bool SMPInstr::GetPoppedRegsList(bool FirstReturnBlock, map<uint32_t, sval_t> &P if (MDIsStackAccessOpnd(RightOp, false)) { MDExtractAddressFields(RightOp, BaseReg, IndexReg, Scale, offset); // Exclude indexed stack reads. - if (R_none == IndexReg) { - sval_t ESPOffset = (sval_t) offset; - map<uint32_t, sval_t>::iterator FindIter = PoppedRegs.find((uint32_t) LeftOp->GetReg()); + if (STARS_x86_R_none == IndexReg) { + STARS_sval_t ESPOffset = (STARS_sval_t) offset; + map<uint32_t, STARS_sval_t>::iterator FindIter = PoppedRegs.find((uint32_t) LeftOp->GetReg()); if (FindIter == PoppedRegs.end()) { // Not already popped in another block if (FirstReturnBlock) { - pair<uint32_t, sval_t> TempPair((uint32_t) LeftOp->GetReg(), ESPOffset); - pair<map<uint32_t, sval_t>::iterator, bool> InsertResult; + pair<uint32_t, STARS_sval_t> TempPair((uint32_t) LeftOp->GetReg(), ESPOffset); + pair<map<uint32_t, STARS_sval_t>::iterator, bool> InsertResult; InsertResult = PoppedRegs.insert(TempPair); assert(InsertResult.second); } @@ -4050,7 +4056,7 @@ bool SMPInstr::MDFindMallocCall(STARSOpndTypePtr TargetOp) { #if SMP_VERBOSE_FIND_POINTERS SMP_msg("Found call to malloc at %x\n", this->GetAddr()); #endif - STARSOpndTypePtr SearchOp = this->STARSInstPtr->MakeRegOpnd(R_ax); + STARSOpndTypePtr SearchOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_ax); set<DefOrUse, LessDefUse>::iterator EAXDEF; EAXDEF = this->SetDefType(SearchOp, HEAPPTR); int SSANum = EAXDEF->GetSSANum(); @@ -4165,15 +4171,15 @@ void SMPInstr::Analyze(void) { if (!(this->FillCmd())) return; - unsigned short opcode = this->GetIDAOpcode(); + uint16_t opcode = this->GetIDAOpcode(); // Record what type of instruction this is, simplified for the needs // of data flow and type analysis. this->type = DFACategory[opcode]; // Record optimization category. - this->OptType = OptCategory[opcode]; + this->OptType = global_STARS_program->GetOptCategory(opcode); - if ((NN_int == opcode) || (NN_into == opcode) || (NN_int3 == opcode)) { + if ((STARS_NN_int == opcode) || (STARS_NN_into == opcode) || (STARS_NN_int3 == opcode)) { this->SetInterrupt(); } else { @@ -4184,12 +4190,12 @@ void SMPInstr::Analyze(void) { this->MDFixupIDAProOperandList(); // See if instruction is an ASM idiom for clearing a register. - if ((NN_xor == opcode) || (NN_lea == opcode)) { + if ((STARS_NN_xor == opcode) || (STARS_NN_lea == opcode)) { uint16_t FirstReg; if (this->STARSInstPtr->IsRegOpnd(0)) { FirstReg = this->STARSInstPtr->GetOpnd(0)->GetReg(); STARSOpndTypePtr SecondOpnd = this->STARSInstPtr->GetOpnd(1); - if (NN_xor == opcode) { + if (STARS_NN_xor == opcode) { // Check for xor of reg with itself if (SecondOpnd->MatchesReg(FirstReg)) { this->SetRegClearIdiom(); @@ -4202,7 +4208,7 @@ void SMPInstr::Analyze(void) { uint16_t ScaleFactor; STARS_ea_t Offset; MDExtractAddressFields(SecondOpnd, BaseReg, IndexReg, ScaleFactor, Offset); - if ((R_none == BaseReg) && (R_none == IndexReg) && (0 == Offset)) { + if ((STARS_x86_R_none == BaseReg) && (STARS_x86_R_none == IndexReg) && (0 == Offset)) { this->SetRegClearIdiom(); } } @@ -4258,8 +4264,7 @@ void SMPInstr::Analyze(void) { else if (this->GetDataFlowType() == CALL) { set<DefOrUse, LessDefUse>::iterator CurrUse; for (CurrUse = this->GetFirstUse(); CurrUse != this->GetLastUse(); ++CurrUse) { - optype_t OpType = CurrUse->GetOp()->GetOpType(); - if ((OpType == o_near) || (OpType == o_far)) { + if (CurrUse->GetOp()->IsNearPointer() || CurrUse->GetOp()->IsFarPointer()) { this->CallTarget = CurrUse->GetOp()->GetAddr(); } } @@ -4281,9 +4286,9 @@ void SMPInstr::AnalyzeMarker(void) { // Record what type of instruction this is, simplified for the needs // of data flow and type analysis. - this->type = DFACategory[NN_fnop]; + this->type = DFACategory[this->GetIDAOpcode()]; // Record optimization category. - this->OptType = OptCategory[NN_fnop]; + this->OptType = global_STARS_program->GetOptCategory(this->GetIDAOpcode()); return; } // end of SMPInstr::AnalyzeMarker() @@ -4320,9 +4325,9 @@ void SMPInstr::AnalyzeCallInst(STARS_ea_t FirstFuncAddr, STARS_ea_t LastFuncAddr return; } // end of SMPInstr::AnalyzeCallInst() -sval_t SMPInstr::AnalyzeStackPointerDelta(sval_t IncomingDelta, sval_t PreAllocDelta) { - unsigned short InstType = this->GetIDAOpcode(); - sval_t InstDelta = StackAlteration[InstType]; +STARS_sval_t SMPInstr::AnalyzeStackPointerDelta(STARS_sval_t IncomingDelta, STARS_sval_t PreAllocDelta) { + uint16_t InstType = this->GetIDAOpcode(); + STARS_sval_t InstDelta = global_STARS_program->GetStackAlteration(InstType); SMPitype FlowType = this->GetDataFlowType(); bool TailCall = this->IsTailCall(); @@ -4371,7 +4376,7 @@ sval_t SMPInstr::AnalyzeStackPointerDelta(sval_t IncomingDelta, sval_t PreAllocD } else { // We have a call target SMPFunction *CalleeFunc = this->GetBlock()->GetFunc()->GetProg()->FindFunction(CalledFuncAddr); - sval_t AdjustmentDelta; + STARS_sval_t AdjustmentDelta; if (CalleeFunc) { if (!CalleeFunc->HasSTARSStackPtrAnalysisCompleted()) { // Phase ordering issue in the call graph. A mutually recursive clique of functions has to @@ -4443,9 +4448,9 @@ sval_t SMPInstr::AnalyzeStackPointerDelta(sval_t IncomingDelta, sval_t PreAllocD // Total the stack adjustment bytes, as happens after a call to a function that leaves // outgoing args on the stack or swallows incoming args from the stack. -sval_t SMPInstr::FindStackAdjustment(void) { - unsigned short InstType = this->GetIDAOpcode(); - sval_t InstDelta = StackAlteration[InstType]; +STARS_sval_t SMPInstr::FindStackAdjustment(void) { + uint16_t InstType = this->GetIDAOpcode(); + STARS_sval_t InstDelta = global_STARS_program->GetStackAlteration(InstType); if (1 == InstDelta) { // value of 1 is trigger to investigate the RTL for the @@ -4471,7 +4476,7 @@ sval_t SMPInstr::FindStackAdjustment(void) { // FPDelta holds the stack delta (normalized) for the frame pointer. // DefOp comes in with the operand to be normalized, and contains the normalized operand upon return. // Return true if operand is a register or stack location, false otherwise (true => include in data flow analysis sets and SSA.) -bool SMPInstr::MDComputeNormalizedDataFlowOp(bool UseFP, sval_t FPDelta, STARSOpndTypePtr &DefOp) { +bool SMPInstr::MDComputeNormalizedDataFlowOp(bool UseFP, STARS_sval_t FPDelta, STARSOpndTypePtr &DefOp) { if (nullptr == DefOp) return false; @@ -4481,7 +4486,7 @@ bool SMPInstr::MDComputeNormalizedDataFlowOp(bool UseFP, sval_t FPDelta, STARSOp else if (MDIsStackAccessOpnd(DefOp, UseFP)) { STARSOpndTypePtr OldOp = DefOp->clone(); int SignedOffset = (int) DefOp->GetAddr(); - sval_t NormalizedDelta = 0; + STARS_sval_t NormalizedDelta = 0; if (DefOp->HasSIBByte()) { // We must deal with a potentially indexed memory expression. We want to @@ -4494,15 +4499,15 @@ bool SMPInstr::MDComputeNormalizedDataFlowOp(bool UseFP, sval_t FPDelta, STARSOp int BaseReg = MD_STARS_sib_base(DefOp); int IndexReg = (int) MD_STARS_sib_index(DefOp); if (X86_STACK_POINTER_REG == IndexReg) // signifies no index register - IndexReg = R_none; + IndexReg = STARS_x86_R_none; if (BaseReg == X86_STACK_POINTER_REG) { // We probably have an indexed ESP-relative operand. // We leave the sib byte alone and normalize the offset. - NormalizedDelta = this->GetStackPtrOffset() + (sval_t) SignedOffset; + NormalizedDelta = this->GetStackPtrOffset() + (STARS_sval_t) SignedOffset; } else { // Must be EBP-relative. - NormalizedDelta = FPDelta + (sval_t) SignedOffset; + NormalizedDelta = FPDelta + (STARS_sval_t) SignedOffset; // Unfortunately, when we are dealing with a SIB byte in the opcode, we cannot // just say DefOp.reg = MD_STACK_POINTER_REG to convert from the frame pointer // to the stack pointer. Instead, we have to get into the nasty machine code @@ -4545,7 +4550,7 @@ bool SMPInstr::MDComputeNormalizedDataFlowOp(bool UseFP, sval_t FPDelta, STARSOp // argument. If SignedOffset is -12, we have [ebp-12] as DefOp, and this is [esp-16] when // normalized to the entry point value of the stack pointer. In both cases, we can see that the // normalized stack delta is just FPDelta+SignedOffset. - NormalizedDelta = FPDelta + (sval_t) SignedOffset; + NormalizedDelta = FPDelta + (STARS_sval_t) SignedOffset; // Now, we simply convert the memory operand from EBP to ESP and replace the SignedOffset with the // NormalizedDelta just computed. DefOp->SetReg(MD_STACK_POINTER_REG); @@ -4558,7 +4563,7 @@ bool SMPInstr::MDComputeNormalizedDataFlowOp(bool UseFP, sval_t FPDelta, STARSOp // We only need to adjust the offset to reflect the change in the stack pointer since the function // was entered, e.g. [esp+4] is normalized to [esp-28] if the current esp value is 32 less than it // was upon function entry. We get the value "-32" in that case from a member variable. - NormalizedDelta = this->GetStackPtrOffset() + (sval_t) SignedOffset; + NormalizedDelta = this->GetStackPtrOffset() + (STARS_sval_t) SignedOffset; } DefOp->SetAddr((uintptr_t) NormalizedDelta); // common to frame and stack pointer cases this->GetBlock()->GetFunc()->UpdateMaxDirectStackAccessOffset(NormalizedDelta); // maintain record of maximum @@ -4590,7 +4595,7 @@ bool SMPInstr::MDComputeNormalizedDataFlowOp(bool UseFP, sval_t FPDelta, STARSOp // Normalize stack operands in all DEFs and USEs to have stack deltas relative to the function entry stack pointer. // Return true if any stack DEFs or USEs were normalized. -bool SMPInstr::MDNormalizeStackOps(bool UseFP, sval_t FPDelta, bool Recomputing, sval_t DeltaIncrement) { +bool SMPInstr::MDNormalizeStackOps(bool UseFP, STARS_sval_t FPDelta, bool Recomputing, STARS_sval_t DeltaIncrement) { if (!this->IsAnalyzeable()) return false; @@ -4754,7 +4759,7 @@ bool SMPInstr::MDNormalizeStackOps(bool UseFP, sval_t FPDelta, bool Recomputing, // Renormalize SP-relative stack operands in functions that call alloca() by adding DeltaIncrement to their stack displacements. // DefOp comes in with the operand to be renormalized, and contains the normalized operand upon return. // Return true if operand is a register or stack location, false otherwise (true => include in data flow analysis sets and SSA.) -bool SMPInstr::MDRecomputeNormalizedDataFlowOp(sval_t DeltaIncrement, bool UpdateMaps, STARSOpndTypePtr &DefOp) { +bool SMPInstr::MDRecomputeNormalizedDataFlowOp(STARS_sval_t DeltaIncrement, bool UpdateMaps, STARSOpndTypePtr &DefOp) { if (nullptr == DefOp) return false; @@ -4771,7 +4776,7 @@ bool SMPInstr::MDRecomputeNormalizedDataFlowOp(sval_t DeltaIncrement, bool Updat // The remaining cases are simple. The ESP-relative displacement is incremented by // DeltaIncrement, regardless of the presence of a SIB byte. int SignedOffset = (int) DefOp->GetAddr(); - sval_t NormalizedDelta = DeltaIncrement + (sval_t) SignedOffset; + STARS_sval_t NormalizedDelta = DeltaIncrement + (STARS_sval_t) SignedOffset; STARSOpndTypePtr OldOp = DefOp->clone(); DefOp->SetAddr((uintptr_t) NormalizedDelta); @@ -4795,7 +4800,7 @@ bool SMPInstr::MDRecomputeNormalizedDataFlowOp(sval_t DeltaIncrement, bool Updat // If NormOp is a normalized stack memory operand, unnormalize it. void SMPInstr::MDGetUnnormalizedOp(STARSOpndTypePtr &NormOp) { - sval_t SignedOffset; + STARS_sval_t SignedOffset; bool UseFP = this->GetBlock()->GetFunc()->UsesFramePointer(); if (this->AreDefsNormalized() && MDIsStackAccessOpnd(NormOp, UseFP)) { if (this->HasFPNormalizedToSP()) { @@ -4808,14 +4813,14 @@ void SMPInstr::MDGetUnnormalizedOp(STARSOpndTypePtr &NormOp) { else { NormOp->SetReg(MD_FRAME_POINTER_REG); } - SignedOffset = (sval_t) NormOp->GetAddr(); + SignedOffset = (STARS_sval_t) NormOp->GetAddr(); SignedOffset -= this->GetBlock()->GetFunc()->GetFramePtrStackDelta(); } else { // NormOp should remain stack-pointer-relative address, but it // should be a positive offset from the current stack pointer instead // of a negative offset from the entry point of the function. - SignedOffset = (sval_t) NormOp->GetAddr(); + SignedOffset = (STARS_sval_t) NormOp->GetAddr(); SignedOffset -= this->GetStackPtrOffset(); assert((0 <= SignedOffset) || this->GetBlock()->GetFunc()->DoesStackFrameExtendPastStackTop()); } @@ -4903,7 +4908,7 @@ void SMPInstr::MDFixupIDAProOperandList(void) { // We want it to look like: // Opnd[0] = EAX, both DEF and USE // Opnd[1] = immediate, just USE - if (NN_imul == this->GetIDAOpcode()) { + if (STARS_NN_imul == this->GetIDAOpcode()) { STARSOpndTypePtr Opnd2 = this->STARSInstPtr->GetOpnd(2); if ((!(this->STARSInstPtr->IsDefOpnd(2))) && (!(this->STARSInstPtr->IsUseOpnd(2)))) { @@ -5036,12 +5041,12 @@ void SMPInstr::SetTailCall(void) { this->GetBlock()->SetReturns(true); // We want to add the caller-saved registers to the USEs and DEFs lists - this->MDAddRegDef(R_ax, false); - this->MDAddRegDef(R_cx, false); - this->MDAddRegDef(R_dx, false); - this->MDAddRegUse(R_ax, false); - this->MDAddRegUse(R_cx, false); - this->MDAddRegUse(R_dx, false); + this->MDAddRegDef(STARS_x86_R_ax, false); + this->MDAddRegDef(STARS_x86_R_cx, false); + this->MDAddRegDef(STARS_x86_R_dx, false); + this->MDAddRegUse(STARS_x86_R_ax, false); + this->MDAddRegUse(STARS_x86_R_cx, false); + this->MDAddRegUse(STARS_x86_R_dx, false); } // end of SMPInstr::SetTailCall() // record original Lea instruction [pseudo-]memory operand. @@ -5112,8 +5117,8 @@ void SMPInstr::MDFixupDefUseLists(void) { break; if (Opnd->IsMemOp()) { MDExtractAddressFields(Opnd, BaseReg, IndexReg, ScaleFactor, displacement); - SingleAddressReg = ((0 == displacement) && ((R_none == BaseReg) || (R_none == IndexReg))); - if (R_none != IndexReg) { + SingleAddressReg = ((0 == displacement) && ((STARS_x86_R_none == BaseReg) || (STARS_x86_R_none == IndexReg))); + if (STARS_x86_R_none != IndexReg) { STARSOpndTypePtr IndexOpnd = this->STARSInstPtr->MakeRegOpnd(IndexReg); if (0 == ScaleFactor) this->Uses.SetRef(IndexOpnd); @@ -5122,15 +5127,15 @@ void SMPInstr::MDFixupDefUseLists(void) { this->Uses.SetRef(IndexOpnd, NUMERIC); } } - if (R_none != BaseReg) { + if (STARS_x86_R_none != BaseReg) { STARSOpndTypePtr BaseOpnd = this->STARSInstPtr->MakeRegOpnd(BaseReg); RefType = UNINIT; #if SMP_BASEREG_POINTER_TYPE - // R_sp and R_bp will get type STACKPTR in SMPInstr::SetImmedTypes(). + // STARS_x86_R_sp and STARS_x86_R_bp will get type STACKPTR in SMPInstr::SetImmedTypes(). // Other registers used as base registers should get their USEs as // base registers typed as POINTER, which might get refined later // to STACKPTR, GLOBALPTR, HEAPPTR, etc. - // NOTE: the NN_lea opcode is often used without a true base register. + // NOTE: the STARS_NN_lea opcode is often used without a true base register. // E.g. lea eax,[eax+eax+5] is an x86 idiom for eax:=eax*2+5, which // could not be done in one instruction without using the addressing // modes of the machine to do the arithmetic. We don't want to set the @@ -5150,7 +5155,7 @@ void SMPInstr::MDFixupDefUseLists(void) { } #endif this->Uses.SetRef(BaseOpnd, RefType); - } // end if R_none != BaseReg + } // end if STARS_x86_R_none != BaseReg } // end if (o_phrase or o_displ operand) } // end for (all operands) @@ -5182,40 +5187,40 @@ void SMPInstr::MDFixupDefUseLists(void) { SMP_msg("ERROR: REP and REPNE both present at %lx %s\n", (unsigned long) this->GetAddr(), DisAsmText.GetDisAsm(this->GetAddr())); if (HasRepPrefix || HasRepnePrefix) { // All repeating instructions use ECX as the countdown register. - STARSOpndTypePtr BaseOpnd = this->STARSInstPtr->MakeRegOpnd(R_cx); + STARSOpndTypePtr BaseOpnd = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_cx); BaseOpnd->SetNotVisible(); this->Defs.SetRef(BaseOpnd, NUMERIC); this->Uses.SetRef(BaseOpnd, NUMERIC); } - if ((opcode == NN_cmps) || (opcode == NN_scas) || (opcode == NN_movs) || (opcode == NN_stos)) { + if ((opcode == STARS_NN_cmps) || (opcode == STARS_NN_scas) || (opcode == STARS_NN_movs) || (opcode == STARS_NN_stos)) { // ESI and EDI are USEd and DEFed to point to source and dest strings for CMPS/MOVS. // Only EDI is involved with SCAS/STOS. - if ((opcode == NN_cmps) || (opcode == NN_movs)) { - STARSOpndTypePtr BaseOpnd = this->STARSInstPtr->MakeRegOpnd(R_si); + if ((opcode == STARS_NN_cmps) || (opcode == STARS_NN_movs)) { + STARSOpndTypePtr BaseOpnd = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_si); BaseOpnd->SetNotVisible(); this->Defs.SetRef(BaseOpnd, POINTER); this->Uses.SetRef(BaseOpnd, POINTER); } - STARSOpndTypePtr BaseOpnd2 = this->STARSInstPtr->MakeRegOpnd(R_di); + STARSOpndTypePtr BaseOpnd2 = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_di); BaseOpnd2->SetNotVisible(); this->Defs.SetRef(BaseOpnd2, POINTER); this->Uses.SetRef(BaseOpnd2, POINTER); } - else if ((NN_loopw <= opcode) && (NN_loopqne >= opcode)) { - STARSOpndTypePtr LoopCounterOp = this->STARSInstPtr->MakeRegOpnd(R_cx); + else if ((STARS_NN_loopw <= opcode) && (STARS_NN_loopqne >= opcode)) { + STARSOpndTypePtr LoopCounterOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_cx); this->Defs.SetRef(LoopCounterOp, NUMERIC); this->Uses.SetRef(LoopCounterOp, NUMERIC); } // Now, handle special instruction categories that have implicit operands. - if (NN_cmpxchg == opcode) { + if (STARS_NN_cmpxchg == opcode) { // x86 Compare and Exchange conditionally sets EAX. We must keep data flow analysis // sound by declaring that EAX is always a DEF. - this->MDAddRegDef(R_ax, false); - } // end if NN_cmpxchg + this->MDAddRegDef(STARS_x86_R_ax, false); + } // end if STARS_NN_cmpxchg else if ((this->type == CALL) || (this->type == INDIR_CALL) || this->IsTailCall()) { // We want to add the caller-saved registers to the USEs and DEFs lists - for (list<uint16_t>::iterator RegIter = GetFirstCallerSavedReg(); RegIter != GetLastCallerSavedReg(); ++RegIter) { + for (list<uint16_t>::iterator RegIter = global_STARS_program->GetFirstCallerSavedReg(); RegIter != global_STARS_program->GetLastCallerSavedReg(); ++RegIter) { uint16_t RegNum = (*RegIter); this->MDAddRegDef(RegNum, false); this->MDAddRegUse(RegNum, false); @@ -5224,27 +5229,27 @@ void SMPInstr::MDFixupDefUseLists(void) { #if 1 if (this->MDIsInterruptCall()) { #endif - this->MDAddRegDef(R_bx, false); - this->MDAddRegUse(R_bx, false); - this->MDAddRegDef(R_si, false); - this->MDAddRegUse(R_si, false); + this->MDAddRegDef(STARS_x86_R_bx, false); + this->MDAddRegUse(STARS_x86_R_bx, false); + this->MDAddRegDef(STARS_x86_R_si, false); + this->MDAddRegUse(STARS_x86_R_si, false); #if 1 } #endif } else if (this->MDIsPopInstr() || this->MDIsPushInstr() || this->MDIsReturnInstr()) { // IDA does not include the stack pointer in the DEFs or USEs. - this->MDAddRegDef(R_sp, false); - this->MDAddRegUse(R_sp, false); + this->MDAddRegDef(STARS_x86_R_sp, false); + this->MDAddRegUse(STARS_x86_R_sp, false); if (!this->MDIsReturnInstr()) { // We always reference [esp+0] or [esp-4 or 8], so add it to the DEF or USE list. if (this->MDIsPopInstr()) { - STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, 0); // [ESP+0] + STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, 0); // [ESP+0] this->Uses.SetRef(StackOp); // USE } else { - STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - (-((STARS_ea_t) STARS_ISA_Bytewidth))); // [ESP-4] or [ESP-8] + STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + (-((STARS_ea_t) global_STARS_program->GetSTARS_ISA_Bytewidth()))); // [ESP-4] or [ESP-8] this->Defs.SetRef(StackOp); // DEF } } @@ -5256,13 +5261,13 @@ void SMPInstr::MDFixupDefUseLists(void) { this->MDAddRegDef(MD_FRAME_POINTER_REG, false); this->MDAddRegUse(MD_FRAME_POINTER_REG, false); } - else if ((opcode == NN_maskmovq) || (opcode == NN_maskmovdqu)) { - this->MDAddRegUse(R_di, false, POINTER); + else if ((opcode == STARS_NN_maskmovq) || (opcode == STARS_NN_maskmovdqu)) { + this->MDAddRegUse(STARS_x86_R_di, false, POINTER); } else if (8 == this->GetOptType()) { // This category implicitly writes to EDX:EAX. - this->MDAddRegDef(R_dx, false); - this->MDAddRegDef(R_ax, false); + this->MDAddRegDef(STARS_x86_R_dx, false); + this->MDAddRegDef(STARS_x86_R_ax, false); } // end else if (8 == GetOptType) else if (7 == this->GetOptType()) { // Category 7 instructions sometimes write implicitly to EDX:EAX or DX:AX. @@ -5280,12 +5285,12 @@ void SMPInstr::MDFixupDefUseLists(void) { if (nullptr == TempUse) // finished processing operands break; if (!TempUse->IsVisible()) { // hidden operand - if (TempUse->MatchesReg(R_ax)) { // not R_al, so it is not 8 bits - if ((NN_div == opcode) || (NN_idiv == opcode)) { - this->MDAddRegUse(R_dx, false); + if (TempUse->MatchesReg(STARS_x86_R_ax)) { // not STARS_x86_R_al, so it is not 8 bits + if ((STARS_NN_div == opcode) || (STARS_NN_idiv == opcode)) { + this->MDAddRegUse(STARS_x86_R_dx, false); } - this->MDAddRegDef(R_ax, false); - this->MDAddRegDef(R_dx, false); + this->MDAddRegDef(STARS_x86_R_ax, false); + this->MDAddRegDef(STARS_x86_R_dx, false); } } } @@ -5328,14 +5333,14 @@ void SMPInstr::MDFixupDefUseLists(void) { // in order to prevent erroneous analyses of dead registers or unused // metadata. if ((this->type == RETURN) || this->IsTailCall()) { - this->MDAddRegUse(R_ax, false); - this->MDAddRegUse(R_bx, false); - this->MDAddRegUse(R_cx, false); - this->MDAddRegUse(R_dx, false); + this->MDAddRegUse(STARS_x86_R_ax, false); + this->MDAddRegUse(STARS_x86_R_bx, false); + this->MDAddRegUse(STARS_x86_R_cx, false); + this->MDAddRegUse(STARS_x86_R_dx, false); if (!UseFP) this->MDAddRegUse(MD_FRAME_POINTER_REG, false); - this->MDAddRegUse(R_si, false); - this->MDAddRegUse(R_di, false); + this->MDAddRegUse(STARS_x86_R_si, false); + this->MDAddRegUse(STARS_x86_R_di, false); } // Next, add the flags register to the DEFs and USEs for those instructions that @@ -5384,7 +5389,7 @@ void SMPInstr::MDFixupCallDefUseLists(void) { // be USEs or DEFs. They essentially are untouched by the callee. set<DefOrUse, LessDefUse>::iterator DefIter, UseIter; bool CalleeAnalyzed = (CalleeFunc->HasSTARSStackPtrAnalysisCompleted() && CalleeFunc->StackPtrAnalysisSucceeded() && (!CalleeFunc->HasUnresolvedIndirectJumps()) && (!CalleeFunc->HasSharedChunks())); - for (list<uint16_t>::iterator RegIter = GetFirstCallerSavedReg(); RegIter != GetLastCallerSavedReg(); ++RegIter) { + for (list<uint16_t>::iterator RegIter = global_STARS_program->GetFirstCallerSavedReg(); RegIter != global_STARS_program->GetLastCallerSavedReg(); ++RegIter) { uint16_t RegNum = (*RegIter); STARSOpndTypePtr SearchOp = this->STARSInstPtr->MakeRegOpnd(RegNum); bool ErasedDEF = false; @@ -5447,26 +5452,26 @@ bool SMPInstr::MDFindPointerUse(STARSOpndTypePtr MemOp, bool UseFP) { if (this->MDIsLoadEffectiveAddressInstr()) return false; // lea instruction really has no memory operands - if (NN_fnop == this->GetIDAOpcode()) + if (STARS_NN_fnop == this->GetIDAOpcode()) return false; // SSA marker instruction STARSOpndTypePtr BaseOp = nullptr; STARSOpndTypePtr IndexOp = nullptr; MDExtractAddressFields(MemOp, BaseReg, IndexReg, ScaleFactor, offset); - if (R_none != IndexReg) { + if (STARS_x86_R_none != IndexReg) { IndexOp = this->STARSInstPtr->MakeRegOpnd(MDCanonicalizeSubReg((uint16_t) IndexReg)); IndexIter = this->FindUse(IndexOp); assert(IndexIter != this->GetLastUse()); IndexType = IndexIter->GetType(); } - if (R_none != BaseReg) { + if (STARS_x86_R_none != BaseReg) { BaseOp = this->STARSInstPtr->MakeRegOpnd(MDCanonicalizeSubReg((uint16_t) BaseReg)); BaseIter = this->FindUse(BaseOp); assert(BaseIter != this->GetLastUse()); BaseType = BaseIter->GetType(); } if (MDIsStackPtrReg(BaseReg, UseFP)) { - if ((R_none != IndexReg) && (!IsNumeric(IndexType))) { + if ((STARS_x86_R_none != IndexReg) && (!IsNumeric(IndexType))) { // We have an indexed access into the stack frame. // Set IndexReg USE type to NUMERIC. changed = true; @@ -5476,7 +5481,7 @@ bool SMPInstr::MDFindPointerUse(STARSOpndTypePtr MemOp, bool UseFP) { return changed; // stack accesses will get STACKPTR type in SetImmedTypes() } if (MDIsStackPtrReg(IndexReg, UseFP)) { - if ((R_none != BaseReg) && (!IsNumeric(BaseType))) { + if ((STARS_x86_R_none != BaseReg) && (!IsNumeric(BaseType))) { // We have an indexed access into the stack frame. // Set BaseReg USE type to NUMERIC. // Note that BaseReg is really an IndexReg and vice versa. @@ -5489,14 +5494,14 @@ bool SMPInstr::MDFindPointerUse(STARSOpndTypePtr MemOp, bool UseFP) { return changed; // stack accesses will get STACKPTR type in SetImmedTypes() } if (IsImmedGlobalAddress(offset)) { - if ((R_none != IndexReg) && (!IsNumeric(IndexType))) { + if ((STARS_x86_R_none != IndexReg) && (!IsNumeric(IndexType))) { // We have an indexed access into a global. // Set IndexReg USE type to NUMERIC. changed = true; IndexIter = this->SetUseType(IndexOp, NUMERIC); assert(IndexIter != this->GetLastUse()); } - if ((R_none != BaseReg) && (!IsNumeric(BaseType))) { + if ((STARS_x86_R_none != BaseReg) && (!IsNumeric(BaseType))) { // We have an indexed access into a global. // Set BaseReg USE type to NUMERIC. // Note that BaseReg is really an index register. @@ -5512,11 +5517,11 @@ bool SMPInstr::MDFindPointerUse(STARSOpndTypePtr MemOp, bool UseFP) { // At this point, we must have a base address in a register, not used // to directly address the stack or a global. - if ((0 < ScaleFactor) || (R_none == IndexReg)) { + if ((0 < ScaleFactor) || (STARS_x86_R_none == IndexReg)) { // IndexReg is scaled, meaning it is NUMERIC, so BaseReg must // be a POINTER; or IndexReg is not present, so BaseReg is the // only possible holder of an address. - if (R_none != BaseReg) { + if (STARS_x86_R_none != BaseReg) { if (UNINIT == BaseIter->GetType()) { changed = true; BaseIter = this->SetUseType(BaseOp, POINTER); @@ -5524,10 +5529,10 @@ bool SMPInstr::MDFindPointerUse(STARSOpndTypePtr MemOp, bool UseFP) { } } } - else if (R_none == BaseReg) { + else if (STARS_x86_R_none == BaseReg) { // We have an unscaled IndexReg and no BaseReg and offset was // not a global offset, so IndexReg must be a POINTER. - if (R_none != IndexReg) { + if (STARS_x86_R_none != IndexReg) { if (UNINIT == IndexType) { changed = true; IndexIter = this->SetUseType(IndexOp, POINTER); @@ -6501,15 +6506,15 @@ bool SMPInstr::IsOpSourceByteSwap(STARSOpndTypePtr UseOp, int UseSSANum, STARS_e // used as a helper for IsSubRegUsedAsShiftCount(). bool SMPInstr::MDIsShiftOrRotate(void) const { unsigned short opcode = this->GetIDAOpcode(); - return (((NN_rcl <= opcode) && (NN_ror >= opcode)) - || ((NN_sal <= opcode) && (NN_shr >= opcode)) - || (NN_shld == opcode) || (NN_shrd == opcode)); + return (((STARS_NN_rcl <= opcode) && (STARS_NN_ror >= opcode)) + || ((STARS_NN_sal <= opcode) && (STARS_NN_shr >= opcode)) + || (STARS_NN_shld == opcode) || (STARS_NN_shrd == opcode)); } // end of SMPInstr::MDIsShiftOrRotate() // Is opcode a shift to the right? bool SMPInstr::MDIsShiftRight(void) const { unsigned short opcode = this->GetIDAOpcode(); - return ((NN_sar == opcode) || (NN_shr == opcode)); + return ((STARS_NN_sar == opcode) || (STARS_NN_shr == opcode)); } // Does the shift or rotate RTL move the upper HalfBitWidth bits @@ -6552,7 +6557,7 @@ bool SMPInstr::ShiftMakesUpperBitsLower(std::size_t HalfBitWidth, bool MustBeHal #if 0 // Find SearchDelta in StackDeltaSet, inserting it if not found. Return whether it was initially found. -bool SMPInstr::FindStackPtrDelta(sval_t SearchDelta) const { +bool SMPInstr::FindStackPtrDelta(STARS_sval_t SearchDelta) const { bool found = (this->StackDeltaSet.find(SearchDelta) != this->StackDeltaSet.end()); if (!found) { this->StackDeltaSet.insert(SearchDelta); @@ -6708,10 +6713,10 @@ void SMPInstr::MDFindLoadFromStack(bool UseFP) { // True if sign or zero-extended; pass out mask bits if true. bool SMPInstr::MDIsSignedLoad(unsigned short &SignMask) { unsigned short opcode = this->GetIDAOpcode(); - if (NN_movzx == opcode) { + if (STARS_NN_movzx == opcode) { SignMask = FG_MASK_UNSIGNED; } - else if (NN_movsx == opcode) { + else if (STARS_NN_movsx == opcode) { SignMask = FG_MASK_SIGNED; } else { @@ -6724,10 +6729,10 @@ bool SMPInstr::MDIsSignedLoad(unsigned short &SignMask) { #define STARS_SMALL_POS_VALUE_LIMIT 255 bool SMPInstr::MDIsSmallPositiveAddition(void) { unsigned short opcode = this->GetIDAOpcode(); - bool found = (NN_inc == opcode); + bool found = (STARS_NN_inc == opcode); STARS_uval_t ImmVal; - if (!found && ((NN_add == opcode) || (NN_adc == opcode))) { + if (!found && ((STARS_NN_add == opcode) || (STARS_NN_adc == opcode))) { set<DefOrUse, LessDefUse>::iterator UseIter; for (UseIter = this->GetFirstUse(); UseIter != this->GetLastUse(); ++UseIter) { STARSOpndTypePtr UseOp = UseIter->GetOp(); @@ -6764,9 +6769,9 @@ bool SMPInstr::MDIsSmallPositiveAddition(void) { // true if increment, decrement, or addition or subtraction of small immediate value bool SMPInstr::MDIsSmallAdditionOrSubtraction(void) { unsigned short opcode = this->GetIDAOpcode(); - bool found = ((NN_inc == opcode) || (NN_dec == opcode)); + bool found = ((STARS_NN_inc == opcode) || (STARS_NN_dec == opcode)); - if ((NN_add == opcode) || (NN_adc == opcode) || (NN_sub == opcode) || (NN_sbb == opcode)) { + if ((STARS_NN_add == opcode) || (STARS_NN_adc == opcode) || (STARS_NN_sub == opcode) || (STARS_NN_sbb == opcode)) { set<DefOrUse, LessDefUse>::iterator UseIter; for (UseIter = this->GetFirstUse(); !found && (UseIter != this->GetLastUse()); ++UseIter) { STARSOpndTypePtr UseOp = UseIter->GetOp(); @@ -6822,8 +6827,8 @@ bool SMPInstr::IsCounterOperation(void) { // Inst does an AND, OR, XOR operation; does not do add, subtract, etc. bool SMPInstr::MDIsNonOverflowingBitManipulation(void) const { unsigned short opcode = this->GetIDAOpcode(); - return ((NN_and == opcode) || (NN_not == opcode) || (NN_or == opcode) || (NN_shl == opcode) - || ((NN_xor == opcode) && !this->IsRegClearIdiom())); + return ((STARS_NN_and == opcode) || (STARS_NN_not == opcode) || (STARS_NN_or == opcode) || (STARS_NN_shl == opcode) + || ((STARS_NN_xor == opcode) && !this->IsRegClearIdiom())); } // end of SMPInstr::MDIsNonOverflowingBitManipulation() // return true if traced USE to a constant value @@ -7542,7 +7547,7 @@ bool SMPInstr::SkipSignednessCheckOnStackWrite(int DefSSANum, bool SourceIsSigne bool SMPInstr::MDIsArgumentPass(std::size_t &ArgumentNumber) { bool OutArgPass = false; - if (STARS_ISA_Bitwidth == 64) { + if (global_STARS_program->GetSTARS_ISA_Bitwidth() == 64) { // x86-64 passes the first six arguments in registers EDI, ESI, EDX, ECX, R8 and R9, in that order. set<DefOrUse, LessDefUse>::iterator DefIter = this->GetFirstNonFlagsDef(); if (DefIter != this->GetLastDef()) { @@ -7550,7 +7555,7 @@ bool SMPInstr::MDIsArgumentPass(std::size_t &ArgumentNumber) { if (DefOp->IsRegOp()) { uint16_t RegNum = DefOp->GetReg(); std::size_t ArgIndex = 0; - for (list<uint16_t>::iterator ArgRegIter = GetFirstArgumentReg(); ArgRegIter != GetLastArgumentReg(); ++ArgRegIter) { + for (list<uint16_t>::iterator ArgRegIter = global_STARS_program->GetFirstArgumentReg(); ArgRegIter != global_STARS_program->GetLastArgumentReg(); ++ArgRegIter) { if (RegNum == (*ArgRegIter)) { OutArgPass = true; ArgumentNumber = ArgIndex; @@ -8067,7 +8072,7 @@ bool SMPInstr::InferTypes(void) { // and do not need an RTL walk. SMPitype DFAType = this->GetDataFlowType(); bool CallInst = ((DFAType == CALL) || (DFAType == INDIR_CALL) || this->IsTailCall()); - uint16_t IndirCallReg = R_none; + uint16_t IndirCallReg = STARS_x86_R_none; if (DebugFlag) { SMP_msg("DFAType: %d CategoryInferenceComplete: %d\n", DFAType, this->IsCategoryInferenceComplete()); @@ -9788,7 +9793,7 @@ bool SMPInstr::InferOperatorFGInfo(SMPRegTransfer *CurrRT, bool FirstIter, struc } if ((RightFG.SignMiscInfo != 0) || (RightFG.SizeInfo != 0)) MapsChanged |= this->UpdateUseOpFGInfo(RightOp, RightFG); - } // end if (RightOP is o_reg) + } // end if (RightOP is reg) else if (MDIsDirectStackAccessOpnd(RightOp, UseFP)) { // We used to assume that all FG info transfers from stack locations to // the target registers of stack loads happened in SMPInstr::MDSetWidthSignInfo(), @@ -10049,7 +10054,7 @@ bool SMPInstr::IsNumericTrustedSystemCall(void) { if ((BADADDR != this->CallTarget) && (!this->IsCallUsedAsJump())) { // We have a resolved call target address, either via direct or indirect call. string FuncName = this->GetTrimmedCalledFunctionName(); - TrustedCall = IsNumericSafeSystemCall(FuncName); + TrustedCall = global_STARS_program->IsNumericSafeSystemCall(FuncName); } return TrustedCall; @@ -10209,53 +10214,53 @@ void SMPInstr::EmitFastReturnStatus(unsigned short FastReturnStatus) { return; } - SMP_fprintf(STARS_CallReturnFile, "%10lx %6d INSTR %s ", + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "%10lx %6d INSTR %s ", (unsigned long) this->GetAddr(), this->GetSize(), InstrString); - if (STARS_PerformReducedAnalysis) { - SMP_fprintf(STARS_CallReturnFile, "NOFASTRETURN REDUCEDANALYSIS"); + if (global_STARS_program->ShouldSTARSPerformReducedAnalysis()) { + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "NOFASTRETURN REDUCEDANALYSIS"); } else if (FastReturnStatus == SAFE_FAST_RETURN) { - SMP_fprintf(STARS_CallReturnFile, "FASTRETURN "); + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "FASTRETURN "); } else { // Iterate through possible reasons and print each reason. - SMP_fprintf(STARS_CallReturnFile, "NOFASTRETURN "); + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "NOFASTRETURN "); if (UNSAFE_RETURN_ADDRESS & FastReturnStatus) { - SMP_fprintf(STARS_CallReturnFile, "RAUNSAFE "); + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "RAUNSAFE "); } if (RETURN_ADDRESS_WRITE & FastReturnStatus) { - SMP_fprintf(STARS_CallReturnFile, "RAWRITE "); + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "RAWRITE "); } if (RETURN_ADDRESS_READ & FastReturnStatus) { - SMP_fprintf(STARS_CallReturnFile, "RAREAD "); + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "RAREAD "); } if (INDIRECTLY_CALLED & FastReturnStatus) { - SMP_fprintf(STARS_CallReturnFile, "INDIRECT "); + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "INDIRECT "); } if (NO_CALLERS & FastReturnStatus) { - SMP_fprintf(STARS_CallReturnFile, "NOCALLERS "); + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "NOCALLERS "); } if (TAIL_CALL_TARGET & FastReturnStatus) { - SMP_fprintf(STARS_CallReturnFile, "TAILCALLED "); + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "TAILCALLED "); } if (MAKES_TAIL_CALL & FastReturnStatus) { - SMP_fprintf(STARS_CallReturnFile, "MAKES_TAIL_CALL "); + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "MAKES_TAIL_CALL "); } if (MULTIPLE_ENTRY_POINTS & FastReturnStatus) { - SMP_fprintf(STARS_CallReturnFile, "MULTIENTRY "); + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "MULTIENTRY "); } if (UNRESOLVED_INDIR_JUMP & FastReturnStatus) { - SMP_fprintf(STARS_CallReturnFile, "INDIRJUMP "); + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "INDIRJUMP "); } if (EH_FRAME_ENTRY & FastReturnStatus) { - SMP_fprintf(STARS_CallReturnFile, "EXCEPTION_HANDLING "); + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "EXCEPTION_HANDLING "); } if (RAUNSAFE_CALLEES & FastReturnStatus) { - SMP_fprintf(STARS_CallReturnFile, "UNSAFE_CALLEES "); + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "UNSAFE_CALLEES "); } } - SMP_fprintf(STARS_CallReturnFile, "ZZ %s \n", disasm); + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "ZZ %s \n", disasm); return; } // end of SMPInstr::EmitFastReturnStatus() @@ -10277,7 +10282,7 @@ void SMPInstr::EmitCallReturnStatus(SMPProgram *CurrProg) { } if (NULL == CalleeFunc) { SMP_msg("ERROR: Cannot find callee function for CALL at %llx \n", (unsigned long long) this->GetAddr()); - SMP_fprintf(STARS_CallReturnFile, "%10lx %6d INSTR CALL RAUNSAFE %s\n", + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "%10lx %6d INSTR CALL RAUNSAFE %s\n", (unsigned long) this->GetAddr(), this->GetSize(), disasm); this->EmitFastReturnStatus((unsigned short) NO_CALLERS); } @@ -10285,11 +10290,11 @@ void SMPInstr::EmitCallReturnStatus(SMPProgram *CurrProg) { FuncType RetAddrStatus = CalleeFunc->GetReturnAddressStatus(); unsigned short FastReturnStatus = CalleeFunc->GetFastReturnStatus(); if (FUNC_SAFE != RetAddrStatus) { - SMP_fprintf(STARS_CallReturnFile, "%10lx %6d INSTR CALL RAUNSAFE %s\n", + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "%10lx %6d INSTR CALL RAUNSAFE %s\n", (unsigned long) this->GetAddr(), this->GetSize(), disasm); } else { - SMP_fprintf(STARS_CallReturnFile, "%10lx %6d INSTR CALL RASAFE %s\n", + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "%10lx %6d INSTR CALL RASAFE %s\n", (unsigned long) this->GetAddr(), this->GetSize(), disasm); } this->EmitFastReturnStatus(FastReturnStatus); @@ -10297,8 +10302,8 @@ void SMPInstr::EmitCallReturnStatus(SMPProgram *CurrProg) { } else if (INDIR_CALL == FlowType) { STARS_ea_t CalleeAddr = this->GetCallTarget(); - if ((BADADDR == CalleeAddr) || STARS_PerformReducedAnalysis) { - SMP_fprintf(STARS_CallReturnFile, "%10lx %6d INSTR INDIRCALL RAUNSAFE UNKNOWNTARGET %s\n", + if ((BADADDR == CalleeAddr) || global_STARS_program->ShouldSTARSPerformReducedAnalysis()) { + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "%10lx %6d INSTR INDIRCALL RAUNSAFE UNKNOWNTARGET %s\n", (unsigned long) this->GetAddr(), this->GetSize(), disasm); unsigned short DummyReturnStatus = INDIRECTLY_CALLED; this->EmitFastReturnStatus(DummyReturnStatus); @@ -10313,7 +10318,7 @@ void SMPInstr::EmitCallReturnStatus(SMPProgram *CurrProg) { } if (NULL == CalleeFunc) { SMP_msg("ERROR: Cannot find callee function for CALL at %llx \n", (unsigned long long) this->GetAddr()); - SMP_fprintf(STARS_CallReturnFile, "%10lx %6d INSTR CALL RAUNSAFE %s\n", + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "%10lx %6d INSTR CALL RAUNSAFE %s\n", (unsigned long) this->GetAddr(), this->GetSize(), disasm); this->EmitFastReturnStatus((unsigned short) NO_CALLERS); } @@ -10321,11 +10326,11 @@ void SMPInstr::EmitCallReturnStatus(SMPProgram *CurrProg) { FuncType RetAddrStatus = CalleeFunc->GetReturnAddressStatus(); unsigned short FastReturnStatus = CalleeFunc->GetFastReturnStatus(); if (FUNC_SAFE != RetAddrStatus) { - SMP_fprintf(STARS_CallReturnFile, "%10lx %6d INSTR INDIRCALL RAUNSAFE %s\n", + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "%10lx %6d INSTR INDIRCALL RAUNSAFE %s\n", (unsigned long) this->GetAddr(), this->GetSize(), disasm); } else { - SMP_fprintf(STARS_CallReturnFile, "%10lx %6d INSTR INDIRCALL RASAFE %s\n", + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "%10lx %6d INSTR INDIRCALL RASAFE %s\n", (unsigned long) this->GetAddr(), this->GetSize(), disasm); } this->EmitFastReturnStatus(FastReturnStatus); @@ -10334,11 +10339,11 @@ void SMPInstr::EmitCallReturnStatus(SMPProgram *CurrProg) { } else if (RETURN == FlowType) { if (this->IsCondTailCall()) { - SMP_fprintf(STARS_CallReturnFile, "%10lx %6d INSTR CALL CONDTAILCALL %s\n", + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "%10lx %6d INSTR CALL CONDTAILCALL %s\n", (unsigned long) this->GetAddr(), this->GetSize(), disasm); } else if (this->IsTailCall()) { - SMP_fprintf(STARS_CallReturnFile, "%10lx %6d INSTR CALL TAILCALL %s\n", + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "%10lx %6d INSTR CALL TAILCALL %s\n", (unsigned long) this->GetAddr(), this->GetSize(), disasm); } else if (this->MDIsReturnInstr()) { @@ -10350,11 +10355,11 @@ void SMPInstr::EmitCallReturnStatus(SMPProgram *CurrProg) { } if (FUNC_SAFE == RetAddrStatus) { - SMP_fprintf(STARS_CallReturnFile, "%10lx %6d INSTR RETURN RASAFE %s\n", + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "%10lx %6d INSTR RETURN RASAFE %s\n", (unsigned long) this->GetAddr(), this->GetSize(), disasm); } else { - SMP_fprintf(STARS_CallReturnFile, "%10lx %6d INSTR RETURN RAUNSAFE %s\n", + SMP_fprintf(global_STARS_program->GetCallReturnFile(), "%10lx %6d INSTR RETURN RAUNSAFE %s\n", (unsigned long) this->GetAddr(), this->GetSize(), disasm); } this->EmitFastReturnStatus(FastReturnStatus); @@ -10390,7 +10395,7 @@ void SMPInstr::EmitAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, FILE ProfInfo = this->BasicBlock->GetFunc()->GetProg()->GetProfInfo(); #endif - ++OptCount[OptType]; // keep count for debugging info + global_STARS_program->IncrementOptCount(this->OptType); // keep count for debugging info #if SMP_ANNOTATE_ALL_MEMORY_OPERANDS // Emit informational annotations for memory operands. @@ -10425,18 +10430,18 @@ void SMPInstr::EmitAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, FILE if ((BADADDR != this->CallTarget) && (!this->IsCallUsedAsJump())) { // We have a resolved call target address, either via direct or indirect call. string FuncName = this->GetTrimmedCalledFunctionName(); - ZST_SysCallType FuncCallType = GetCallTypeFromFuncName(FuncName); - ZST_Policy FuncCallPolicy = GetPolicyFromCallType(FuncCallType); + ZST_SysCallType FuncCallType = global_STARS_program->GetCallTypeFromFuncName(FuncName); + ZST_Policy FuncCallPolicy = global_STARS_program->GetPolicyFromCallType(FuncCallType); if (ZST_DISALLOW == FuncCallPolicy) { if ((NULL != this->GetBlock()) && (NULL != this->GetBlock()->GetFunc())) { - SMP_fprintf(ZST_AlarmFile, "ALARM: Call to %s will be disallowed at %lx in %s\n", + SMP_fprintf(global_STARS_program->GetAlarmFile(), "ALARM: Call to %s will be disallowed at %lx in %s\n", FuncName.c_str(), (unsigned long) this->GetAddr(), this->GetBlock()->GetFunc()->GetFuncName()); } else { - SMP_fprintf(ZST_AlarmFile, "ALARM: Call to %s will be disallowed at %lx\n", + SMP_fprintf(global_STARS_program->GetAlarmFile(), "ALARM: Call to %s will be disallowed at %lx\n", FuncName.c_str(), (unsigned long) this->GetAddr()); } - SMP_fprintf(ZST_AlarmFile, "ALARM REASON: Call policy is DISALLOW for all calls of type %s\n", CallTypeNames[FuncCallType]); + SMP_fprintf(global_STARS_program->GetAlarmFile(), "ALARM REASON: Call policy is DISALLOW for all calls of type %s\n", CallTypeNames[FuncCallType]); SMP_fprintf(InfoAnnotFile, "%10lx %6d INSTR SECURITYCALL Disallow 1 1 %s \n", (unsigned long) addr, this->GetSize(), disasm); } @@ -10475,7 +10480,7 @@ void SMPInstr::EmitAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, FILE case 1: // nothing for SDT to do { SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL %s %s \n", (unsigned long) addr, -1, OptExplanation[OptType], disasm); - ++AnnotationCount[OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); break; } @@ -10486,7 +10491,7 @@ void SMPInstr::EmitAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, FILE } SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL Always1stSrc %s \n", (unsigned long) addr, -1, disasm); - ++AnnotationCount[OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); break; } @@ -10498,13 +10503,13 @@ void SMPInstr::EmitAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, FILE if (SecondSrcOperandImmNum && !this->MDIsFrameAllocInstr() #if SPECIAL_CASE_CARRY_BORROW - && (this->GetIDAOpcode() != NN_adc) - && (this->GetIDAOpcode() != NN_sbb) + && (this->GetIDAOpcode() != STARS_NN_adc) + && (this->GetIDAOpcode() != STARS_NN_sbb) #endif ) { // treat as category 1 SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL %s %s \n", (unsigned long) addr, -1, OptExplanation[OptType], disasm); - ++AnnotationCount[OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); } else { SDTInstrumentation = true; @@ -10519,14 +10524,14 @@ void SMPInstr::EmitAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, FILE } SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL AlwaysPTR %s \n", (unsigned long) addr, -OptType, disasm); - ++AnnotationCount[OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); break; } case 8: // Implicitly writes to EDX:EAX, always numeric. { SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL n EDX EAX ZZ %s %s \n", (unsigned long) addr, -2, OptExplanation[OptType], disasm); - ++AnnotationCount[OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); SDTInstrumentation = true; break; } @@ -10542,14 +10547,14 @@ void SMPInstr::EmitAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, FILE } SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL %s %s \n", (unsigned long) addr, -1, OptExplanation[OptType], disasm); - ++AnnotationCount[OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); break; } case 10: // Implicitly writes to EDX:EAX and ECX, always numeric. { SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL n EDX EAX ECX ZZ %s %s \n", (unsigned long) addr, -2, OptExplanation[OptType], disasm); - ++AnnotationCount[OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); SDTInstrumentation = true; break; } @@ -10579,7 +10584,7 @@ void SMPInstr::EmitAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, FILE SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL n %s %s %s \n", (unsigned long) addr, -2, this->DestString(OptType), OptExplanation[OptType], disasm); - ++AnnotationCount[OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); } break; } @@ -10654,8 +10659,8 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, bool MemSrc = this->HasSourceMemoryOperand(); bool SecondSrcOperandImmNum = this->IsSecondSrcOperandNumeric(InstrFlags); // assumes 2nd source is imm or not-numeric?? bool NoWarnFlag = false; // NOWARN annotation emitted? - bool CarryBorrow = ((this->GetIDAOpcode() == NN_adc) - || (this->GetIDAOpcode() == NN_sbb)); + bool CarryBorrow = ((this->GetIDAOpcode() == STARS_NN_adc) + || (this->GetIDAOpcode() == STARS_NN_sbb)); // Do we have the special case in which a non-NUMERIC comes into // an add with carry or subtract with borrow and the result // has been inferred to be NUMERIC? @@ -10666,7 +10671,7 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, ProfInfo = this->BasicBlock->GetFunc()->GetProg()->GetProfInfo(); char *disasm = DisAsmText.GetDisAsm(this->GetAddr()); - ++OptCount[this->OptType]; // keep count for debugging info + global_STARS_program->IncrementOptCount(this->OptType); // keep count for debugging info if (this->IsNop()) TypeGroup = 1; // no-op idioms need their category reset @@ -10710,12 +10715,12 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, if ((BADADDR != this->CallTarget) && (!this->IsCallUsedAsJump())) { // We have a resolved call target address, either via direct or indirect call. string FuncName = this->GetTrimmedCalledFunctionName(); - ZST_SysCallType FuncCallType = GetCallTypeFromFuncName(FuncName); - ZST_Policy FuncCallPolicy = GetPolicyFromCallType(FuncCallType); + ZST_SysCallType FuncCallType = global_STARS_program->GetCallTypeFromFuncName(FuncName); + ZST_Policy FuncCallPolicy = global_STARS_program->GetPolicyFromCallType(FuncCallType); if (ZST_DISALLOW == FuncCallPolicy) { - SMP_fprintf(ZST_AlarmFile, "ALARM: Call to %s will be disallowed at %lx in %s\n", + SMP_fprintf(global_STARS_program->GetAlarmFile(), "ALARM: Call to %s will be disallowed at %lx in %s\n", FuncName.c_str(), (unsigned long) this->GetAddr(), this->GetBlock()->GetFunc()->GetFuncName()); - SMP_fprintf(ZST_AlarmFile, "ALARM REASON: Call policy is DISALLOW for all calls of type %s\n", CallTypeNames[FuncCallType]); + SMP_fprintf(global_STARS_program->GetAlarmFile(), "ALARM REASON: Call policy is DISALLOW for all calls of type %s\n", CallTypeNames[FuncCallType]); SMP_fprintf(InfoAnnotFile, "%10lx %6d INSTR SECURITYCALL Disallow 1 1 %s \n", (unsigned long) addr, this->GetSize(), disasm); } @@ -10729,26 +10734,26 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, // We omit this for groups 1 and 14, so that the metadata analysis // does not get statistical credit for instructions that were already // getting -1 annotations without analysis. - // We also cannot skip NN_adc and NN_sbb instructions that change the + // We also cannot skip STARS_NN_adc and STARS_NN_sbb instructions that change the // type of the incoming register. if ((1 != TypeGroup) && (14 != TypeGroup) && (!this->MDIsInterruptCall()) && !TypeChange) { if (UnusedMetadata) { SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL MetadataUnused %s \n", (unsigned long) addr, -1, disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); return; } else if (DEF_METADATA_REDUNDANT == DefMetadataType) { SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL MetadataRedundant %s \n", (unsigned long) addr, -1, disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); return; } else if (DEF_METADATA_PROF_REDUNDANT == DefMetadataType) { SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL MetadataRedundant %s \n", (unsigned long) addr, -257, disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); // Profiler annotations could be backed off due to false // positives, in which case we will need stack constant // annotations. @@ -10779,7 +10784,7 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL n %s NumericDEFs %s \n", (unsigned long) addr, ProfiledDEFs ? -256-2 : -2, this->DestString(this->OptType), disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); } else { SDTInstrumentation = true; @@ -10795,7 +10800,7 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, } SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL %s %s \n", (unsigned long) addr, -1, OptExplanation[this->OptType], disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); break; case 4: // INC, DEC, etc.: no SDT work unless MemDest @@ -10806,7 +10811,7 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, } SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL Always1stSrc %s \n", (unsigned long) addr, -1, disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); break; case 5: // ADD, etc.: If numeric 2nd src operand, no SDT work. @@ -10826,7 +10831,7 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, // treat as category 1 SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL %s %s \n", (unsigned long) addr, -1, OptExplanation[this->OptType], disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); } else if (IsEqType(NUMERIC, this->AddSubSourceType) && !this->MDIsFrameAllocInstr() @@ -10837,15 +10842,15 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, ) { SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL 2ndSrcNumeric %s \n", (unsigned long) addr, -1, disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); } else if (NumericDEFs) { SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL n %s NumericDEFs %s \n", (unsigned long) addr, ProfiledDEFs ? -256-2 : -2, this->DestString(this->OptType), disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); } #if SMP_OPTIMIZE_ADD_TO_NUMERIC - else if ((NN_add == this->GetIDAOpcode()) && (!MemSrc) + else if ((STARS_NN_add == this->GetIDAOpcode()) && (!MemSrc) && IsNumeric(this->AddSubDefUseType)) { // reg1 := reg1 + reg2, where reg1 comes in as NUMERIC, // means that reg1 will get DEFed to the type of reg2, @@ -10854,7 +10859,7 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL %s := %s ZZ AddToNumeric %s \n", (unsigned long) addr, -5, MDGetRegName(this->GetDefUseAddSubOp()), MDGetRegName(this->GetUseOnlyAddSubOp()), disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); } #endif else { @@ -10869,7 +10874,7 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, } SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL AlwaysPTR %s \n", (unsigned long) addr, -OptType, disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); break; case 8: // Implicitly writes to EDX:EAX, always numeric. @@ -10881,7 +10886,7 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL n EDX EAX ZZ %s %s \n", (unsigned long) addr, -2, OptExplanation[this->OptType], disasm); } - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); SDTInstrumentation = true; break; @@ -10892,14 +10897,14 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, if (NumericDEFs) { SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL n %s NumericDEFs %s \n", (unsigned long) addr, ProfiledDEFs ? -256-2 : -2, this->DestString(this->OptType), disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); } #endif } else { SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL %s %s \n", (unsigned long) addr, -1, OptExplanation[this->OptType], disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); } break; @@ -10912,7 +10917,7 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, else if (NumericDEFs) { // NUMERIC result because of NUMERIC sources SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL n %s NumericDEFs %s \n", (unsigned long) addr, ProfiledDEFs ? -256-2 : -2, this->DestString(this->OptType), disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); } break; @@ -10925,7 +10930,7 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, else if (NumericDEFs) { // NUMERIC result because of NUMERIC sources SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL %s %s \n", (unsigned long) addr, ProfiledDEFs ? -256-1 : -1, OptExplanation[TypeGroup], disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); } else SDTInstrumentation = true; @@ -10941,7 +10946,7 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, else { // NUMERIC floating register result; these regs are always NUMERIC SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL %s %s \n", (unsigned long) addr, -1, OptExplanation[TypeGroup], disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); } break; @@ -10955,12 +10960,12 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL n %s %s %s \n", (unsigned long) addr, -2, this->DestString(this->OptType), OptExplanation[this->OptType], disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); } else if (NumericDEFs) { // NUMERIC move instruction SMP_fprintf(AnnotFile, "%10lx %6d INSTR LOCAL n %s NumericDEFs %s \n", (unsigned long) addr, ProfiledDEFs ? -256-2 : -2, this->DestString(this->OptType), disasm); - ++AnnotationCount[this->OptType]; + global_STARS_program->IncrementAnnotationCount(this->OptType); } break; } // end switch (OptType) @@ -10999,7 +11004,7 @@ void SMPInstr::EmitTypeAnnotations(bool UseFP, bool AllocSeen, bool NeedsFrame, set<DefOrUse, LessDefUse>::iterator PtrUse; PtrUse = this->GetPointerAddressReg(this->DEFMemOp); if (PtrUse != this->GetLastUse()) { // found POINTER addr reg USE - if (PtrUse->GetOp()->GetOpType() == o_reg) { + if (PtrUse->GetOp()->GetOpType()->IsRegOp()) { SMP_fprintf(AnnotFile, "%10lx %6d INSTR POINTER reg %s ZZ %s \n", (unsigned long) addr, this->GetSize(), MDGetRegName(PtrUse->GetOp()), disasm); } @@ -11395,7 +11400,7 @@ void SMPInstr::EmitIntegerErrorAnnotations(FILE *InfoAnnotFile, list<std::size_t // multiplication and we have the potential for sub-cases A&B // but not sub-case C. So, we check to see if the DEF of EDX // is dead. - DefOp = this->STARSInstPtr->MakeRegOpnd(R_dx); + DefOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_dx); DefIter = this->FindDef(DefOp); if (DefIter != this->GetLastDef()) { // We found DEF of EDX, so it is not AX:=AL*op8 sub-case C. @@ -12263,7 +12268,7 @@ void SMPInstr::MDEmitLeaOpcodeOverflowAnnotations(FILE *InfoAnnotFile, list<std: } // Gather signedness info about BaseReg, if any, that will be used in multiple cases below. - if (R_none != BaseReg) { + if (STARS_x86_R_none != BaseReg) { STARSOpndTypePtr RegOp = this->STARSInstPtr->MakeRegOpnd(MDCanonicalizeSubReg(BaseReg)); if (this->MDIsAddressing64bit()) { RegOp->SetByteWidth(8); @@ -12305,7 +12310,7 @@ void SMPInstr::MDEmitLeaOpcodeOverflowAnnotations(FILE *InfoAnnotFile, list<std: BaseRegSignMask = 0; } - if (R_none != IndexReg) { + if (STARS_x86_R_none != IndexReg) { // Get signedness info for IndexReg. STARSOpndTypePtr RegOp = this->STARSInstPtr->MakeRegOpnd(MDCanonicalizeSubReg(IndexReg)); if (this->MDIsAddressing64bit()) { @@ -12344,7 +12349,7 @@ void SMPInstr::MDEmitLeaOpcodeOverflowAnnotations(FILE *InfoAnnotFile, list<std: if (ScaledIndexReg) { assert((ScaleFactor >= 1) && (ScaleFactor <= 3)); - assert((IndexReg >= R_ax) && (IndexReg <= R_bh)); + assert((IndexReg >= STARS_x86_R_ax) && (IndexReg <= STARS_x86_R_bh)); CurrString += MDGetRegName(RegOp); CurrString += ScaleStrings[ScaleFactor]; if (IdiomCode > 0) { @@ -12367,7 +12372,7 @@ void SMPInstr::MDEmitLeaOpcodeOverflowAnnotations(FILE *InfoAnnotFile, list<std: #if SMP_MEASURE_NUMERIC_ANNOTATIONS ++LeaInstOverflowCount; #endif - if (R_none != BaseReg) { + if (STARS_x86_R_none != BaseReg) { // Have BaseReg+IndexReg*ScaleFactor string TempStr(CurrString); CurrString.clear(); @@ -12430,7 +12435,7 @@ void SMPInstr::MDEmitLeaOpcodeOverflowAnnotations(FILE *InfoAnnotFile, list<std: #endif } } - else if (R_none != BaseReg) { + else if (STARS_x86_R_none != BaseReg) { // We have BaseReg+IndexReg, unscaled. STARSOpndTypePtr RegOp = this->STARSInstPtr->MakeRegOpnd(MDCanonicalizeSubReg(BaseReg)); if (this->MDIsAddressing64bit()) { @@ -12532,7 +12537,7 @@ void SMPInstr::MDEmitLeaOpcodeOverflowAnnotations(FILE *InfoAnnotFile, list<std: ; } } - else if ((R_none != BaseReg) && (SignedOffset != 0)) { + else if ((STARS_x86_R_none != BaseReg) && (SignedOffset != 0)) { // No index reg, scaled or otherwise. Just BaseReg+offset STARSOpndTypePtr RegOp = this->STARSInstPtr->MakeRegOpnd(MDCanonicalizeSubReg(BaseReg)); if (this->MDIsAddressing64bit()) { @@ -12581,7 +12586,7 @@ void SMPInstr::MDEmitLeaOpcodeOverflowAnnotations(FILE *InfoAnnotFile, list<std: STARSOpndTypePtr SMPInstr::GetPushedOpnd(void) { STARSOpndTypePtr VoidOp = this->STARSInstPtr->MakeVoidOpnd(); - if (NN_push == this->GetIDAOpcode()) { + if (STARS_NN_push == this->GetIDAOpcode()) { for (std::size_t OpNum = 0; OpNum < UA_MAXOP; ++OpNum) { STARSOpndTypePtr TempOp = this->STARSInstPtr->GetOpnd(OpNum); if (this->STARSInstPtr->IsUseOpnd(OpNum)) { // USE @@ -12617,139 +12622,139 @@ int SMPInstr::MDGetImmedUse(void) { void SMPInstr::MDGetFlagsUsed(set<int> &UsedFlags) { pair<set<int>::iterator, bool> InsertResult; switch (this->GetIDAOpcode()) { - case NN_adc: // Add with Carry - case NN_daa: // Decimal Adjust AL after Addition - case NN_das: // Decimal Adjust AL after Subtraction - case NN_jae: // Jump if Above or Equal (CF=0) - case NN_jb: // Jump if Below (CF=1) - case NN_jc: // Jump if Carry (CF=1) - case NN_jnae: // Jump if Not Above or Equal (CF=1) - case NN_jnb: // Jump if Not Below (CF=0) - case NN_jnc: // Jump if Not Carry (CF=0) - case NN_rcl: // Rotate Through Carry Left - case NN_rcr: // Rotate Through Carry Right - case NN_sbb: // Integer Subtraction with Borrow - case NN_setae: // Set Byte if Above or Equal (CF=0) - case NN_setb: // Set Byte if Below (CF=1) - case NN_setc: // Set Byte if Carry (CF=1) - case NN_setnae: // Set Byte if Not Above or Equal (CF=1) - case NN_setnb: // Set Byte if Not Below (CF=0) - case NN_setnc: // Set Byte if Not Carry (CF=0) - case NN_cmovb: // Move if Below (CF=1) - case NN_cmovnb: // Move if Not Below (CF=0) - case NN_fcmovb: // Floating Move if Below - case NN_fcmovnb: // Floating Move if Not Below - case NN_setalc: // Set AL to Carry Flag - case NN_adcx: // Unsigned Integer Addition of Two Operands with Carry Flag + case STARS_NN_adc: // Add with Carry + case STARS_NN_daa: // Decimal Adjust AL after Addition + case STARS_NN_das: // Decimal Adjust AL after Subtraction + case STARS_NN_jae: // Jump if Above or Equal (CF=0) + case STARS_NN_jb: // Jump if Below (CF=1) + case STARS_NN_jc: // Jump if Carry (CF=1) + case STARS_NN_jnae: // Jump if Not Above or Equal (CF=1) + case STARS_NN_jnb: // Jump if Not Below (CF=0) + case STARS_NN_jnc: // Jump if Not Carry (CF=0) + case STARS_NN_rcl: // Rotate Through Carry Left + case STARS_NN_rcr: // Rotate Through Carry Right + case STARS_NN_sbb: // Integer Subtraction with Borrow + case STARS_NN_setae: // Set Byte if Above or Equal (CF=0) + case STARS_NN_setb: // Set Byte if Below (CF=1) + case STARS_NN_setc: // Set Byte if Carry (CF=1) + case STARS_NN_setnae: // Set Byte if Not Above or Equal (CF=1) + case STARS_NN_setnb: // Set Byte if Not Below (CF=0) + case STARS_NN_setnc: // Set Byte if Not Carry (CF=0) + case STARS_NN_cmovb: // Move if Below (CF=1) + case STARS_NN_cmovnb: // Move if Not Below (CF=0) + case STARS_NN_fcmovb: // Floating Move if Below + case STARS_NN_fcmovnb: // Floating Move if Not Below + case STARS_NN_setalc: // Set AL to Carry Flag + case STARS_NN_adcx: // Unsigned Integer Addition of Two Operands with Carry Flag InsertResult = UsedFlags.insert(MD_CARRY_FLAG); break; - case NN_into: // Call to Interrupt Procedure if Overflow Flag = 1 - case NN_jno: // Jump if Not Overflow (OF=0) - case NN_jo: // Jump if Overflow (OF=1) - case NN_setno: // Set Byte if Not Overflow (OF=0) - case NN_seto: // Set Byte if Overflow (OF=1) - case NN_cmovno: // Move if Not Overflow (OF=0) - case NN_cmovo: // Move if Overflow (OF=1) - case NN_adox: // Unsigned Integer Addition of Two Operands with Overflow Flag + case STARS_NN_into: // Call to Interrupt Procedure if Overflow Flag = 1 + case STARS_NN_jno: // Jump if Not Overflow (OF=0) + case STARS_NN_jo: // Jump if Overflow (OF=1) + case STARS_NN_setno: // Set Byte if Not Overflow (OF=0) + case STARS_NN_seto: // Set Byte if Overflow (OF=1) + case STARS_NN_cmovno: // Move if Not Overflow (OF=0) + case STARS_NN_cmovo: // Move if Overflow (OF=1) + case STARS_NN_adox: // Unsigned Integer Addition of Two Operands with Overflow Flag InsertResult = UsedFlags.insert(MD_OVERFLOW_FLAG); break; - case NN_ja: // Jump if Above (CF=0 & ZF=0) - case NN_jbe: // Jump if Below or Equal (CF=1 | ZF=1) - case NN_jna: // Jump if Not Above (CF=1 | ZF=1) - case NN_jnbe: // Jump if Not Below or Equal (CF=0 & ZF=0) a.k.a. ja - case NN_seta: // Set Byte if Above (CF=0 & ZF=0) - case NN_setbe: // Set Byte if Below or Equal (CF=1 | ZF=1) - case NN_setna: // Set Byte if Not Above (CF=1 | ZF=1) - case NN_setnbe: // Set Byte if Not Below or Equal (CF=0 & ZF=0) - case NN_cmova: // Move if Above (CF=0 & ZF=0) - case NN_cmovbe: // Move if Below or Equal (CF=1 | ZF=1) - case NN_fcmovbe: // Floating Move if Below or Equal - case NN_fcmovnbe: // Floating Move if Not Below or Equal + case STARS_NN_ja: // Jump if Above (CF=0 & ZF=0) + case STARS_NN_jbe: // Jump if Below or Equal (CF=1 | ZF=1) + case STARS_NN_jna: // Jump if Not Above (CF=1 | ZF=1) + case STARS_NN_jnbe: // Jump if Not Below or Equal (CF=0 & ZF=0) a.k.a. ja + case STARS_NN_seta: // Set Byte if Above (CF=0 & ZF=0) + case STARS_NN_setbe: // Set Byte if Below or Equal (CF=1 | ZF=1) + case STARS_NN_setna: // Set Byte if Not Above (CF=1 | ZF=1) + case STARS_NN_setnbe: // Set Byte if Not Below or Equal (CF=0 & ZF=0) + case STARS_NN_cmova: // Move if Above (CF=0 & ZF=0) + case STARS_NN_cmovbe: // Move if Below or Equal (CF=1 | ZF=1) + case STARS_NN_fcmovbe: // Floating Move if Below or Equal + case STARS_NN_fcmovnbe: // Floating Move if Not Below or Equal InsertResult = UsedFlags.insert(MD_CARRY_FLAG); InsertResult = UsedFlags.insert(MD_ZERO_FLAG); break; - case NN_ins: // Input string; uses ZERO_FLAG if REPE/REPNE/REPZ/REPNZ prefix is used - case NN_je: // Jump if Equal (ZF=1) - case NN_jne: // Jump if Not Equal (ZF=0) - case NN_jnz: // Jump if Not Zero (ZF=0) a.k.a. jne - case NN_jz: // Jump if Zero (ZF=1) - case NN_lods: // Load string; uses ZERO_FLAG if REPE/REPNE/REPZ/REPNZ prefix is used - case NN_loopwe: // Loop while CX != 0 and ZF=1 - case NN_loope: // Loop while rCX != 0 and ZF=1 - case NN_loopde: // Loop while ECX != 0 and ZF=1 - case NN_loopqe: // Loop while RCX != 0 and ZF=1 - case NN_loopwne: // Loop while CX != 0 and ZF=0 - case NN_loopne: // Loop while rCX != 0 and ZF=0 - case NN_loopdne: // Loop while ECX != 0 and ZF=0 - case NN_loopqne: // Loop while RCX != 0 and ZF=0 - case NN_movs: // Move Byte(s) from String to String; uses ZERO_FLAG if REPE/REPNE/REPZ/REPNZ prefix is used - case NN_outs: // Output string; uses ZERO_FLAG if REPE/REPNE/REPZ/REPNZ prefix is used - case NN_repe: // Repeat String Operation while ZF=1 - case NN_repne: // Repeat String Operation while ZF=0 - case NN_scas: // Scan String; uses ZERO_FLAG if REPE/REPNE/REPZ/REPNZ prefix is used - case NN_sete: // Set Byte if Equal (ZF=1) - case NN_setne: // Set Byte if Not Equal (ZF=0) - case NN_setnz: // Set Byte if Not Zero (ZF=0) - case NN_setz: // Set Byte if Zero (ZF=1) - case NN_stos: // Store String; uses ZERO_FLAG if REPE/REPNE/REPZ/REPNZ prefix is used - case NN_cmovnz: // Move if Not Zero (ZF=0) - case NN_cmovz: // Move if Zero (ZF=1) - case NN_fcmove: // Floating Move if Equal - case NN_fcmovne: // Floating Move if Not Equal + case STARS_NN_ins: // Input string; uses ZERO_FLAG if REPE/REPNE/REPZ/REPNZ prefix is used + case STARS_NN_je: // Jump if Equal (ZF=1) + case STARS_NN_jne: // Jump if Not Equal (ZF=0) + case STARS_NN_jnz: // Jump if Not Zero (ZF=0) a.k.a. jne + case STARS_NN_jz: // Jump if Zero (ZF=1) + case STARS_NN_lods: // Load string; uses ZERO_FLAG if REPE/REPNE/REPZ/REPNZ prefix is used + case STARS_NN_loopwe: // Loop while CX != 0 and ZF=1 + case STARS_NN_loope: // Loop while rCX != 0 and ZF=1 + case STARS_NN_loopde: // Loop while ECX != 0 and ZF=1 + case STARS_NN_loopqe: // Loop while RCX != 0 and ZF=1 + case STARS_NN_loopwne: // Loop while CX != 0 and ZF=0 + case STARS_NN_loopne: // Loop while rCX != 0 and ZF=0 + case STARS_NN_loopdne: // Loop while ECX != 0 and ZF=0 + case STARS_NN_loopqne: // Loop while RCX != 0 and ZF=0 + case STARS_NN_movs: // Move Byte(s) from String to String; uses ZERO_FLAG if REPE/REPNE/REPZ/REPNZ prefix is used + case STARS_NN_outs: // Output string; uses ZERO_FLAG if REPE/REPNE/REPZ/REPNZ prefix is used + case STARS_NN_repe: // Repeat String Operation while ZF=1 + case STARS_NN_repne: // Repeat String Operation while ZF=0 + case STARS_NN_scas: // Scan String; uses ZERO_FLAG if REPE/REPNE/REPZ/REPNZ prefix is used + case STARS_NN_sete: // Set Byte if Equal (ZF=1) + case STARS_NN_setne: // Set Byte if Not Equal (ZF=0) + case STARS_NN_setnz: // Set Byte if Not Zero (ZF=0) + case STARS_NN_setz: // Set Byte if Zero (ZF=1) + case STARS_NN_stos: // Store String; uses ZERO_FLAG if REPE/REPNE/REPZ/REPNZ prefix is used + case STARS_NN_cmovnz: // Move if Not Zero (ZF=0) + case STARS_NN_cmovz: // Move if Zero (ZF=1) + case STARS_NN_fcmove: // Floating Move if Equal + case STARS_NN_fcmovne: // Floating Move if Not Equal InsertResult = UsedFlags.insert(MD_ZERO_FLAG); break; - case NN_jge: // Jump if Greater or Equal (SF=OF) - case NN_jl: // Jump if Less (SF!=OF) - case NN_jnge: // Jump if Not Greater or Equal (SF != OF) ** - case NN_jnl: // Jump if Not Less (SF=OF) a.k.a. jge - case NN_setge: // Set Byte if Greater or Equal (SF=OF) - case NN_setl: // Set Byte if Less (SF!=OF) - case NN_setnge: // Set Byte if Not Greater or Equal (SF!=OF) - case NN_setnl: // Set Byte if Not Less (SF=OF) - case NN_cmovge: // Move if Greater or Equal (SF=OF) - case NN_cmovl: // Move if Less (SF!=OF) + case STARS_NN_jge: // Jump if Greater or Equal (SF=OF) + case STARS_NN_jl: // Jump if Less (SF!=OF) + case STARS_NN_jnge: // Jump if Not Greater or Equal (SF != OF) ** + case STARS_NN_jnl: // Jump if Not Less (SF=OF) a.k.a. jge + case STARS_NN_setge: // Set Byte if Greater or Equal (SF=OF) + case STARS_NN_setl: // Set Byte if Less (SF!=OF) + case STARS_NN_setnge: // Set Byte if Not Greater or Equal (SF!=OF) + case STARS_NN_setnl: // Set Byte if Not Less (SF=OF) + case STARS_NN_cmovge: // Move if Greater or Equal (SF=OF) + case STARS_NN_cmovl: // Move if Less (SF!=OF) InsertResult = UsedFlags.insert(MD_SIGN_FLAG); InsertResult = UsedFlags.insert(MD_OVERFLOW_FLAG); break; - case NN_jg: // Jump if Greater (ZF=0 & SF=OF) - case NN_jle: // Jump if Less or Equal (ZF=1 | SF!=OF) - case NN_jng: // Jump if Not Greater (ZF=1 | SF!=OF) a.k.a. jle - case NN_jnle: // Jump if Not Less or Equal (ZF=0 & SF=OF) a.k.a. jg - case NN_setg: // Set Byte if Greater (ZF=0 & SF=OF) - case NN_setle: // Set Byte if Less or Equal (ZF=1 | SF!=OF) - case NN_setng: // Set Byte if Not Greater (ZF=1 | SF!=OF) - case NN_setnle: // Set Byte if Not Less or Equal (ZF=0 & SF=OF) - case NN_cmovg: // Move if Greater (ZF=0 & SF=OF) - case NN_cmovle: // Move if Less or Equal (ZF=1 | SF!=OF) + case STARS_NN_jg: // Jump if Greater (ZF=0 & SF=OF) + case STARS_NN_jle: // Jump if Less or Equal (ZF=1 | SF!=OF) + case STARS_NN_jng: // Jump if Not Greater (ZF=1 | SF!=OF) a.k.a. jle + case STARS_NN_jnle: // Jump if Not Less or Equal (ZF=0 & SF=OF) a.k.a. jg + case STARS_NN_setg: // Set Byte if Greater (ZF=0 & SF=OF) + case STARS_NN_setle: // Set Byte if Less or Equal (ZF=1 | SF!=OF) + case STARS_NN_setng: // Set Byte if Not Greater (ZF=1 | SF!=OF) + case STARS_NN_setnle: // Set Byte if Not Less or Equal (ZF=0 & SF=OF) + case STARS_NN_cmovg: // Move if Greater (ZF=0 & SF=OF) + case STARS_NN_cmovle: // Move if Less or Equal (ZF=1 | SF!=OF) InsertResult = UsedFlags.insert(MD_ZERO_FLAG); InsertResult = UsedFlags.insert(MD_SIGN_FLAG); InsertResult = UsedFlags.insert(MD_OVERFLOW_FLAG); break; - case NN_jns: // Jump if Not Sign (SF=0) - case NN_js: // Jump if Sign (SF=1) - case NN_setns: // Set Byte if Not Sign (SF=0) - case NN_sets: // Set Byte if Sign (SF=1) - case NN_cmovns: // Move if Not Sign (SF=0) - case NN_cmovs: // Move if Sign (SF=1) + case STARS_NN_jns: // Jump if Not Sign (SF=0) + case STARS_NN_js: // Jump if Sign (SF=1) + case STARS_NN_setns: // Set Byte if Not Sign (SF=0) + case STARS_NN_sets: // Set Byte if Sign (SF=1) + case STARS_NN_cmovns: // Move if Not Sign (SF=0) + case STARS_NN_cmovs: // Move if Sign (SF=1) InsertResult = UsedFlags.insert(MD_SIGN_FLAG); break; - case NN_lahf: // Load Flags into AH Register + case STARS_NN_lahf: // Load Flags into AH Register InsertResult = UsedFlags.insert(MD_CARRY_FLAG); InsertResult = UsedFlags.insert(MD_ZERO_FLAG); InsertResult = UsedFlags.insert(MD_SIGN_FLAG); break; - case NN_pushfw: // Push Flags Register onto the Stack - case NN_pushf: // Push Flags Register onto the Stack - case NN_pushfd: // Push Flags Register onto the Stack (use32) - case NN_pushfq: // Push Flags Register onto the Stack (use64) + case STARS_NN_pushfw: // Push Flags Register onto the Stack + case STARS_NN_pushf: // Push Flags Register onto the Stack + case STARS_NN_pushfd: // Push Flags Register onto the Stack (use32) + case STARS_NN_pushfq: // Push Flags Register onto the Stack (use64) InsertResult = UsedFlags.insert(MD_CARRY_FLAG); InsertResult = UsedFlags.insert(MD_ZERO_FLAG); InsertResult = UsedFlags.insert(MD_SIGN_FLAG); @@ -12835,7 +12840,7 @@ bool SMPInstr::BuildUnaryRTL(SMPoperator UnaryOp) { TempRT->SetRightTree(RightRT); this->RTL.push_back(TempRT); } - else if ((NN_clc == opcode) || (NN_cld == opcode) || (NN_cmc == opcode) || (NN_stc == opcode) || (NN_std == opcode)) { + else if ((STARS_NN_clc == opcode) || (STARS_NN_cld == opcode) || (STARS_NN_cmc == opcode) || (STARS_NN_stc == opcode) || (STARS_NN_std == opcode)) { // Flags register is implicit destination. DestFound = true; TempRT = new SMPRegTransfer; @@ -12844,7 +12849,7 @@ bool SMPInstr::BuildUnaryRTL(SMPoperator UnaryOp) { TempRT->SetOperator(SMP_ASSIGN); SMPRegTransfer *RightRT = new SMPRegTransfer; RightRT->SetParentInst(this); - if (NN_cmc == opcode) { // complement carry flag USEs old carry flag + if (STARS_NN_cmc == opcode) { // complement carry flag USEs old carry flag RightRT->SetLeftOperand(FlagsOp); RightRT->SetOperator(SMP_BITWISE_NOT); } @@ -12980,8 +12985,8 @@ bool SMPInstr::BuildBinaryRTL(SMPoperator BinaryOp, bool HiddenFPStackOp) { bool SrcIsReallyDest = ((SMP_COMPARE_EQ_AND_SET <= BinaryOp) && (SMP_COMPARE_LE_AND_SET >= BinaryOp)); bool StackPointerModification = false; // SP := SP SMP_BITWISE_AND operand - bool NeedsGuard = ((NN_arpl == opcode) || (NN_bound == opcode)); - bool BuildOnlySignalRT = (NN_bound == opcode); + bool NeedsGuard = ((STARS_NN_arpl == opcode) || (STARS_NN_bound == opcode)); + bool BuildOnlySignalRT = (STARS_NN_bound == opcode); SMPRegTransfer *TempRT = NULL; SMPRegTransfer *RightRT = new SMPRegTransfer; SMPGuard *Guard1 = NULL; @@ -13130,7 +13135,7 @@ bool SMPInstr::BuildBinaryRTL(SMPoperator BinaryOp, bool HiddenFPStackOp) { this->RTL.push_back(TempRT); // The "p" at the end of the opcode indicates that the floating point // register stack gets popped. - if ((NN_fstp == opcode) || (NN_fbstp == opcode) || (NN_fistp == opcode)) { + if ((STARS_NN_fstp == opcode) || (STARS_NN_fbstp == opcode) || (STARS_NN_fistp == opcode)) { this->RTL.ExtraKills.push_back(FPRegOp); } } @@ -13327,8 +13332,8 @@ bool SMPInstr::BuildBinaryIgnoreImmedRTL(SMPoperator BinaryOp) { bool MemSrc = this->HasSourceMemoryOperand(); bool MemDest = this->HasDestMemoryOperand(); unsigned short opcode = this->GetIDAOpcode(); - bool ECXDest = ((NN_pcmpestri == opcode) || (NN_pcmpistri == opcode)); - bool XMM0Dest = ((NN_pcmpestrm == opcode) || (NN_pcmpistrm == opcode)); + bool ECXDest = ((STARS_NN_pcmpestri == opcode) || (STARS_NN_pcmpistri == opcode)); + bool XMM0Dest = ((STARS_NN_pcmpestrm == opcode) || (STARS_NN_pcmpistrm == opcode)); bool SrcIsReallyDest = (ECXDest || XMM0Dest); // Dest is implicit, so ASM only has source operand SMPRegTransfer *TempRT = NULL; SMPRegTransfer *RightRT = new SMPRegTransfer; @@ -13346,11 +13351,11 @@ bool SMPInstr::BuildBinaryIgnoreImmedRTL(SMPoperator BinaryOp) { TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); if (ECXDest) { - STARSOpndTypePtr ECXOp = this->STARSInstPtr->MakeRegOpnd(R_cx); + STARSOpndTypePtr ECXOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_cx); TempRT->SetLeftOperand(ECXOp); } else if (XMM0Dest) { - STARSOpndTypePtr XMMOp = this->STARSInstPtr->MakeXMMRegOpnd(R_xmm0); + STARSOpndTypePtr XMMOp = this->STARSInstPtr->MakeXMMRegOpnd(STARS_x86_R_xmm0); TempRT->SetLeftOperand(XMMOp); } else { @@ -13503,12 +13508,12 @@ bool SMPInstr::BuildLeaRTL(void) { AssignRT->SetLeftOperand(DefOp); AssignRT->SetOperator(SMP_ASSIGN); - ScaledIndexReg = ((ScaleFactor > 0) && (IndexReg != R_none)); + ScaledIndexReg = ((ScaleFactor > 0) && (IndexReg != STARS_x86_R_none)); STARSOpndTypePtr BaseOp = nullptr; - if (BaseReg != R_none) + if (BaseReg != STARS_x86_R_none) BaseOp = this->STARSInstPtr->MakeRegOpnd(BaseReg); STARSOpndTypePtr IndexOp = nullptr; - if (IndexReg != R_none) + if (IndexReg != STARS_x86_R_none) IndexOp = this->STARSInstPtr->MakeRegOpnd(IndexReg); STARSOpndTypePtr OffsetOp = this->STARSInstPtr->MakeImmediateOpnd((STARS_uval_t) offset); STARSOpndTypePtr ScaleOp = this->STARSInstPtr->MakeImmediateOpnd((STARS_uval_t) ScaleFactor); @@ -13529,7 +13534,7 @@ bool SMPInstr::BuildLeaRTL(void) { AddOffRT->SetOperator(SMP_ADD); AddOffRT->SetRightTree(MultRT); // Add a BaseReg, if any. - if (R_none != BaseReg) { + if (STARS_x86_R_none != BaseReg) { SMPRegTransfer *AddBaseRT = new SMPRegTransfer; AddBaseRT->SetParentInst(this); AddBaseRT->SetLeftOperand(BaseOp); @@ -13544,7 +13549,7 @@ bool SMPInstr::BuildLeaRTL(void) { } // end if nonzero offset else { // no offset to add // Add a BaseReg, if any. - if (R_none != BaseReg) { + if (STARS_x86_R_none != BaseReg) { SMPRegTransfer *AddBaseRT = new SMPRegTransfer; AddBaseRT->SetParentInst(this); AddBaseRT->SetLeftOperand(BaseOp); @@ -13560,14 +13565,14 @@ bool SMPInstr::BuildLeaRTL(void) { } // end if ScaleIndexReg else { // no scaled index register if (0 != offset) { - if (R_none != IndexReg) { + if (STARS_x86_R_none != IndexReg) { SMPRegTransfer *AddOffRT = new SMPRegTransfer; AddOffRT->SetParentInst(this); AddOffRT->SetLeftOperand(OffsetOp); AddOffRT->SetOperator(SMP_ADD); AddOffRT->SetRightOperand(IndexOp); // Add BaseReg, if any. - if (R_none != BaseReg) { + if (STARS_x86_R_none != BaseReg) { SMPRegTransfer *AddBaseRT = new SMPRegTransfer; AddBaseRT->SetParentInst(this); AddBaseRT->SetLeftOperand(BaseOp); @@ -13582,7 +13587,7 @@ bool SMPInstr::BuildLeaRTL(void) { } // end if valid IndexReg else { // no IndexReg // Add BaseReg, if any. - if (R_none != BaseReg) { + if (STARS_x86_R_none != BaseReg) { SMPRegTransfer *AddBaseRT = new SMPRegTransfer; AddBaseRT->SetParentInst(this); AddBaseRT->SetLeftOperand(BaseOp); @@ -13601,14 +13606,14 @@ bool SMPInstr::BuildLeaRTL(void) { } } // end if nonzero offset else { // no offset - if ((R_none == BaseReg) || (R_none == IndexReg)) { + if ((STARS_x86_R_none == BaseReg) || (STARS_x86_R_none == IndexReg)) { SMP_msg("WARNING: lea used as move at %lx for %s\n", (unsigned long) this->GetAddr(), DisAsmText.GetDisAsm(this->GetAddr())); - if (R_none != BaseReg) { + if (STARS_x86_R_none != BaseReg) { AssignRT->SetRightOperand(BaseOp); } else { - if (R_none == IndexReg) { // Should be RegClearIdiom in this case, no longer Lea RTL + if (STARS_x86_R_none == IndexReg) { // Should be RegClearIdiom in this case, no longer Lea RTL assert(this->IsRegClearIdiom()); STARSOpndTypePtr ZeroOp = this->STARSInstPtr->MakeImmediateOpnd(0); AssignRT->SetRightOperand(ZeroOp); @@ -13733,12 +13738,12 @@ bool SMPInstr::BuildMultiplyDivideRTL(SMPoperator BinaryOp) { if (nullptr == TempOp) // finished processing operands break; if (!TempOp->IsVisible()) { // hidden operand - if (TempOp->MatchesReg(R_ax)) { // not R_al, so it is not 8 bits + if (TempOp->MatchesReg(STARS_x86_R_ax)) { // not STARS_x86_R_al, so it is not 8 bits // This form always has a hidden use of EDX:EAX HiddenEAXUse = true; ImplicitEDXUse = true; } - else if (TempOp->MatchesReg(R_al)) { + else if (TempOp->MatchesReg(STARS_x86_R_al)) { // Use of AX register to hold 16-bit result is hidden, // but EDX is not needed to hold result bits. HiddenEAXUse = true; @@ -13793,14 +13798,14 @@ bool SMPInstr::BuildMultiplyDivideRTL(SMPoperator BinaryOp) { EDXRightRT->SetParentInst(this); STARSOpndTypePtr EDXOp = TempRT->GetLeftOperand()->clone(); EDXRT->SetOperator(SMP_ASSIGN); - assert(EDXOp->MatchesReg(R_ax)); - EDXOp->SetReg(R_dx); + assert(EDXOp->MatchesReg(STARS_x86_R_ax)); + EDXOp->SetReg(STARS_x86_R_dx); EDXRT->SetLeftOperand(EDXOp); STARSOpndTypePtr SourceOp = RightRT->GetLeftOperand(); - if ((NN_div == this->GetIDAOpcode()) || (NN_idiv == this->GetIDAOpcode())) { + if ((STARS_NN_div == this->GetIDAOpcode()) || (STARS_NN_idiv == this->GetIDAOpcode())) { // Need to change left operand of RightRT to EDX. i.e. we are // changing the effect from eax := eax DIV foo to edx := edx DIV foo. - assert(SourceOp->MatchesReg(R_ax)); + assert(SourceOp->MatchesReg(STARS_x86_R_ax)); EDXRightRT->SetLeftOperand(EDXOp); } else { // just use same source operands for multiplies @@ -13883,8 +13888,8 @@ bool SMPInstr::BuildBinaryPlusFlagsRTL(SMPoperator BinaryOp) { return (DestFound && SourceFound); } // end of SMPInstr::BuildBinaryPlusFlagsRTL() -#define SMP_FIRST_SET_OPCODE NN_seta -#define SMP_LAST_SET_OPCODE NN_setz +#define SMP_FIRST_SET_OPCODE STARS_NN_seta +#define SMP_LAST_SET_OPCODE STARS_NN_setz // Build the RTL for an instruction of form dest := unary_operator(source), dest != source bool SMPInstr::BuildUnary2OpndRTL(SMPoperator UnaryOp) { std::size_t OpNum; @@ -13895,13 +13900,13 @@ bool SMPInstr::BuildUnary2OpndRTL(SMPoperator UnaryOp) { SMPRegTransfer *RightRT = new SMPRegTransfer; RightRT->SetParentInst(this); unsigned short opcode = this->GetIDAOpcode(); - bool ExtendedMove = ((NN_movsx == opcode) || (NN_movzx == opcode) || (NN_movsxd == opcode)); + bool ExtendedMove = ((STARS_NN_movsx == opcode) || (STARS_NN_movzx == opcode) || (STARS_NN_movsxd == opcode)); STARSOpndTypePtr VoidOp = this->STARSInstPtr->MakeVoidOpnd(); STARSOpndTypePtr FlagsOp = this->STARSInstPtr->MakeRegOpnd(X86_FLAGS_REG); - STARSOpndTypePtr PortNumOp = this->STARSInstPtr->MakeRegOpnd(R_dx); + STARSOpndTypePtr PortNumOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_dx); PortNumOp->SetByteWidth(2); // always DX, 16-bit - STARSOpndTypePtr PortDataOp = this->STARSInstPtr->MakeRegOpnd(R_ax); + STARSOpndTypePtr PortDataOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_ax); // Handle special cases first. if ((SMP_FIRST_SET_OPCODE <= opcode) && (SMP_LAST_SET_OPCODE >= opcode)) { @@ -13917,7 +13922,7 @@ bool SMPInstr::BuildUnary2OpndRTL(SMPoperator UnaryOp) { if (this->STARSInstPtr->IsDefOpnd(OpNum)) { // DEF if (MDKnownOperandType(TempOp)) { DestFound = true; - if (NN_in == opcode) { + if (STARS_NN_in == opcode) { #if 0 SMP_msg("ERROR: Explicit DEF for IN from port opcode at %x : ", this->GetAddr()); PrintOperand(TempOp); @@ -13926,7 +13931,7 @@ bool SMPInstr::BuildUnary2OpndRTL(SMPoperator UnaryOp) { TempRT->SetLeftOperand(TempOp); TempRT->SetOperator(UnaryOp); } - else if (NN_out == opcode) { + else if (STARS_NN_out == opcode) { TempRT->SetLeftOperand(TempOp); TempRT->SetOperator(UnaryOp); } @@ -13942,10 +13947,10 @@ bool SMPInstr::BuildUnary2OpndRTL(SMPoperator UnaryOp) { else { // USE if (MDKnownOperandType(TempOp)) { SourceFound = true; - if (NN_in == opcode) { + if (STARS_NN_in == opcode) { TempRT->SetRightOperand(TempOp); } - else if (NN_out == opcode) { + else if (STARS_NN_out == opcode) { #if 0 SMP_msg("ERROR: Explicit USE for OUT to port opcode at %x : ", this->GetAddr()); PrintOperand(TempOp); @@ -13962,13 +13967,13 @@ bool SMPInstr::BuildUnary2OpndRTL(SMPoperator UnaryOp) { } } // end for (OpNum = 0; ...) - if (!SourceFound && (NN_in == opcode)) { + if (!SourceFound && (STARS_NN_in == opcode)) { // Input from port is implicitly from port # in DX register if not // specified with an immediate operand. SourceFound = true; TempRT->SetRightOperand(PortNumOp); } - if (!DestFound && (NN_in == opcode)) { + if (!DestFound && (STARS_NN_in == opcode)) { // Input from port is implicitly to register AL, AX, or EAX // depending on the opcode and bit width mode. // NOTE: Two different machine codes for 8-bit and 32-bit widths. @@ -13977,7 +13982,7 @@ bool SMPInstr::BuildUnary2OpndRTL(SMPoperator UnaryOp) { TempRT->SetLeftOperand(PortDataOp); TempRT->SetOperator(UnaryOp); } - if (!DestFound && (NN_out == opcode)) { + if (!DestFound && (STARS_NN_out == opcode)) { // Output to port is implicitly to port # in DX register if not // specified with an immediate operand. // NOTE: Two different machine codes for 8-bit and 32-bit widths. @@ -13986,7 +13991,7 @@ bool SMPInstr::BuildUnary2OpndRTL(SMPoperator UnaryOp) { TempRT->SetLeftOperand(PortNumOp); TempRT->SetOperator(SMP_ASSIGN); } - if (!SourceFound && (NN_out == opcode)) { + if (!SourceFound && (STARS_NN_out == opcode)) { // Output to port is implicitly from register AL, AX, or EAX // depending on the opcode and bit width mode. SourceFound = true; @@ -14005,7 +14010,7 @@ bool SMPInstr::BuildUnary2OpndRTL(SMPoperator UnaryOp) { } else { this->RTL.push_back(TempRT); - if ((NN_in == opcode) || (NN_out == opcode)) + if ((STARS_NN_in == opcode) || (STARS_NN_out == opcode)) delete RightRT; // unused for port I/O } return (DestFound && SourceFound); @@ -14028,58 +14033,58 @@ bool SMPInstr::BuildLoopRTL(SMPoperator GuardOp) { STARSOpndTypePtr CountOp = nullptr; switch (this->GetIDAOpcode()) { - case NN_loopw: // Loop while ECX != 0 + case STARS_NN_loopw: // Loop while ECX != 0 CounterByteWidth = 4; break; - case NN_loop: // Loop while CX != 0 - CounterByteWidth = STARS_ISA_Bytewidth; + case STARS_NN_loop: // Loop while CX != 0 + CounterByteWidth = global_STARS_program->GetSTARS_ISA_Bytewidth(); break; - case NN_loopd: // Loop while ECX != 0 + case STARS_NN_loopd: // Loop while ECX != 0 CounterByteWidth = 4; break; - case NN_loopq: // Loop while RCX != 0 + case STARS_NN_loopq: // Loop while RCX != 0 CounterByteWidth = 8; break; - case NN_loopwe: // Loop while CX != 0 and ZF=1 + case STARS_NN_loopwe: // Loop while CX != 0 and ZF=1 CounterByteWidth = 2; EqFlag = true; break; - case NN_loope: // Loop while rCX != 0 and ZF=1 - CounterByteWidth = STARS_ISA_Bytewidth; + case STARS_NN_loope: // Loop while rCX != 0 and ZF=1 + CounterByteWidth = global_STARS_program->GetSTARS_ISA_Bytewidth(); EqFlag = true; break; - case NN_loopde: // Loop while ECX != 0 and ZF=1 + case STARS_NN_loopde: // Loop while ECX != 0 and ZF=1 CounterByteWidth = 4; EqFlag = true; break; - case NN_loopqe: // Loop while RCX != 0 and ZF=1 + case STARS_NN_loopqe: // Loop while RCX != 0 and ZF=1 CounterByteWidth = 8; EqFlag = true; break; - case NN_loopwne: // Loop while CX != 0 and ZF=0 + case STARS_NN_loopwne: // Loop while CX != 0 and ZF=0 CounterByteWidth = 2; NeqFlag = true; break; - case NN_loopne: // Loop while rCX != 0 and ZF=0 - CounterByteWidth = STARS_ISA_Bytewidth; + case STARS_NN_loopne: // Loop while rCX != 0 and ZF=0 + CounterByteWidth = global_STARS_program->GetSTARS_ISA_Bytewidth(); NeqFlag = true; break; - case NN_loopdne: // Loop while ECX != 0 and ZF=0 + case STARS_NN_loopdne: // Loop while ECX != 0 and ZF=0 CounterByteWidth = 4; NeqFlag = true; break; - case NN_loopqne: // Loop while RCX != 0 and ZF=0 + case STARS_NN_loopqne: // Loop while RCX != 0 and ZF=0 CounterByteWidth = 8; NeqFlag = true; break; @@ -14092,10 +14097,10 @@ bool SMPInstr::BuildLoopRTL(SMPoperator GuardOp) { OneOp->SetByteWidth(CounterByteWidth); if (CounterByteWidth == 1) { - CountOp = this->STARSInstPtr->MakeRegOpnd(R_cl); + CountOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_cl); } else { - CountOp = this->STARSInstPtr->MakeRegOpnd(R_cx); + CountOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_cx); CountOp->SetByteWidth(CounterByteWidth); } @@ -14183,7 +14188,7 @@ bool SMPInstr::BuildMoveRTL(SMPoperator GuardOp) { unsigned short opcode = this->GetIDAOpcode(); #if IDA_SDK_VERSION < 600 - if ((NN_ldmxcsr == opcode) || (NN_stmxcsr == opcode)) { + if ((STARS_NN_ldmxcsr == opcode) || (STARS_NN_stmxcsr == opcode)) { // IDA 5.1 does not have the R_mxcsr enumeration value, // so we cannot handle these opcodes. return false; @@ -14193,23 +14198,23 @@ bool SMPInstr::BuildMoveRTL(SMPoperator GuardOp) { SMPRegTransfer *TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); - STARSOpndTypePtr EAXOp = this->STARSInstPtr->MakeRegOpnd(R_ax); - STARSOpndTypePtr ALOp = this->STARSInstPtr->MakeRegOpnd(R_al); + STARSOpndTypePtr EAXOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_ax); + STARSOpndTypePtr ALOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_al); STARSOpndTypePtr FlagsOp = this->STARSInstPtr->MakeRegOpnd(X86_FLAGS_REG); STARSOpndTypePtr FPRegOp = this->STARSInstPtr->MakeFloatingPointRegOpnd(MD_FIRST_FP_STACK_REG); - STARSOpndTypePtr PortNumOp = this->STARSInstPtr->MakeRegOpnd(R_dx); - STARSOpndTypePtr PortDataOp = this->STARSInstPtr->MakeRegOpnd(R_ax); + STARSOpndTypePtr PortNumOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_dx); + STARSOpndTypePtr PortDataOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_ax); #if SMP_DEBUG_BUILD_RTL - if (MemSrc && MemDest && (NN_movs != opcode) && (NN_movss != opcode) && (NN_movsd != opcode)) { - if ((NN_stos != opcode) && (NN_outs != opcode)) { + if (MemSrc && MemDest && (STARS_NN_movs != opcode) && (STARS_NN_movss != opcode) && (STARS_NN_movsd != opcode)) { + if ((STARS_NN_stos != opcode) && (STARS_NN_outs != opcode)) { SMP_msg("ERROR: IDA Pro error: MemDest and MemSrc in move at %lx for %s\n", (unsigned long) this->GetAddr(), DisAsmText.GetDisAsm(this->GetAddr())); this->PrintOperands(); } #if 1 else { // IDA incorrectly lists [EDI] as both DEF and USE, because reg EDI - // is both DEF and USE in NN_stos. + // is both DEF and USE in STARS_NN_stos. SMP_msg("WARNING: Ignoring IDA Pro error: MemDest and MemSrc in move at %lx for %s\n", (unsigned long) this->GetAddr(), DisAsmText.GetDisAsm(this->GetAddr())); this->PrintOperands(); @@ -14219,30 +14224,30 @@ bool SMPInstr::BuildMoveRTL(SMPoperator GuardOp) { #endif // First, handle special cases with implicit operands - if (NN_lahf == opcode) { // load AH from flags + if (STARS_NN_lahf == opcode) { // load AH from flags TempRT->SetOperator(SMP_ASSIGN); TempRT->SetLeftOperand(EAXOp); TempRT->SetRightOperand(FlagsOp); this->RTL.push_back(TempRT); return true; } - if (NN_sahf == opcode) { // store AH to flags + if (STARS_NN_sahf == opcode) { // store AH to flags TempRT->SetOperator(SMP_ASSIGN); TempRT->SetLeftOperand(FlagsOp); TempRT->SetRightOperand(EAXOp); this->RTL.push_back(TempRT); return true; } - if ((NN_movs == opcode) || (NN_stos == opcode) || (NN_ins == opcode) || (NN_outs == opcode)) { + if ((STARS_NN_movs == opcode) || (STARS_NN_stos == opcode) || (STARS_NN_ins == opcode) || (STARS_NN_outs == opcode)) { // The ESI and EDI registers get incremented or decremented, depending // on the direction flag DF, for MOVS; only EDI for STOS and INS; // only ESI for OUTS. // This is true with or without a repeat prefix. - STARSOpndTypePtr ESIOp = this->STARSInstPtr->MakeRegOpnd(R_si); - STARSOpndTypePtr EDIOp = this->STARSInstPtr->MakeRegOpnd(R_di); - STARSOpndTypePtr ESIMemOp = this->STARSInstPtr->MakeMemPhraseOpnd(R_si, R_none, 0); // [esi] - STARSOpndTypePtr EDIMemOp = this->STARSInstPtr->MakeMemPhraseOpnd(R_di, R_none, 0); // [edi] - if (NN_movs == opcode) { + STARSOpndTypePtr ESIOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_si); + STARSOpndTypePtr EDIOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_di); + STARSOpndTypePtr ESIMemOp = this->STARSInstPtr->MakeMemPhraseOpnd(STARS_x86_R_si, STARS_x86_R_none, 0); // [esi] + STARSOpndTypePtr EDIMemOp = this->STARSInstPtr->MakeMemPhraseOpnd(STARS_x86_R_di, STARS_x86_R_none, 0); // [edi] + if (STARS_NN_movs == opcode) { this->RTL.ExtraKills.push_back(ESIOp); this->RTL.ExtraKills.push_back(EDIOp); TempRT->SetOperator(SMP_ASSIGN); @@ -14251,14 +14256,14 @@ bool SMPInstr::BuildMoveRTL(SMPoperator GuardOp) { DestFound = true; SourceFound = true; } - else if (NN_stos == opcode) { + else if (STARS_NN_stos == opcode) { this->RTL.ExtraKills.push_back(EDIOp); TempRT->SetOperator(SMP_ASSIGN); TempRT->SetLeftOperand(EDIMemOp); TempRT->SetRightOperand(ALOp); // default in case we don't find source later DestFound = true; } - else if (NN_ins == opcode) { + else if (STARS_NN_ins == opcode) { this->RTL.ExtraKills.push_back(EDIOp); TempRT->SetOperator(SMP_INPUT); TempRT->SetLeftOperand(EDIMemOp); @@ -14266,7 +14271,7 @@ bool SMPInstr::BuildMoveRTL(SMPoperator GuardOp) { DestFound = true; SourceFound = true; } - else if (NN_outs == opcode) { + else if (STARS_NN_outs == opcode) { this->RTL.ExtraKills.push_back(ESIOp); TempRT->SetOperator(SMP_OUTPUT); TempRT->SetLeftOperand(ESIMemOp); @@ -14280,33 +14285,33 @@ bool SMPInstr::BuildMoveRTL(SMPoperator GuardOp) { // an implicit source or destination, but the other operand of the load or store // is explicit, so we set the implicit operand and let control flow pass to the // main processing loop below. - if ((NN_fld == opcode) || (NN_fbld == opcode) || (NN_fild == opcode)) { + if ((STARS_NN_fld == opcode) || (STARS_NN_fbld == opcode) || (STARS_NN_fild == opcode)) { // Loads implicitly use the floating point stack top as destination. TempRT->SetLeftOperand(FPRegOp); TempRT->SetOperator(SMP_ASSIGN); DestFound = true; } - else if ((NN_fst == opcode) || (NN_fstp == opcode) || (NN_fbstp == opcode) - || (NN_fist == opcode) || (NN_fistp == opcode)) { + else if ((STARS_NN_fst == opcode) || (STARS_NN_fstp == opcode) || (STARS_NN_fbstp == opcode) + || (STARS_NN_fist == opcode) || (STARS_NN_fistp == opcode)) { // Stores implicitly use the floating point stack top as source TempRT->SetRightOperand(FPRegOp); SourceFound = true; // The "p" at the end of the opcode indicates that the floating point // register stack gets popped. - if ((NN_fstp == opcode) || (NN_fbstp == opcode) || (NN_fistp == opcode)) { + if ((STARS_NN_fstp == opcode) || (STARS_NN_fbstp == opcode) || (STARS_NN_fistp == opcode)) { this->RTL.ExtraKills.push_back(FPRegOp); } } #if IDA_SDK_VERSION > 599 - else if (NN_ldmxcsr == opcode) { + else if (STARS_NN_ldmxcsr == opcode) { // The MMX Control & Status Register is used implicitly. - STARSOpndTypePtr MXCSROp = this->STARSInstPtr->MakeRegOpnd(R_mxcsr); // MMX Control & Status Register + STARSOpndTypePtr MXCSROp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_mxcsr); // MMX Control & Status Register TempRT->SetLeftOperand(MXCSROp); DestFound = true; } - else if (NN_stmxcsr == opcode) { + else if (STARS_NN_stmxcsr == opcode) { // The MMX Control & Status Register is used implicitly. - STARSOpndTypePtr MXCSROp = this->STARSInstPtr->MakeRegOpnd(R_mxcsr); // MMX Control & Status Register + STARSOpndTypePtr MXCSROp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_mxcsr); // MMX Control & Status Register TempRT->SetRightOperand(MXCSROp); SourceFound = true; } @@ -14383,7 +14388,7 @@ bool SMPInstr::BuildMoveRTL(SMPoperator GuardOp) { // Now, create the repeat prefix effects if (HasRepeatPrefix) { // Must be MOVS or STOS or INS or OUTS // The repeat causes USE and DEF of ECX as a counter - STARSOpndTypePtr CountOp = this->STARSInstPtr->MakeRegOpnd(R_cx); + STARSOpndTypePtr CountOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_cx); STARSOpndTypePtr VoidOp = this->STARSInstPtr->MakeVoidOpnd(); SMPRegTransfer *CounterRT = new SMPRegTransfer; CounterRT->SetParentInst(this); @@ -14416,19 +14421,19 @@ bool SMPInstr::BuildLoadStringRTL(void) { if (MDKnownOperandType(TempOp)) { if ((TempOp->IsRegOp()) && (this->STARSInstPtr->IsDefOpnd(OpNum))) { // DEF DestFound = true; - if (TempOp->MatchesReg(R_al)) { + if (TempOp->MatchesReg(STARS_x86_R_al)) { ByteSize = 1; - DestOp = this->STARSInstPtr->MakeRegOpnd(R_al); + DestOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_al); } - else if (TempOp->MatchesReg(R_ax)) { - ByteSize = STARS_ISA_Bytewidth; - DestOp = this->STARSInstPtr->MakeRegOpnd(R_ax); + else if (TempOp->MatchesReg(STARS_x86_R_ax)) { + ByteSize = global_STARS_program->GetSTARS_ISA_Bytewidth(); + DestOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_ax); } else { SMP_msg("ERROR: Load string destination operand is neither AL nor EAX at %lx\n", (unsigned long) this->GetAddr()); ByteSize = 1; // default to AL destination - DestOp = this->STARSInstPtr->MakeRegOpnd(R_al); + DestOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_al); } } } @@ -14442,8 +14447,8 @@ bool SMPInstr::BuildLoadStringRTL(void) { STARSOpndTypePtr ZeroOp = this->STARSInstPtr->MakeImmediateOpnd(0); STARSOpndTypePtr OneOp = this->STARSInstPtr->MakeImmediateOpnd(1); STARSOpndTypePtr FlagsOp = this->STARSInstPtr->MakeRegOpnd(X86_FLAGS_REG); - STARSOpndTypePtr ESIOp = this->STARSInstPtr->MakeRegOpnd(R_si); - STARSOpndTypePtr DerefESIOp = this->STARSInstPtr->MakeMemPhraseOpnd(R_si, R_none, 0); + STARSOpndTypePtr ESIOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_si); + STARSOpndTypePtr DerefESIOp = this->STARSInstPtr->MakeMemPhraseOpnd(STARS_x86_R_si, STARS_x86_R_none, 0); SMPRegTransfer *TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); @@ -14572,7 +14577,7 @@ bool SMPInstr::BuildCompareStringRTL(void) { CounterRT->SetParentInst(this); SMPRegTransfer *RightRT = new SMPRegTransfer; RightRT->SetParentInst(this); - STARSOpndTypePtr CountOp = this->STARSInstPtr->MakeRegOpnd(R_cx); + STARSOpndTypePtr CountOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_cx); STARSOpndTypePtr VoidOp = this->STARSInstPtr->MakeVoidOpnd(); CounterRT->SetLeftOperand(CountOp); CounterRT->SetOperator(SMP_ASSIGN); @@ -14766,7 +14771,7 @@ bool SMPInstr::BuildCompareExchangeRTL(void) { else { // Create the first effect, if (dest == EAX) dest := src SMPGuard *Guard1 = new SMPGuard; - STARSOpndTypePtr EAXOp = this->STARSInstPtr->MakeRegOpnd(R_ax); + STARSOpndTypePtr EAXOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_ax); Guard1->SetLeftOperand(DestOp); Guard1->SetOperator(SMP_EQUAL); Guard1->SetRightOperand(EAXOp); @@ -14858,7 +14863,7 @@ bool SMPInstr::BuildFlagsDestBinaryRTL(SMPoperator BinaryOp) { unsigned short opcode = this->GetIDAOpcode(); bool Source1Found = false; bool Source2Found = false; - bool NoOperandsRequired = ((NN_scas == opcode) || (NN_cmps == opcode)); + bool NoOperandsRequired = ((STARS_NN_scas == opcode) || (STARS_NN_cmps == opcode)); bool HasRepeatPrefix = this->STARSInstPtr->HasAnyRepeatPrefix(); SMPRegTransfer *TempRT = new SMPRegTransfer; @@ -14872,8 +14877,8 @@ bool SMPInstr::BuildFlagsDestBinaryRTL(SMPoperator BinaryOp) { // an implicit source or destination, but the other operand of the load or store // is explicit, so we set the implicit operand and let control flow pass to the // main processing loop below. - if ((NN_fcomi == opcode) || (NN_fucomi == opcode) || (NN_fcomip == opcode) - || (NN_fucomip == opcode)) { + if ((STARS_NN_fcomi == opcode) || (STARS_NN_fucomi == opcode) || (STARS_NN_fcomip == opcode) + || (STARS_NN_fucomip == opcode)) { // Compares implicitly use the floating point stack top as destination. STARSOpndTypePtr FPRegOp = this->STARSInstPtr->MakeFloatingPointRegOpnd(MD_FIRST_FP_STACK_REG); TempRT->SetLeftOperand(FlagsOp); @@ -14884,7 +14889,7 @@ bool SMPInstr::BuildFlagsDestBinaryRTL(SMPoperator BinaryOp) { Source1Found = true; // The "p" at the end of the opcode indicates that the floating point // register stack gets popped. - if ((NN_fcomip == opcode) || (NN_fucomip == opcode)) { + if ((STARS_NN_fcomip == opcode) || (STARS_NN_fucomip == opcode)) { this->RTL.ExtraKills.push_back(FPRegOp); } } @@ -14944,7 +14949,7 @@ bool SMPInstr::BuildFlagsDestBinaryRTL(SMPoperator BinaryOp) { CounterRT->SetParentInst(this); SMPRegTransfer *RightRT = new SMPRegTransfer; RightRT->SetParentInst(this); - STARSOpndTypePtr CountOp = this->STARSInstPtr->MakeRegOpnd(R_cx); + STARSOpndTypePtr CountOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_cx); CounterRT->SetLeftOperand(CountOp); CounterRT->SetOperator(SMP_ASSIGN); RightRT->SetLeftOperand(CountOp); @@ -14954,15 +14959,15 @@ bool SMPInstr::BuildFlagsDestBinaryRTL(SMPoperator BinaryOp) { CounterRT->SetRightTree(RightRT); this->RTL.push_back(CounterRT); } - if ((NN_cmps == opcode) || (NN_scas == opcode)) { + if ((STARS_NN_cmps == opcode) || (STARS_NN_scas == opcode)) { // The ESI and EDI registers get incremented or decremented, depending // on the direction flag DF, for CMPS; only EDI for SCAS. // This is true with or without a repeat prefix. - if (NN_cmps == opcode) { - STARSOpndTypePtr ESIOp = this->STARSInstPtr->MakeRegOpnd(R_si); + if (STARS_NN_cmps == opcode) { + STARSOpndTypePtr ESIOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_si); this->RTL.ExtraKills.push_back(ESIOp); } - STARSOpndTypePtr EDIOp = this->STARSInstPtr->MakeRegOpnd(R_di); + STARSOpndTypePtr EDIOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_di); this->RTL.ExtraKills.push_back(EDIOp); } } @@ -15015,22 +15020,22 @@ bool SMPInstr::BuildCallRTL(void) { // Build the RTL for a return instruction, with or without extra bytes popped off stack bool SMPInstr::BuildReturnRTL(void) { std::size_t OpNum; - uintptr_t PopBytes = STARS_ISA_Bytewidth; // default: pop off return address + uintptr_t PopBytes = global_STARS_program->GetSTARS_ISA_Bytewidth(); // default: pop off return address switch (this->GetIDAOpcode()) { // Returns modified by operand size prefixes - case NN_retnw: // Return Near from Procedure (use16) - case NN_retfw: // Return Far from Procedure (use16) + case STARS_NN_retnw: // Return Near from Procedure (use16) + case STARS_NN_retfw: // Return Far from Procedure (use16) PopBytes = 2; break; - case NN_retnd: // Return Near from Procedure (use32) - case NN_retfd: // Return Far from Procedure (use32) + case STARS_NN_retnd: // Return Near from Procedure (use32) + case STARS_NN_retfd: // Return Far from Procedure (use32) PopBytes = 4; break; - case NN_retnq: // Return Near from Procedure (use64) - case NN_retfq: // Return Far from Procedure (use64) + case STARS_NN_retnq: // Return Near from Procedure (use64) + case STARS_NN_retfq: // Return Far from Procedure (use64) PopBytes = 8; break; } @@ -15091,9 +15096,9 @@ bool SMPInstr::BuildEnterRTL(void) { STARSOpndTypePtr StackPointerOp = this->STARSInstPtr->MakeRegOpnd(MD_STACK_POINTER_REG); STARSOpndTypePtr FramePointerOp = this->STARSInstPtr->MakeRegOpnd(MD_FRAME_POINTER_REG); - STARSOpndTypePtr ImmedWordSizeOp = this->STARSInstPtr->MakeImmediateOpnd((STARS_uval_t) STARS_ISA_Bytewidth); + STARSOpndTypePtr ImmedWordSizeOp = this->STARSInstPtr->MakeImmediateOpnd((STARS_uval_t) global_STARS_program->GetSTARS_ISA_Bytewidth()); - STARSOpndTypePtr SavedEBP = this->STARSInstPtr->MakeMemDisplacementOpnd(MD_STACK_POINTER_REG, R_none, 0, (-((STARS_ea_t) STARS_ISA_Bytewidth))); + STARSOpndTypePtr SavedEBP = this->STARSInstPtr->MakeMemDisplacementOpnd(MD_STACK_POINTER_REG, STARS_x86_R_none, 0, (-((STARS_ea_t) global_STARS_program->GetSTARS_ISA_Bytewidth()))); // [ESP-4 or 8], location of saved EBP for (OpNum = 0; !(AllocFound && NestingLevelFound) && (OpNum < UA_MAXOP); ++OpNum) { @@ -15163,7 +15168,7 @@ bool SMPInstr::BuildEnterRTL(void) { RightRT = NULL; // Add final effect on stack pointer - AllocBytes += (STARS_ISA_Bytewidth * (NestingLevel + 1)); + AllocBytes += (global_STARS_program->GetSTARS_ISA_Bytewidth() * (NestingLevel + 1)); if (0 != NestingLevel) { SMP_msg("WARNING: Nested procedures in ENTER instruction at %lx : %s\n", (unsigned long) this->GetAddr(), DisAsmText.GetDisAsm(this->GetAddr())); @@ -15184,8 +15189,8 @@ bool SMPInstr::BuildLeaveRTL(void) { // esp := ebp + wordsize; ebp := [ebp+0] as our two parallel effects STARSOpndTypePtr StackPointerOp = this->STARSInstPtr->MakeRegOpnd(MD_STACK_POINTER_REG); STARSOpndTypePtr FramePointerOp = this->STARSInstPtr->MakeRegOpnd(MD_FRAME_POINTER_REG); - STARSOpndTypePtr ImmedWordSizeOp = this->STARSInstPtr->MakeImmediateOpnd((STARS_uval_t) STARS_ISA_Bytewidth); - STARSOpndTypePtr SavedEBP = this->STARSInstPtr->MakeMemDisplacementOpnd(MD_FRAME_POINTER_REG, R_none, 0, 0); + STARSOpndTypePtr ImmedWordSizeOp = this->STARSInstPtr->MakeImmediateOpnd((STARS_uval_t) global_STARS_program->GetSTARS_ISA_Bytewidth()); + STARSOpndTypePtr SavedEBP = this->STARSInstPtr->MakeMemDisplacementOpnd(MD_FRAME_POINTER_REG, STARS_x86_R_none, 0, 0); // Build first effect: ESP := EBP + wordsize SMPRegTransfer *TempRT = new SMPRegTransfer; @@ -15216,13 +15221,13 @@ bool SMPInstr::BuildLeaveRTL(void) { // Build OptCategory 8 RTLs, which set system info into EDX:EAX. bool SMPInstr::BuildOptType8RTL(void) { - STARSOpndTypePtr DestOp1 = this->STARSInstPtr->MakeRegOpnd(R_dx); - STARSOpndTypePtr DestOp2 = this->STARSInstPtr->MakeRegOpnd(R_ax); + STARSOpndTypePtr DestOp1 = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_dx); + STARSOpndTypePtr DestOp2 = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_ax); STARSOpndTypePtr VoidOp = this->STARSInstPtr->MakeVoidOpnd(); STARSOpndTypePtr LeftOp = nullptr; - if (NN_xgetbv == this->GetIDAOpcode()) { + if (STARS_NN_xgetbv == this->GetIDAOpcode()) { // AMD xgetbv opcode gets control register number to read out of ECX. - LeftOp = this->STARSInstPtr->MakeRegOpnd(R_cx); + LeftOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_cx); } else { LeftOp = VoidOp; @@ -15264,8 +15269,8 @@ bool SMPInstr::BuildJumpRTL(SMPoperator CondBranchOp) { std::size_t OpNum; bool TargetFound = false; SMPRegTransfer *TempRT = NULL; - STARSOpndTypePtr EIPOp = this->STARSInstPtr->MakeRegOpnd(R_ip); - STARSOpndTypePtr CountOp = this->STARSInstPtr->MakeRegOpnd(R_cx); + STARSOpndTypePtr EIPOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_ip); + STARSOpndTypePtr CountOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_cx); STARSOpndTypePtr FlagsOp = this->STARSInstPtr->MakeRegOpnd(X86_FLAGS_REG); STARSOpndTypePtr ZeroOp = this->STARSInstPtr->MakeImmediateOpnd(0); @@ -15292,7 +15297,7 @@ bool SMPInstr::BuildJumpRTL(SMPoperator CondBranchOp) { SMPGuard *BranchCondition = new SMPGuard; BranchCondition->SetOperator(CondBranchOp); // The conditional jumps on ECX==0 compare to ECX, not EFLAGS. - if ((NN_jcxz <= this->GetIDAOpcode()) && (NN_jrcxz >= this->GetIDAOpcode())) + if ((STARS_NN_jcxz <= this->GetIDAOpcode()) && (STARS_NN_jrcxz >= this->GetIDAOpcode())) BranchCondition->SetLeftOperand(CountOp); else BranchCondition->SetLeftOperand(FlagsOp); @@ -15318,7 +15323,7 @@ void SMPInstr::AddToStackPointer(STARS_uval_t delta) { TempRT->SetParentInst(this); SMPRegTransfer *RightRT = new SMPRegTransfer; RightRT->SetParentInst(this); - STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeRegOpnd(R_sp); + STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_sp); STARSOpndTypePtr DeltaOp = this->STARSInstPtr->MakeImmediateOpnd(delta); TempRT->SetLeftOperand(StackOp); // ESP := RightRT @@ -15337,7 +15342,7 @@ void SMPInstr::SubFromStackPointer(STARS_uval_t delta) { TempRT->SetParentInst(this); SMPRegTransfer *RightRT = new SMPRegTransfer; RightRT->SetParentInst(this); - STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeRegOpnd(R_sp); + STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_sp); STARSOpndTypePtr DeltaOp = this->STARSInstPtr->MakeImmediateOpnd(delta); TempRT->SetLeftOperand(StackOp); // ESP := RightRT @@ -15350,10 +15355,10 @@ void SMPInstr::SubFromStackPointer(STARS_uval_t delta) { return; } // end of SMPInstr::SubFromStackPointer() -#define SMP_FIRST_POP_FLAGS NN_popfw -#define SMP_LAST_POP_FLAGS NN_popfq -#define SMP_FIRST_POP_ALL NN_popaw -#define SMP_LAST_POP_ALL NN_popaq +#define SMP_FIRST_POP_FLAGS STARS_NN_popfw +#define SMP_LAST_POP_FLAGS STARS_NN_popfq +#define SMP_FIRST_POP_ALL STARS_NN_popaw +#define SMP_LAST_POP_ALL STARS_NN_popaq // Build the RTL for a pop instruction bool SMPInstr::BuildPopRTL(void) { std::size_t OpNum, OpSize; @@ -15363,7 +15368,7 @@ bool SMPInstr::BuildPopRTL(void) { // Handle special cases first. if ((SMP_FIRST_POP_FLAGS <= this->GetIDAOpcode()) && (SMP_LAST_POP_FLAGS >= this->GetIDAOpcode())) { STARSOpndTypePtr FlagsOp = this->STARSInstPtr->MakeRegOpnd(X86_FLAGS_REG); - STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, 0); // [ESP+0] + STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, 0); // [ESP+0] TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetLeftOperand(FlagsOp); @@ -15372,7 +15377,7 @@ bool SMPInstr::BuildPopRTL(void) { this->RTL.push_back(TempRT); TempRT = NULL; // Now create the stack pointer increment effect. - this->AddToStackPointer(STARS_ISA_Bytewidth); + this->AddToStackPointer(global_STARS_program->GetSTARS_ISA_Bytewidth()); return true; } @@ -15382,9 +15387,9 @@ bool SMPInstr::BuildPopRTL(void) { // adjusted at the end, per the Intel instruction manuals. // EDI comes from [ESP+0] - STARSOpndTypePtr EDIOp = this->STARSInstPtr->MakeRegOpnd(R_di); - STARSOpndTypePtr StackOp0 = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - ((STARS_ea_t) 0 * STARS_ISA_Bytewidth)); + STARSOpndTypePtr EDIOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_di); + STARSOpndTypePtr StackOp0 = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + ((STARS_ea_t) 0 * global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetLeftOperand(EDIOp); @@ -15394,9 +15399,9 @@ bool SMPInstr::BuildPopRTL(void) { TempRT = NULL; // ESI comes from [ESP+4 or 8] - STARSOpndTypePtr ESIOp = this->STARSInstPtr->MakeRegOpnd(R_si); - STARSOpndTypePtr StackOp1 = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - ((STARS_ea_t) 1 * STARS_ISA_Bytewidth)); + STARSOpndTypePtr ESIOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_si); + STARSOpndTypePtr StackOp1 = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + ((STARS_ea_t) 1 * global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetLeftOperand(ESIOp); @@ -15406,9 +15411,9 @@ bool SMPInstr::BuildPopRTL(void) { TempRT = NULL; // EBP comes from [ESP+8 or 16] - STARSOpndTypePtr EBPOp = this->STARSInstPtr->MakeRegOpnd(R_bp); - STARSOpndTypePtr StackOp2 = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - ((STARS_ea_t) 2 * STARS_ISA_Bytewidth)); + STARSOpndTypePtr EBPOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_bp); + STARSOpndTypePtr StackOp2 = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + ((STARS_ea_t) 2 * global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetLeftOperand(EBPOp); @@ -15420,9 +15425,9 @@ bool SMPInstr::BuildPopRTL(void) { // Skip over saved ESP at [ESP+12 or 24] // EBX comes from [ESP+16 or 32] - STARSOpndTypePtr EBXOp = this->STARSInstPtr->MakeRegOpnd(R_bx); - STARSOpndTypePtr StackOp4 = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - ((STARS_ea_t) 4 * STARS_ISA_Bytewidth)); + STARSOpndTypePtr EBXOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_bx); + STARSOpndTypePtr StackOp4 = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + ((STARS_ea_t) 4 * global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetLeftOperand(EBXOp); @@ -15432,9 +15437,9 @@ bool SMPInstr::BuildPopRTL(void) { TempRT = NULL; // EDX comes from [ESP+20 or 40] - STARSOpndTypePtr EDXOp = this->STARSInstPtr->MakeRegOpnd(R_dx); - STARSOpndTypePtr StackOp5 = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - ((STARS_ea_t) 5 * STARS_ISA_Bytewidth)); + STARSOpndTypePtr EDXOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_dx); + STARSOpndTypePtr StackOp5 = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + ((STARS_ea_t) 5 * global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetLeftOperand(EDXOp); @@ -15444,9 +15449,9 @@ bool SMPInstr::BuildPopRTL(void) { TempRT = NULL; // ECX comes from [ESP+24 or 48] - STARSOpndTypePtr ECXOp = this->STARSInstPtr->MakeRegOpnd(R_cx); - STARSOpndTypePtr StackOp6 = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - ((STARS_ea_t) 6 * STARS_ISA_Bytewidth)); + STARSOpndTypePtr ECXOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_cx); + STARSOpndTypePtr StackOp6 = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + ((STARS_ea_t) 6 * global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetLeftOperand(ECXOp); @@ -15456,9 +15461,9 @@ bool SMPInstr::BuildPopRTL(void) { TempRT = NULL; // EAX comes from [ESP+28 or 56] - STARSOpndTypePtr EAXOp = this->STARSInstPtr->MakeRegOpnd(R_ax); - STARSOpndTypePtr StackOp7 = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - ((STARS_ea_t) 7 * STARS_ISA_Bytewidth)); + STARSOpndTypePtr EAXOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_ax); + STARSOpndTypePtr StackOp7 = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + ((STARS_ea_t) 7 * global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetLeftOperand(EAXOp); @@ -15468,7 +15473,7 @@ bool SMPInstr::BuildPopRTL(void) { TempRT = NULL; // Now create the stack pointer increment effect. - this->AddToStackPointer(8*STARS_ISA_Bytewidth); + this->AddToStackPointer(8*global_STARS_program->GetSTARS_ISA_Bytewidth()); return true; } // end for "pop all" instructions @@ -15485,7 +15490,7 @@ bool SMPInstr::BuildPopRTL(void) { TempRT->SetLeftOperand(TempOp); TempRT->SetOperator(SMP_ASSIGN); OpSize = GetOpDataSize(TempOp); - STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, 0); + STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, 0); TempRT->SetRightOperand(StackOp); this->RTL.push_back(TempRT); // Now create the stack pointer increment effect. @@ -15502,10 +15507,10 @@ bool SMPInstr::BuildPopRTL(void) { return DestFound; } // end of SMPInstr::BuildPopRTL() -#define SMP_FIRST_PUSH_FLAGS NN_pushfw -#define SMP_LAST_PUSH_FLAGS NN_pushfq -#define SMP_FIRST_PUSH_ALL NN_pushaw -#define SMP_LAST_PUSH_ALL NN_pushaq +#define SMP_FIRST_PUSH_FLAGS STARS_NN_pushfw +#define SMP_LAST_PUSH_FLAGS STARS_NN_pushfq +#define SMP_FIRST_PUSH_ALL STARS_NN_pushaw +#define SMP_LAST_PUSH_ALL STARS_NN_pushaq // Build the RTL for a push instruction bool SMPInstr::BuildPushRTL(void) { std::size_t OpNum, OpSize; @@ -15515,8 +15520,8 @@ bool SMPInstr::BuildPushRTL(void) { // Handle special cases first. if ((SMP_FIRST_PUSH_FLAGS <= this->GetIDAOpcode()) && (SMP_LAST_PUSH_FLAGS >= this->GetIDAOpcode())) { STARSOpndTypePtr FlagsOp = this->STARSInstPtr->MakeRegOpnd(X86_FLAGS_REG); - STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - -((STARS_ea_t) STARS_ISA_Bytewidth)); + STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + -((STARS_ea_t) global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetRightOperand(FlagsOp); @@ -15524,15 +15529,15 @@ bool SMPInstr::BuildPushRTL(void) { TempRT->SetLeftOperand(StackOp); this->RTL.push_back(TempRT); // Now create the stack pointer increment effect. - this->SubFromStackPointer(STARS_ISA_Bytewidth); + this->SubFromStackPointer(global_STARS_program->GetSTARS_ISA_Bytewidth()); return true; } if ((SMP_FIRST_PUSH_ALL <= this->GetIDAOpcode()) && (SMP_LAST_PUSH_ALL >= this->GetIDAOpcode())) { // EDI goes to [ESP-32 or 64] - STARSOpndTypePtr EDIOp = this->STARSInstPtr->MakeRegOpnd(R_di); - STARSOpndTypePtr StackOp8 = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - -((STARS_ea_t) 8 * STARS_ISA_Bytewidth)); + STARSOpndTypePtr EDIOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_di); + STARSOpndTypePtr StackOp8 = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + -((STARS_ea_t) 8 * global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetRightOperand(EDIOp); @@ -15542,9 +15547,9 @@ bool SMPInstr::BuildPushRTL(void) { TempRT = NULL; // ESI goes to [ESP-28 or 56] - STARSOpndTypePtr ESIOp = this->STARSInstPtr->MakeRegOpnd(R_si); - STARSOpndTypePtr StackOp7 = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - -((STARS_ea_t) 7 * STARS_ISA_Bytewidth)); + STARSOpndTypePtr ESIOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_si); + STARSOpndTypePtr StackOp7 = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + -((STARS_ea_t) 7 * global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetRightOperand(ESIOp); @@ -15554,9 +15559,9 @@ bool SMPInstr::BuildPushRTL(void) { TempRT = NULL; // EBP goes to [ESP-24 or 48] - STARSOpndTypePtr EBPOp = this->STARSInstPtr->MakeRegOpnd(R_bp); - STARSOpndTypePtr StackOp6 = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - -((STARS_ea_t) 6 * STARS_ISA_Bytewidth)); + STARSOpndTypePtr EBPOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_bp); + STARSOpndTypePtr StackOp6 = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + -((STARS_ea_t) 6 * global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetRightOperand(EBPOp); @@ -15566,9 +15571,9 @@ bool SMPInstr::BuildPushRTL(void) { TempRT = NULL; // ESP goes to [ESP-20 or 40] - STARSOpndTypePtr ESPOp = this->STARSInstPtr->MakeRegOpnd(R_sp); - STARSOpndTypePtr StackOp5 = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - -((STARS_ea_t) 5 * STARS_ISA_Bytewidth)); + STARSOpndTypePtr ESPOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_sp); + STARSOpndTypePtr StackOp5 = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + -((STARS_ea_t) 5 * global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetRightOperand(ESPOp); @@ -15578,9 +15583,9 @@ bool SMPInstr::BuildPushRTL(void) { TempRT = NULL; // EBX goes to [ESP-16 or 32] - STARSOpndTypePtr EBXOp = this->STARSInstPtr->MakeRegOpnd(R_bx); - STARSOpndTypePtr StackOp4 = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - -((STARS_ea_t) 4 * STARS_ISA_Bytewidth)); + STARSOpndTypePtr EBXOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_bx); + STARSOpndTypePtr StackOp4 = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + -((STARS_ea_t) 4 * global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetRightOperand(EBXOp); @@ -15590,9 +15595,9 @@ bool SMPInstr::BuildPushRTL(void) { TempRT = NULL; // EDX goes to [ESP-12 or 24] - STARSOpndTypePtr EDXOp = this->STARSInstPtr->MakeRegOpnd(R_dx); - STARSOpndTypePtr StackOp3 = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - -((STARS_ea_t) 3 * STARS_ISA_Bytewidth)); + STARSOpndTypePtr EDXOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_dx); + STARSOpndTypePtr StackOp3 = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + -((STARS_ea_t) 3 * global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetRightOperand(EDXOp); @@ -15602,9 +15607,9 @@ bool SMPInstr::BuildPushRTL(void) { TempRT = NULL; // ECX goes to [ESP-8 or 16] - STARSOpndTypePtr ECXOp = this->STARSInstPtr->MakeRegOpnd(R_cx); - STARSOpndTypePtr StackOp2 = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - -((STARS_ea_t) 2 * STARS_ISA_Bytewidth)); + STARSOpndTypePtr ECXOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_cx); + STARSOpndTypePtr StackOp2 = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + -((STARS_ea_t) 2 * global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetRightOperand(ECXOp); @@ -15614,9 +15619,9 @@ bool SMPInstr::BuildPushRTL(void) { TempRT = NULL; // EAX goes to [ESP-4] - STARSOpndTypePtr EAXOp = this->STARSInstPtr->MakeRegOpnd(R_ax); - STARSOpndTypePtr StackOp1 = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, - -((STARS_ea_t) 1 * STARS_ISA_Bytewidth)); + STARSOpndTypePtr EAXOp = this->STARSInstPtr->MakeRegOpnd(STARS_x86_R_ax); + STARSOpndTypePtr StackOp1 = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, + -((STARS_ea_t) 1 * global_STARS_program->GetSTARS_ISA_Bytewidth())); TempRT = new SMPRegTransfer; TempRT->SetParentInst(this); TempRT->SetRightOperand(EAXOp); @@ -15626,7 +15631,7 @@ bool SMPInstr::BuildPushRTL(void) { TempRT = NULL; // Now create the stack pointer increment effect. - this->SubFromStackPointer((STARS_uval_t) 8*STARS_ISA_Bytewidth); + this->SubFromStackPointer((STARS_uval_t) 8 * global_STARS_program->GetSTARS_ISA_Bytewidth()); return true; } // end for "pop all" instructions @@ -15643,7 +15648,7 @@ bool SMPInstr::BuildPushRTL(void) { TempRT->SetParentInst(this); TempRT->SetRightOperand(TempOp); TempRT->SetOperator(SMP_ASSIGN); - STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeMemDisplacementOpnd(R_sp, R_none, 0, + STARSOpndTypePtr StackOp = this->STARSInstPtr->MakeMemDisplacementOpnd(STARS_x86_R_sp, STARS_x86_R_none, 0, -((STARS_ea_t) OpSize)); TempRT->SetLeftOperand(StackOp); this->RTL.push_back(TempRT); @@ -15682,64 +15687,64 @@ bool SMPInstr::BuildRTL(void) { } switch (this->GetIDAOpcode()) { - case NN_aaa: // ASCII Adjust after Addition - case NN_aad: // ASCII Adjust AX before Division - case NN_aam: // ASCII Adjust AX after Multiply - case NN_aas: // ASCII Adjust AL after Subtraction + case STARS_NN_aaa: // ASCII Adjust after Addition + case STARS_NN_aad: // ASCII Adjust AX before Division + case STARS_NN_aam: // ASCII Adjust AX after Multiply + case STARS_NN_aas: // ASCII Adjust AL after Subtraction return this->BuildUnaryRTL(SMP_UNARY_NUMERIC_OPERATION); - case NN_adc: // Add with Carry + case STARS_NN_adc: // Add with Carry #if SMP_BUILD_SPECIAL_ADC_SBB_RTL return this->BuildBinaryPlusFlagsRTL(SMP_ADD_CARRY); #else return this->BuildBinaryRTL(SMP_ADD_CARRY); #endif - case NN_add: // Add + case STARS_NN_add: // Add return this->BuildBinaryRTL(SMP_ADD); - case NN_and: // Logical AND + case STARS_NN_and: // Logical AND return this->BuildBinaryRTL(SMP_BITWISE_AND); - case NN_arpl: // Adjust RPL Field of Selector + case STARS_NN_arpl: // Adjust RPL Field of Selector return this->BuildBinaryRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_bound: // Check Array Index Against Bounds + case STARS_NN_bound: // Check Array Index Against Bounds return this->BuildGuardedSignalRTL(SMP_SIGNAL); - case NN_bsf: // Bit Scan Forward - case NN_bsr: // Bit Scan Reverse + case STARS_NN_bsf: // Bit Scan Forward + case STARS_NN_bsr: // Bit Scan Reverse return this->BuildUnary2OpndRTL(SMP_UNARY_NUMERIC_OPERATION); - case NN_bt: // Bit Test + case STARS_NN_bt: // Bit Test return this->BuildFlagsDestBinaryRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_btc: // Bit Test and Complement - case NN_btr: // Bit Test and Reset - case NN_bts: // Bit Test and Set + case STARS_NN_btc: // Bit Test and Complement + case STARS_NN_btr: // Bit Test and Reset + case STARS_NN_bts: // Bit Test and Set // Has effects on both the carry flag and the first operand this->RTL.ExtraKills.push_back(FlagsOp); return this->BuildBinaryRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_call: // Call Procedure - case NN_callfi: // Indirect Call Far Procedure - case NN_callni: // Indirect Call Near Procedure + case STARS_NN_call: // Call Procedure + case STARS_NN_callfi: // Indirect Call Far Procedure + case STARS_NN_callni: // Indirect Call Near Procedure return this->BuildCallRTL(); - case NN_cbw: // AL -> AX (with sign) - case NN_cwde: // AX -> EAX (with sign) - case NN_cdqe: // EAX -> RAX (with sign) + case STARS_NN_cbw: // AL -> AX (with sign) + case STARS_NN_cwde: // AX -> EAX (with sign) + case STARS_NN_cdqe: // EAX -> RAX (with sign) return this->BuildUnaryRTL(SMP_SIGN_EXTEND); - case NN_clc: // Clear Carry Flag - case NN_cld: // Clear Direction Flag + case STARS_NN_clc: // Clear Carry Flag + case STARS_NN_cld: // Clear Direction Flag return this->BuildUnaryRTL(SMP_UNARY_NUMERIC_OPERATION); - case NN_cli: // Clear Interrupt Flag - case NN_clts: // Clear Task-Switched Flag in CR0 + case STARS_NN_cli: // Clear Interrupt Flag + case STARS_NN_clts: // Clear Task-Switched Flag in CR0 // We don't track the interrupt flag or the special registers, // so we can just consider these to be no-ops. - // NOTE: Shouldn't we killthe EFLAGS register on NN_cli ??!!??!! + // NOTE: Shouldn't we killthe EFLAGS register on STARS_NN_cli ??!!??!! NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); NopRT->SetOperator(SMP_NULL_OPERATOR); @@ -15747,38 +15752,38 @@ bool SMPInstr::BuildRTL(void) { NopRT = NULL; return true; - case NN_cmc: // Complement Carry Flag + case STARS_NN_cmc: // Complement Carry Flag return this->BuildUnaryRTL(SMP_UNARY_NUMERIC_OPERATION); - case NN_cmp: // Compare Two Operands + case STARS_NN_cmp: // Compare Two Operands return this->BuildFlagsDestBinaryRTL(SMP_S_COMPARE); - case NN_cmps: // Compare Strings + case STARS_NN_cmps: // Compare Strings // Why do we no longer use BuildCompareStringRTL()? ****!!!!**** Test it! return this->BuildFlagsDestBinaryRTL(SMP_U_COMPARE); - case NN_cwd: // AX -> DX:AX (with sign) - case NN_cdq: // EAX -> EDX:EAX (with sign) - case NN_cqo: // RAX -> RDX:RAX (with sign) + case STARS_NN_cwd: // AX -> DX:AX (with sign) + case STARS_NN_cdq: // EAX -> EDX:EAX (with sign) + case STARS_NN_cqo: // RAX -> RDX:RAX (with sign) return this->BuildUnary2OpndRTL(SMP_SIGN_EXTEND); - case NN_daa: // Decimal Adjust AL after Addition - case NN_das: // Decimal Adjust AL after Subtraction + case STARS_NN_daa: // Decimal Adjust AL after Addition + case STARS_NN_das: // Decimal Adjust AL after Subtraction return this->BuildUnaryRTL(SMP_UNARY_NUMERIC_OPERATION); - case NN_dec: // Decrement by 1 + case STARS_NN_dec: // Decrement by 1 return this->BuildUnaryRTL(SMP_DECREMENT); - case NN_div: // Unsigned Divide + case STARS_NN_div: // Unsigned Divide return this->BuildMultiplyDivideRTL(SMP_U_DIVIDE); - case NN_enterw: // Make Stack Frame for Procedure Parameters - case NN_enter: // Make Stack Frame for Procedure Parameters - case NN_enterd: // Make Stack Frame for Procedure Parameters - case NN_enterq: // Make Stack Frame for Procedure Parameters + case STARS_NN_enterw: // Make Stack Frame for Procedure Parameters + case STARS_NN_enter: // Make Stack Frame for Procedure Parameters + case STARS_NN_enterd: // Make Stack Frame for Procedure Parameters + case STARS_NN_enterq: // Make Stack Frame for Procedure Parameters return this->BuildEnterRTL(); - case NN_hlt: // Halt + case STARS_NN_hlt: // Halt // Treat as a no-op NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); @@ -15787,188 +15792,188 @@ bool SMPInstr::BuildRTL(void) { NopRT = NULL; return true; - case NN_idiv: // Signed Divide + case STARS_NN_idiv: // Signed Divide return this->BuildMultiplyDivideRTL(SMP_S_DIVIDE); - case NN_imul: // Signed Multiply + case STARS_NN_imul: // Signed Multiply return this->BuildMultiplyDivideRTL(SMP_S_MULTIPLY); - case NN_in: // Input from Port + case STARS_NN_in: // Input from Port return this->BuildUnary2OpndRTL(SMP_INPUT); - case NN_inc: // Increment by 1 + case STARS_NN_inc: // Increment by 1 return this->BuildUnaryRTL(SMP_INCREMENT); - case NN_ins: // Input Byte(s) from Port to String + case STARS_NN_ins: // Input Byte(s) from Port to String return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; - case NN_int: // Call to Interrupt Procedure - case NN_into: // Call to Interrupt Procedure if Overflow Flag = 1 - case NN_int3: // Trap to Debugger + case STARS_NN_int: // Call to Interrupt Procedure + case STARS_NN_into: // Call to Interrupt Procedure if Overflow Flag = 1 + case STARS_NN_int3: // Trap to Debugger return this->BuildCallRTL(); - case NN_iretw: // Interrupt Return - case NN_iret: // Interrupt Return - case NN_iretd: // Interrupt Return (use32) - case NN_iretq: // Interrupt Return (use64) + case STARS_NN_iretw: // Interrupt Return + case STARS_NN_iret: // Interrupt Return + case STARS_NN_iretd: // Interrupt Return (use32) + case STARS_NN_iretq: // Interrupt Return (use64) return this->BuildReturnRTL(); - case NN_ja: // Jump if Above (CF=0 & ZF=0) - case NN_jae: // Jump if Above or Equal (CF=0) - case NN_jb: // Jump if Below (CF=1) - case NN_jbe: // Jump if Below or Equal (CF=1 | ZF=1) - case NN_jc: // Jump if Carry (CF=1) + case STARS_NN_ja: // Jump if Above (CF=0 & ZF=0) + case STARS_NN_jae: // Jump if Above or Equal (CF=0) + case STARS_NN_jb: // Jump if Below (CF=1) + case STARS_NN_jbe: // Jump if Below or Equal (CF=1 | ZF=1) + case STARS_NN_jc: // Jump if Carry (CF=1) return this->BuildJumpRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_jcxz: // Jump if CX is 0 - case NN_jecxz: // Jump if ECX is 0 - case NN_jrcxz: // Jump if RCX is 0 + case STARS_NN_jcxz: // Jump if CX is 0 + case STARS_NN_jecxz: // Jump if ECX is 0 + case STARS_NN_jrcxz: // Jump if RCX is 0 return this->BuildJumpRTL(SMP_EQUAL); // special case in BuildJumpRTL() - case NN_je: // Jump if Equal (ZF=1) + case STARS_NN_je: // Jump if Equal (ZF=1) return this->BuildJumpRTL(SMP_EQUAL); - case NN_jg: // Jump if Greater (ZF=0 & SF=OF) + case STARS_NN_jg: // Jump if Greater (ZF=0 & SF=OF) return this->BuildJumpRTL(SMP_GREATER_THAN); - case NN_jge: // Jump if Greater or Equal (SF=OF) + case STARS_NN_jge: // Jump if Greater or Equal (SF=OF) return this->BuildJumpRTL(SMP_GREATER_EQUAL); - case NN_jl: // Jump if Less (SF!=OF) + case STARS_NN_jl: // Jump if Less (SF!=OF) return this->BuildJumpRTL(SMP_LESS_THAN); - case NN_jle: // Jump if Less or Equal (ZF=1 | SF!=OF) + case STARS_NN_jle: // Jump if Less or Equal (ZF=1 | SF!=OF) return this->BuildJumpRTL(SMP_LESS_EQUAL); - case NN_jna: // Jump if Not Above (CF=1 | ZF=1) - case NN_jnae: // Jump if Not Above or Equal (CF=1) - case NN_jnb: // Jump if Not Below (CF=0) - case NN_jnbe: // Jump if Not Below or Equal (CF=0 & ZF=0) a.k.a. ja - case NN_jnc: // Jump if Not Carry (CF=0) + case STARS_NN_jna: // Jump if Not Above (CF=1 | ZF=1) + case STARS_NN_jnae: // Jump if Not Above or Equal (CF=1) + case STARS_NN_jnb: // Jump if Not Below (CF=0) + case STARS_NN_jnbe: // Jump if Not Below or Equal (CF=0 & ZF=0) a.k.a. ja + case STARS_NN_jnc: // Jump if Not Carry (CF=0) return this->BuildJumpRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_jne: // Jump if Not Equal (ZF=0) + case STARS_NN_jne: // Jump if Not Equal (ZF=0) return this->BuildJumpRTL(SMP_NOT_EQUAL); - case NN_jng: // Jump if Not Greater (ZF=1 | SF!=OF) a.k.a. jle + case STARS_NN_jng: // Jump if Not Greater (ZF=1 | SF!=OF) a.k.a. jle return this->BuildJumpRTL(SMP_LESS_EQUAL); - case NN_jnge: // Jump if Not Greater or Equal (SF != OF) ** + case STARS_NN_jnge: // Jump if Not Greater or Equal (SF != OF) ** return this->BuildJumpRTL(SMP_LESS_THAN); - case NN_jnl: // Jump if Not Less (SF=OF) a.k.a. jge + case STARS_NN_jnl: // Jump if Not Less (SF=OF) a.k.a. jge return this->BuildJumpRTL(SMP_GREATER_EQUAL); - case NN_jnle: // Jump if Not Less or Equal (ZF=0 & SF=OF) a.k.a. jg + case STARS_NN_jnle: // Jump if Not Less or Equal (ZF=0 & SF=OF) a.k.a. jg return this->BuildJumpRTL(SMP_GREATER_THAN); - case NN_jno: // Jump if Not Overflow (OF=0) - case NN_jnp: // Jump if Not Parity (PF=0) - case NN_jns: // Jump if Not Sign (SF=0) + case STARS_NN_jno: // Jump if Not Overflow (OF=0) + case STARS_NN_jnp: // Jump if Not Parity (PF=0) + case STARS_NN_jns: // Jump if Not Sign (SF=0) return this->BuildJumpRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_jnz: // Jump if Not Zero (ZF=0) a.k.a. jne + case STARS_NN_jnz: // Jump if Not Zero (ZF=0) a.k.a. jne return this->BuildJumpRTL(SMP_NOT_EQUAL); - case NN_jo: // Jump if Overflow (OF=1) - case NN_jp: // Jump if Parity (PF=1) - case NN_jpe: // Jump if Parity Even (PF=1) - case NN_jpo: // Jump if Parity Odd (PF=0) - case NN_js: // Jump if Sign (SF=1) + case STARS_NN_jo: // Jump if Overflow (OF=1) + case STARS_NN_jp: // Jump if Parity (PF=1) + case STARS_NN_jpe: // Jump if Parity Even (PF=1) + case STARS_NN_jpo: // Jump if Parity Odd (PF=0) + case STARS_NN_js: // Jump if Sign (SF=1) return this->BuildJumpRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_jz: // Jump if Zero (ZF=1) + case STARS_NN_jz: // Jump if Zero (ZF=1) return this->BuildJumpRTL(SMP_EQUAL); - case NN_jmp: // Jump - case NN_jmpfi: // Indirect Far Jump - case NN_jmpni: // Indirect Near Jump - case NN_jmpshort: // Jump Short (not used) + case STARS_NN_jmp: // Jump + case STARS_NN_jmpfi: // Indirect Far Jump + case STARS_NN_jmpni: // Indirect Near Jump + case STARS_NN_jmpshort: // Jump Short (not used) return this->BuildJumpRTL(SMP_NULL_OPERATOR); - case NN_lahf: // Load Flags into AH Register + case STARS_NN_lahf: // Load Flags into AH Register return this->BuildMoveRTL(SMP_NULL_OPERATOR); - case NN_lar: // Load Access Right Byte + case STARS_NN_lar: // Load Access Right Byte return false; break; - case NN_lea: // Load Effective Address + case STARS_NN_lea: // Load Effective Address return this->BuildLeaRTL(); break; - case NN_leavew: // High Level Procedure Exit - case NN_leave: // High Level Procedure Exit - case NN_leaved: // High Level Procedure Exit - case NN_leaveq: // High Level Procedure Exit + case STARS_NN_leavew: // High Level Procedure Exit + case STARS_NN_leave: // High Level Procedure Exit + case STARS_NN_leaved: // High Level Procedure Exit + case STARS_NN_leaveq: // High Level Procedure Exit return this->BuildLeaveRTL(); break; - case NN_lgdt: // Load Global Descriptor Table Register - case NN_lidt: // Load Interrupt Descriptor Table Register + case STARS_NN_lgdt: // Load Global Descriptor Table Register + case STARS_NN_lidt: // Load Interrupt Descriptor Table Register return false; break; - case NN_lgs: // Load Full Pointer to GS:xx - case NN_lss: // Load Full Pointer to SS:xx - case NN_lds: // Load Full Pointer to DS:xx - case NN_les: // Load Full Pointer to ES:xx - case NN_lfs: // Load Full Pointer to FS:xx - // These instructions differ from NN_lea only in setting + case STARS_NN_lgs: // Load Full Pointer to GS:xx + case STARS_NN_lss: // Load Full Pointer to SS:xx + case STARS_NN_lds: // Load Full Pointer to DS:xx + case STARS_NN_les: // Load Full Pointer to ES:xx + case STARS_NN_lfs: // Load Full Pointer to FS:xx + // These instructions differ from STARS_NN_lea only in setting // a segment register in addition to a pointer. We are // not yet tracking segment registers. return this->BuildLeaRTL(); break; - case NN_lldt: // Load Local Descriptor Table Register - case NN_lmsw: // Load Machine Status Word - case NN_lock: // Assert LOCK# Signal Prefix NOTE: This is now a no-op + case STARS_NN_lldt: // Load Local Descriptor Table Register + case STARS_NN_lmsw: // Load Machine Status Word + case STARS_NN_lock: // Assert LOCK# Signal Prefix NOTE: This is now a no-op return false; break; - case NN_lods: // Load String + case STARS_NN_lods: // Load String return this->BuildLoadStringRTL(); break; - case NN_loopw: // Loop while ECX != 0 - case NN_loop: // Loop while CX != 0 - case NN_loopd: // Loop while ECX != 0 - case NN_loopq: // Loop while RCX != 0 - case NN_loopwe: // Loop while CX != 0 and ZF=1 - case NN_loope: // Loop while rCX != 0 and ZF=1 - case NN_loopde: // Loop while ECX != 0 and ZF=1 - case NN_loopqe: // Loop while RCX != 0 and ZF=1 - case NN_loopwne: // Loop while CX != 0 and ZF=0 - case NN_loopne: // Loop while rCX != 0 and ZF=0 - case NN_loopdne: // Loop while ECX != 0 and ZF=0 - case NN_loopqne: // Loop while RCX != 0 and ZF=0 + case STARS_NN_loopw: // Loop while ECX != 0 + case STARS_NN_loop: // Loop while CX != 0 + case STARS_NN_loopd: // Loop while ECX != 0 + case STARS_NN_loopq: // Loop while RCX != 0 + case STARS_NN_loopwe: // Loop while CX != 0 and ZF=1 + case STARS_NN_loope: // Loop while rCX != 0 and ZF=1 + case STARS_NN_loopde: // Loop while ECX != 0 and ZF=1 + case STARS_NN_loopqe: // Loop while RCX != 0 and ZF=1 + case STARS_NN_loopwne: // Loop while CX != 0 and ZF=0 + case STARS_NN_loopne: // Loop while rCX != 0 and ZF=0 + case STARS_NN_loopdne: // Loop while ECX != 0 and ZF=0 + case STARS_NN_loopqne: // Loop while RCX != 0 and ZF=0 return this->BuildLoopRTL(SMP_NULL_OPERATOR); break; - case NN_lsl: // Load Segment Limit - case NN_ltr: // Load Task Register + case STARS_NN_lsl: // Load Segment Limit + case STARS_NN_ltr: // Load Task Register return false; break; - case NN_mov: // Move Data - case NN_movsp: // Move to/from Special Registers - case NN_movs: // Move Byte(s) from String to String + case STARS_NN_mov: // Move Data + case STARS_NN_movsp: // Move to/from Special Registers + case STARS_NN_movs: // Move Byte(s) from String to String return this->BuildMoveRTL(SMP_NULL_OPERATOR); - case NN_movsx: // Move with Sign-Extend + case STARS_NN_movsx: // Move with Sign-Extend return this->BuildUnary2OpndRTL(SMP_SIGN_EXTEND); - case NN_movzx: // Move with Zero-Extend + case STARS_NN_movzx: // Move with Zero-Extend return this->BuildUnary2OpndRTL(SMP_ZERO_EXTEND); - case NN_mul: // Unsigned Multiplication of AL or AX + case STARS_NN_mul: // Unsigned Multiplication of AL or AX return this->BuildMultiplyDivideRTL(SMP_U_MULTIPLY); - case NN_neg: // Two's Complement Negation + case STARS_NN_neg: // Two's Complement Negation return this->BuildUnaryRTL(SMP_NEGATE); - case NN_nop: // No Operation + case STARS_NN_nop: // No Operation NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); NopRT->SetOperator(SMP_NULL_OPERATOR); @@ -15976,118 +15981,118 @@ bool SMPInstr::BuildRTL(void) { NopRT = NULL; return true; - case NN_not: // One's Complement Negation + case STARS_NN_not: // One's Complement Negation return this->BuildUnaryRTL(SMP_BITWISE_NOT); - case NN_or: // Logical Inclusive OR + case STARS_NN_or: // Logical Inclusive OR return this->BuildBinaryRTL(SMP_BITWISE_OR); - case NN_out: // Output to Port + case STARS_NN_out: // Output to Port return this->BuildUnary2OpndRTL(SMP_OUTPUT); - case NN_outs: // Output Byte(s) to Port + case STARS_NN_outs: // Output Byte(s) to Port return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; - case NN_pop: // Pop a word from the Stack - case NN_popaw: // Pop all General Registers - case NN_popa: // Pop all General Registers - case NN_popad: // Pop all General Registers (use32) - case NN_popaq: // Pop all General Registers (use64) - case NN_popfw: // Pop Stack into Flags Register - case NN_popf: // Pop Stack into Flags Register - case NN_popfd: // Pop Stack into Eflags Register - case NN_popfq: // Pop Stack into Rflags Register + case STARS_NN_pop: // Pop a word from the Stack + case STARS_NN_popaw: // Pop all General Registers + case STARS_NN_popa: // Pop all General Registers + case STARS_NN_popad: // Pop all General Registers (use32) + case STARS_NN_popaq: // Pop all General Registers (use64) + case STARS_NN_popfw: // Pop Stack into Flags Register + case STARS_NN_popf: // Pop Stack into Flags Register + case STARS_NN_popfd: // Pop Stack into Eflags Register + case STARS_NN_popfq: // Pop Stack into Rflags Register return this->BuildPopRTL(); - case NN_push: // Push Operand onto the Stack - case NN_pushaw: // Push all General Registers - case NN_pusha: // Push all General Registers - case NN_pushad: // Push all General Registers (use32) - case NN_pushaq: // Push all General Registers (use64) - case NN_pushfw: // Push Flags Register onto the Stack - case NN_pushf: // Push Flags Register onto the Stack - case NN_pushfd: // Push Flags Register onto the Stack (use32) - case NN_pushfq: // Push Flags Register onto the Stack (use64) + case STARS_NN_push: // Push Operand onto the Stack + case STARS_NN_pushaw: // Push all General Registers + case STARS_NN_pusha: // Push all General Registers + case STARS_NN_pushad: // Push all General Registers (use32) + case STARS_NN_pushaq: // Push all General Registers (use64) + case STARS_NN_pushfw: // Push Flags Register onto the Stack + case STARS_NN_pushf: // Push Flags Register onto the Stack + case STARS_NN_pushfd: // Push Flags Register onto the Stack (use32) + case STARS_NN_pushfq: // Push Flags Register onto the Stack (use64) return this->BuildPushRTL(); - case NN_rcl: // Rotate Through Carry Left + case STARS_NN_rcl: // Rotate Through Carry Left return this->BuildBinaryPlusFlagsRTL(SMP_ROTATE_LEFT_CARRY); - case NN_rcr: // Rotate Through Carry Right + case STARS_NN_rcr: // Rotate Through Carry Right return this->BuildBinaryPlusFlagsRTL(SMP_ROTATE_RIGHT_CARRY); - case NN_rol: // Rotate Left + case STARS_NN_rol: // Rotate Left return this->BuildBinaryRTL(SMP_ROTATE_LEFT); - case NN_ror: // Rotate Right + case STARS_NN_ror: // Rotate Right return this->BuildBinaryRTL(SMP_ROTATE_RIGHT); - case NN_rep: // Repeat String Operation - case NN_repe: // Repeat String Operation while ZF=1 - case NN_repne: // Repeat String Operation while ZF=0 + case STARS_NN_rep: // Repeat String Operation + case STARS_NN_repe: // Repeat String Operation while ZF=1 + case STARS_NN_repne: // Repeat String Operation while ZF=0 return false; break; - case NN_retn: // Return Near from Procedure - case NN_retf: // Return Far from Procedure + case STARS_NN_retn: // Return Near from Procedure + case STARS_NN_retf: // Return Far from Procedure return this->BuildReturnRTL(); - case NN_sahf: // Store AH into Flags Register + case STARS_NN_sahf: // Store AH into Flags Register return this->BuildMoveRTL(SMP_NULL_OPERATOR); - case NN_sal: // Shift Arithmetic Left + case STARS_NN_sal: // Shift Arithmetic Left return this->BuildBinaryRTL(SMP_S_LEFT_SHIFT); - case NN_sar: // Shift Arithmetic Right + case STARS_NN_sar: // Shift Arithmetic Right return this->BuildBinaryRTL(SMP_S_RIGHT_SHIFT); - case NN_shl: // Shift Logical Left + case STARS_NN_shl: // Shift Logical Left return this->BuildBinaryRTL(SMP_U_LEFT_SHIFT); - case NN_shr: // Shift Logical Right + case STARS_NN_shr: // Shift Logical Right return this->BuildBinaryRTL(SMP_U_RIGHT_SHIFT); - case NN_sbb: // Integer Subtraction with Borrow + case STARS_NN_sbb: // Integer Subtraction with Borrow #if SMP_BUILD_SPECIAL_ADC_SBB_RTL return this->BuildBinaryPlusFlagsRTL(SMP_SUBTRACT_BORROW); #else return this->BuildBinaryRTL(SMP_SUBTRACT_BORROW); #endif - case NN_scas: // Scan String + case STARS_NN_scas: // Scan String return this->BuildFlagsDestBinaryRTL(SMP_U_COMPARE); - case NN_seta: // Set Byte if Above (CF=0 & ZF=0) - case NN_setae: // Set Byte if Above or Equal (CF=0) - case NN_setb: // Set Byte if Below (CF=1) - case NN_setbe: // Set Byte if Below or Equal (CF=1 | ZF=1) - case NN_setc: // Set Byte if Carry (CF=1) - case NN_sete: // Set Byte if Equal (ZF=1) - case NN_setg: // Set Byte if Greater (ZF=0 & SF=OF) - case NN_setge: // Set Byte if Greater or Equal (SF=OF) - case NN_setl: // Set Byte if Less (SF!=OF) - case NN_setle: // Set Byte if Less or Equal (ZF=1 | SF!=OF) - case NN_setna: // Set Byte if Not Above (CF=1 | ZF=1) - case NN_setnae: // Set Byte if Not Above or Equal (CF=1) - case NN_setnb: // Set Byte if Not Below (CF=0) - case NN_setnbe: // Set Byte if Not Below or Equal (CF=0 & ZF=0) - case NN_setnc: // Set Byte if Not Carry (CF=0) - case NN_setne: // Set Byte if Not Equal (ZF=0) - case NN_setng: // Set Byte if Not Greater (ZF=1 | SF!=OF) - case NN_setnge: // Set Byte if Not Greater or Equal (ZF=1) - case NN_setnl: // Set Byte if Not Less (SF=OF) - case NN_setnle: // Set Byte if Not Less or Equal (ZF=0 & SF=OF) - case NN_setno: // Set Byte if Not Overflow (OF=0) - case NN_setnp: // Set Byte if Not Parity (PF=0) - case NN_setns: // Set Byte if Not Sign (SF=0) - case NN_setnz: // Set Byte if Not Zero (ZF=0) - case NN_seto: // Set Byte if Overflow (OF=1) - case NN_setp: // Set Byte if Parity (PF=1) - case NN_setpe: // Set Byte if Parity Even (PF=1) - case NN_setpo: // Set Byte if Parity Odd (PF=0) - case NN_sets: // Set Byte if Sign (SF=1) - case NN_setz: // Set Byte if Zero (ZF=1) + case STARS_NN_seta: // Set Byte if Above (CF=0 & ZF=0) + case STARS_NN_setae: // Set Byte if Above or Equal (CF=0) + case STARS_NN_setb: // Set Byte if Below (CF=1) + case STARS_NN_setbe: // Set Byte if Below or Equal (CF=1 | ZF=1) + case STARS_NN_setc: // Set Byte if Carry (CF=1) + case STARS_NN_sete: // Set Byte if Equal (ZF=1) + case STARS_NN_setg: // Set Byte if Greater (ZF=0 & SF=OF) + case STARS_NN_setge: // Set Byte if Greater or Equal (SF=OF) + case STARS_NN_setl: // Set Byte if Less (SF!=OF) + case STARS_NN_setle: // Set Byte if Less or Equal (ZF=1 | SF!=OF) + case STARS_NN_setna: // Set Byte if Not Above (CF=1 | ZF=1) + case STARS_NN_setnae: // Set Byte if Not Above or Equal (CF=1) + case STARS_NN_setnb: // Set Byte if Not Below (CF=0) + case STARS_NN_setnbe: // Set Byte if Not Below or Equal (CF=0 & ZF=0) + case STARS_NN_setnc: // Set Byte if Not Carry (CF=0) + case STARS_NN_setne: // Set Byte if Not Equal (ZF=0) + case STARS_NN_setng: // Set Byte if Not Greater (ZF=1 | SF!=OF) + case STARS_NN_setnge: // Set Byte if Not Greater or Equal (ZF=1) + case STARS_NN_setnl: // Set Byte if Not Less (SF=OF) + case STARS_NN_setnle: // Set Byte if Not Less or Equal (ZF=0 & SF=OF) + case STARS_NN_setno: // Set Byte if Not Overflow (OF=0) + case STARS_NN_setnp: // Set Byte if Not Parity (PF=0) + case STARS_NN_setns: // Set Byte if Not Sign (SF=0) + case STARS_NN_setnz: // Set Byte if Not Zero (ZF=0) + case STARS_NN_seto: // Set Byte if Overflow (OF=1) + case STARS_NN_setp: // Set Byte if Parity (PF=1) + case STARS_NN_setpe: // Set Byte if Parity Even (PF=1) + case STARS_NN_setpo: // Set Byte if Parity Odd (PF=0) + case STARS_NN_sets: // Set Byte if Sign (SF=1) + case STARS_NN_setz: // Set Byte if Zero (ZF=1) // Destination always get set to NUMERIC 0 or 1, depending on // the condition and the relevant flags bits. Best way to model // this in an RTL is to perform an unspecified unary NUMERIC @@ -16095,27 +16100,27 @@ bool SMPInstr::BuildRTL(void) { // destination operand, making it always NUMERIC. return this->BuildUnary2OpndRTL(SMP_UNARY_NUMERIC_OPERATION); - case NN_sgdt: // Store Global Descriptor Table Register - case NN_sidt: // Store Interrupt Descriptor Table Register + case STARS_NN_sgdt: // Store Global Descriptor Table Register + case STARS_NN_sidt: // Store Interrupt Descriptor Table Register return false; break; - case NN_shld: // Double Precision Shift Left + case STARS_NN_shld: // Double Precision Shift Left return this->BuildDoubleShiftRTL(SMP_U_LEFT_SHIFT); - case NN_shrd: // Double Precision Shift Right + case STARS_NN_shrd: // Double Precision Shift Right return this->BuildDoubleShiftRTL(SMP_U_RIGHT_SHIFT); - case NN_sldt: // Store Local Descriptor Table Register - case NN_smsw: // Store Machine Status Word + case STARS_NN_sldt: // Store Local Descriptor Table Register + case STARS_NN_smsw: // Store Machine Status Word return false; break; - case NN_stc: // Set Carry Flag - case NN_std: // Set Direction Flag + case STARS_NN_stc: // Set Carry Flag + case STARS_NN_std: // Set Direction Flag return this->BuildUnaryRTL(SMP_UNARY_NUMERIC_OPERATION); - case NN_sti: // Set Interrupt Flag + case STARS_NN_sti: // Set Interrupt Flag NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); NopRT->SetOperator(SMP_NULL_OPERATOR); @@ -16123,39 +16128,39 @@ bool SMPInstr::BuildRTL(void) { NopRT = NULL; return true; - case NN_stos: // Store String + case STARS_NN_stos: // Store String return this->BuildMoveRTL(SMP_NULL_OPERATOR); - case NN_str: // Store Task Register + case STARS_NN_str: // Store Task Register return false; break; - case NN_sub: // Integer Subtraction + case STARS_NN_sub: // Integer Subtraction return this->BuildBinaryRTL(SMP_SUBTRACT); - case NN_test: // Logical Compare + case STARS_NN_test: // Logical Compare return this->BuildFlagsDestBinaryRTL(SMP_U_COMPARE); - case NN_verr: // Verify a Segment for Reading - case NN_verw: // Verify a Segment for Writing - case NN_wait: // Wait until BUSY# Pin is Inactive (HIGH) + case STARS_NN_verr: // Verify a Segment for Reading + case STARS_NN_verw: // Verify a Segment for Writing + case STARS_NN_wait: // Wait until BUSY# Pin is Inactive (HIGH) NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); NopRT->SetOperator(SMP_NULL_OPERATOR); this->RTL.push_back(NopRT); NopRT = NULL; - if (NN_wait != this->GetIDAOpcode()) + if (STARS_NN_wait != this->GetIDAOpcode()) this->RTL.ExtraKills.push_back(FlagsOp); return true; - case NN_xchg: // Exchange Register/Memory with Register + case STARS_NN_xchg: // Exchange Register/Memory with Register return this->BuildExchangeRTL(); - case NN_xlat: // Table Lookup Translation + case STARS_NN_xlat: // Table Lookup Translation return false; break; - case NN_xor: // Logical Exclusive OR + case STARS_NN_xor: // Logical Exclusive OR return this->BuildBinaryRTL(SMP_BITWISE_XOR); @@ -16163,18 +16168,18 @@ bool SMPInstr::BuildRTL(void) { // 486 instructions // - case NN_cmpxchg: // Compare and Exchange + case STARS_NN_cmpxchg: // Compare and Exchange return this->BuildCompareExchangeRTL(); - case NN_bswap: // Swap bits in EAX + case STARS_NN_bswap: // Swap bits in EAX return this->BuildUnaryRTL(SMP_UNARY_NUMERIC_OPERATION); - case NN_xadd: // t<-dest; dest<-src+dest; src<-t + case STARS_NN_xadd: // t<-dest; dest<-src+dest; src<-t return this->BuildExchangeAddRTL(); - case NN_invd: // Invalidate Data Cache - case NN_wbinvd: // Invalidate Data Cache (write changes) - case NN_invlpg: // Invalidate TLB entry + case STARS_NN_invd: // Invalidate Data Cache + case STARS_NN_wbinvd: // Invalidate Data Cache (write changes) + case STARS_NN_invlpg: // Invalidate TLB entry NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); NopRT->SetOperator(SMP_NULL_OPERATOR); @@ -16186,24 +16191,24 @@ bool SMPInstr::BuildRTL(void) { // Pentium instructions // - case NN_rdmsr: // Read Machine Status Register + case STARS_NN_rdmsr: // Read Machine Status Register return this->BuildOptType8RTL(); - case NN_wrmsr: // Write Machine Status Register + case STARS_NN_wrmsr: // Write Machine Status Register return false; break; - case NN_cpuid: // Get CPU ID + case STARS_NN_cpuid: // Get CPU ID return this->BuildOptType8RTL(); - case NN_cmpxchg8b: // Compare and Exchange Eight Bytes + case STARS_NN_cmpxchg8b: // Compare and Exchange Eight Bytes return false; break; - case NN_rdtsc: // Read Time Stamp Counter + case STARS_NN_rdtsc: // Read Time Stamp Counter return this->BuildOptType8RTL(); - case NN_rsm: // Resume from System Management Mode + case STARS_NN_rsm: // Resume from System Management Mode NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); NopRT->SetOperator(SMP_NULL_OPERATOR); @@ -16216,85 +16221,85 @@ bool SMPInstr::BuildRTL(void) { // Pentium Pro instructions // - case NN_cmova: // Move if Above (CF=0 & ZF=0) - case NN_cmovb: // Move if Below (CF=1) - case NN_cmovbe: // Move if Below or Equal (CF=1 | ZF=1) + case STARS_NN_cmova: // Move if Above (CF=0 & ZF=0) + case STARS_NN_cmovb: // Move if Below (CF=1) + case STARS_NN_cmovbe: // Move if Below or Equal (CF=1 | ZF=1) return this->BuildMoveRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_cmovg: // Move if Greater (ZF=0 & SF=OF) + case STARS_NN_cmovg: // Move if Greater (ZF=0 & SF=OF) return this->BuildMoveRTL(SMP_GREATER_THAN); - case NN_cmovge: // Move if Greater or Equal (SF=OF) + case STARS_NN_cmovge: // Move if Greater or Equal (SF=OF) return this->BuildMoveRTL(SMP_GREATER_EQUAL); - case NN_cmovl: // Move if Less (SF!=OF) + case STARS_NN_cmovl: // Move if Less (SF!=OF) return this->BuildMoveRTL(SMP_LESS_THAN); - case NN_cmovle: // Move if Less or Equal (ZF=1 | SF!=OF) + case STARS_NN_cmovle: // Move if Less or Equal (ZF=1 | SF!=OF) return this->BuildMoveRTL(SMP_LESS_EQUAL); - case NN_cmovnb: // Move if Not Below (CF=0) - case NN_cmovno: // Move if Not Overflow (OF=0) - case NN_cmovnp: // Move if Not Parity (PF=0) - case NN_cmovns: // Move if Not Sign (SF=0) + case STARS_NN_cmovnb: // Move if Not Below (CF=0) + case STARS_NN_cmovno: // Move if Not Overflow (OF=0) + case STARS_NN_cmovnp: // Move if Not Parity (PF=0) + case STARS_NN_cmovns: // Move if Not Sign (SF=0) return this->BuildMoveRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_cmovnz: // Move if Not Zero (ZF=0) + case STARS_NN_cmovnz: // Move if Not Zero (ZF=0) return this->BuildMoveRTL(SMP_NOT_EQUAL); - case NN_cmovo: // Move if Overflow (OF=1) - case NN_cmovp: // Move if Parity (PF=1) - case NN_cmovs: // Move if Sign (SF=1) + case STARS_NN_cmovo: // Move if Overflow (OF=1) + case STARS_NN_cmovp: // Move if Parity (PF=1) + case STARS_NN_cmovs: // Move if Sign (SF=1) return this->BuildMoveRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_cmovz: // Move if Zero (ZF=1) + case STARS_NN_cmovz: // Move if Zero (ZF=1) return this->BuildMoveRTL(SMP_EQUAL); - case NN_fcmovb: // Floating Move if Below + case STARS_NN_fcmovb: // Floating Move if Below return this->BuildMoveRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_fcmove: // Floating Move if Equal + case STARS_NN_fcmove: // Floating Move if Equal return this->BuildMoveRTL(SMP_EQUAL); - case NN_fcmovbe: // Floating Move if Below or Equal + case STARS_NN_fcmovbe: // Floating Move if Below or Equal return this->BuildMoveRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_fcmovu: // Floating Move if Unordered + case STARS_NN_fcmovu: // Floating Move if Unordered return this->BuildMoveRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_fcmovnb: // Floating Move if Not Below + case STARS_NN_fcmovnb: // Floating Move if Not Below return this->BuildMoveRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_fcmovne: // Floating Move if Not Equal + case STARS_NN_fcmovne: // Floating Move if Not Equal return this->BuildMoveRTL(SMP_NOT_EQUAL); - case NN_fcmovnbe: // Floating Move if Not Below or Equal + case STARS_NN_fcmovnbe: // Floating Move if Not Below or Equal return this->BuildMoveRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_fcmovnu: // Floating Move if Not Unordered + case STARS_NN_fcmovnu: // Floating Move if Not Unordered return this->BuildMoveRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_fcomi: // FP Compare: result in EFLAGS - case NN_fucomi: // FP Unordered Compare: result in EFLAGS - case NN_fcomip: // FP Compare: result in EFLAGS: pop stack - case NN_fucomip: // FP Unordered Compare: result in EFLAGS: pop stack + case STARS_NN_fcomi: // FP Compare: result in EFLAGS + case STARS_NN_fucomi: // FP Unordered Compare: result in EFLAGS + case STARS_NN_fcomip: // FP Compare: result in EFLAGS: pop stack + case STARS_NN_fucomip: // FP Unordered Compare: result in EFLAGS: pop stack return this->BuildFlagsDestBinaryRTL(SMP_S_COMPARE); break; - case NN_rdpmc: // Read Performance Monitor Counter + case STARS_NN_rdpmc: // Read Performance Monitor Counter return this->BuildOptType8RTL(); // // FPP instructions // - case NN_fld: // Load Real - case NN_fst: // Store Real - case NN_fstp: // Store Real and Pop + case STARS_NN_fld: // Load Real + case STARS_NN_fst: // Store Real + case STARS_NN_fstp: // Store Real and Pop return this->BuildMoveRTL(SMP_NULL_OPERATOR); - case NN_fxch: // Exchange Registers + case STARS_NN_fxch: // Exchange Registers // FP registers remain NUMERIC anyway, so this is a no-op to our type system. NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); @@ -16303,53 +16308,53 @@ bool SMPInstr::BuildRTL(void) { NopRT = NULL; return true; - case NN_fild: // Load Integer + case STARS_NN_fild: // Load Integer return this->BuildMoveRTL(SMP_NULL_OPERATOR); - case NN_fist: // Store Integer - case NN_fistp: // Store Integer and Pop + case STARS_NN_fist: // Store Integer + case STARS_NN_fistp: // Store Integer and Pop return this->BuildBinaryRTL(SMP_CONVERT_FP_TO_INT); - case NN_fbld: // Load BCD - case NN_fbstp: // Store BCD and Pop + case STARS_NN_fbld: // Load BCD + case STARS_NN_fbstp: // Store BCD and Pop return this->BuildMoveRTL(SMP_NULL_OPERATOR); - case NN_fadd: // Add Real - case NN_faddp: // Add Real and Pop - case NN_fiadd: // Add Integer - case NN_fsub: // Subtract Real - case NN_fsubp: // Subtract Real and Pop - case NN_fisub: // Subtract Integer - case NN_fsubr: // Subtract Real Reversed - case NN_fsubrp: // Subtract Real Reversed and Pop - case NN_fisubr: // Subtract Integer Reversed - case NN_fmul: // Multiply Real - case NN_fmulp: // Multiply Real and Pop - case NN_fimul: // Multiply Integer - case NN_fdiv: // Divide Real - case NN_fdivp: // Divide Real and Pop - case NN_fidiv: // Divide Integer - case NN_fdivr: // Divide Real Reversed - case NN_fdivrp: // Divide Real Reversed and Pop - case NN_fidivr: // Divide Integer Reversed + case STARS_NN_fadd: // Add Real + case STARS_NN_faddp: // Add Real and Pop + case STARS_NN_fiadd: // Add Integer + case STARS_NN_fsub: // Subtract Real + case STARS_NN_fsubp: // Subtract Real and Pop + case STARS_NN_fisub: // Subtract Integer + case STARS_NN_fsubr: // Subtract Real Reversed + case STARS_NN_fsubrp: // Subtract Real Reversed and Pop + case STARS_NN_fisubr: // Subtract Integer Reversed + case STARS_NN_fmul: // Multiply Real + case STARS_NN_fmulp: // Multiply Real and Pop + case STARS_NN_fimul: // Multiply Integer + case STARS_NN_fdiv: // Divide Real + case STARS_NN_fdivp: // Divide Real and Pop + case STARS_NN_fidiv: // Divide Integer + case STARS_NN_fdivr: // Divide Real Reversed + case STARS_NN_fdivrp: // Divide Real Reversed and Pop + case STARS_NN_fidivr: // Divide Integer Reversed return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC, true); - case NN_fsqrt: // Square Root - case NN_fscale: // Scale: st(0) <- st(0) * 2^st(1) - case NN_fprem: // Partial Remainder - case NN_frndint: // Round to Integer - case NN_fxtract: // Extract exponent and significand - case NN_fabs: // Absolute value - case NN_fchs: // Change Sign + case STARS_NN_fsqrt: // Square Root + case STARS_NN_fscale: // Scale: st(0) <- st(0) * 2^st(1) + case STARS_NN_fprem: // Partial Remainder + case STARS_NN_frndint: // Round to Integer + case STARS_NN_fxtract: // Extract exponent and significand + case STARS_NN_fabs: // Absolute value + case STARS_NN_fchs: // Change Sign return this->BuildUnaryRTL(SMP_UNARY_FLOATING_ARITHMETIC); - case NN_fcom: // Compare Real - case NN_fcomp: // Compare Real and Pop - case NN_fcompp: // Compare Real and Pop Twice - case NN_ficom: // Compare Integer - case NN_ficomp: // Compare Integer and Pop - case NN_ftst: // Test - case NN_fxam: // Examine + case STARS_NN_fcom: // Compare Real + case STARS_NN_fcomp: // Compare Real and Pop + case STARS_NN_fcompp: // Compare Real and Pop Twice + case STARS_NN_ficom: // Compare Integer + case STARS_NN_ficomp: // Compare Integer and Pop + case STARS_NN_ftst: // Test + case STARS_NN_fxam: // Examine // Floating comparison instructions use FP reg stack locations // as sources and set only the FP flags. All of these are numeric // type and we don't track any of them, so all such instructions @@ -16361,33 +16366,33 @@ bool SMPInstr::BuildRTL(void) { NopRT = NULL; return true; - case NN_fptan: // Partial tangent - case NN_fpatan: // Partial arctangent - case NN_f2xm1: // 2^x - 1 - case NN_fyl2x: // Y * lg2(X) - case NN_fyl2xp1: // Y * lg2(X+1) + case STARS_NN_fptan: // Partial tangent + case STARS_NN_fpatan: // Partial arctangent + case STARS_NN_f2xm1: // 2^x - 1 + case STARS_NN_fyl2x: // Y * lg2(X) + case STARS_NN_fyl2xp1: // Y * lg2(X+1) // We can consider it a unary operation when both arguments come // off the floating point register stack, unless we ever start // modeling the different locations in the FP register stack. return this->BuildUnaryRTL(SMP_UNARY_FLOATING_ARITHMETIC); - case NN_fldz: // Load +0.0 - case NN_fld1: // Load +1.0 - case NN_fldpi: // Load PI=3.14... - case NN_fldl2t: // Load lg2(10) - case NN_fldl2e: // Load lg2(e) - case NN_fldlg2: // Load lg10(2) - case NN_fldln2: // Load ln(2) - case NN_finit: // Initialize Processor - case NN_fninit: // Initialize Processor (no wait) - case NN_fsetpm: // Set Protected Mode - case NN_fldcw: // Load Control Word - case NN_fstcw: // Store Control Word - case NN_fnstcw: // Store Control Word (no wait) - case NN_fstsw: // Store Status Word - case NN_fnstsw: // Store Status Word (no wait) - case NN_fclex: // Clear Exceptions - case NN_fnclex: // Clear Exceptions (no wait) + case STARS_NN_fldz: // Load +0.0 + case STARS_NN_fld1: // Load +1.0 + case STARS_NN_fldpi: // Load PI=3.14... + case STARS_NN_fldl2t: // Load lg2(10) + case STARS_NN_fldl2e: // Load lg2(e) + case STARS_NN_fldlg2: // Load lg10(2) + case STARS_NN_fldln2: // Load ln(2) + case STARS_NN_finit: // Initialize Processor + case STARS_NN_fninit: // Initialize Processor (no wait) + case STARS_NN_fsetpm: // Set Protected Mode + case STARS_NN_fldcw: // Load Control Word + case STARS_NN_fstcw: // Store Control Word + case STARS_NN_fnstcw: // Store Control Word (no wait) + case STARS_NN_fstsw: // Store Status Word + case STARS_NN_fnstsw: // Store Status Word (no wait) + case STARS_NN_fclex: // Clear Exceptions + case STARS_NN_fnclex: // Clear Exceptions (no wait) // Floating point stack and control word and flags operations // with no memory operands are no-ops to us. // NOTE: We might want to deal with the memory operands in some @@ -16399,15 +16404,15 @@ bool SMPInstr::BuildRTL(void) { NopRT = NULL; return true; - case NN_fstenv: // Store Environment - case NN_fnstenv: // Store Environment (no wait) - case NN_fldenv: // Load Environment - case NN_fsave: // Save State - case NN_fnsave: // Save State (no wait) - case NN_frstor: // Restore State - case NN_fincstp: // Increment Stack Pointer - case NN_fdecstp: // Decrement Stack Pointer - case NN_ffree: // Free Register + case STARS_NN_fstenv: // Store Environment + case STARS_NN_fnstenv: // Store Environment (no wait) + case STARS_NN_fldenv: // Load Environment + case STARS_NN_fsave: // Save State + case STARS_NN_fnsave: // Save State (no wait) + case STARS_NN_frstor: // Restore State + case STARS_NN_fincstp: // Increment Stack Pointer + case STARS_NN_fdecstp: // Decrement Stack Pointer + case STARS_NN_ffree: // Free Register // Floating point stack and control word and flags operations // with no memory operands are no-ops to us. // NOTE: We might want to deal with the memory operands in some @@ -16419,7 +16424,7 @@ bool SMPInstr::BuildRTL(void) { NopRT = NULL; return true; - case NN_fnop: // No Operation + case STARS_NN_fnop: // No Operation NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); NopRT->SetOperator(SMP_NULL_OPERATOR); @@ -16427,10 +16432,10 @@ bool SMPInstr::BuildRTL(void) { NopRT = NULL; return true; - case NN_feni: // (8087 only) - case NN_fneni: // (no wait) (8087 only) - case NN_fdisi: // (8087 only) - case NN_fndisi: // (no wait) (8087 only) + case STARS_NN_feni: // (8087 only) + case STARS_NN_fneni: // (no wait) (8087 only) + case STARS_NN_fdisi: // (8087 only) + case STARS_NN_fndisi: // (no wait) (8087 only) return false; break; @@ -16439,13 +16444,13 @@ bool SMPInstr::BuildRTL(void) { // 80387 instructions // - case NN_fprem1: // Partial Remainder ( < half ) - case NN_fsincos: // t<-cos(st); st<-sin(st); push t - case NN_fsin: // Sine - case NN_fcos: // Cosine - case NN_fucom: // Compare Unordered Real - case NN_fucomp: // Compare Unordered Real and Pop - case NN_fucompp: // Compare Unordered Real and Pop Twice + case STARS_NN_fprem1: // Partial Remainder ( < half ) + case STARS_NN_fsincos: // t<-cos(st); st<-sin(st); push t + case STARS_NN_fsin: // Sine + case STARS_NN_fcos: // Cosine + case STARS_NN_fucom: // Compare Unordered Real + case STARS_NN_fucomp: // Compare Unordered Real and Pop + case STARS_NN_fucompp: // Compare Unordered Real and Pop Twice // Floating point stack and control word and flags operations // with no memory operands are no-ops to us. NopRT = new SMPRegTransfer; @@ -16460,15 +16465,15 @@ bool SMPInstr::BuildRTL(void) { // Instructions added 28.02.96 // - case NN_setalc: // Set AL to Carry Flag - case NN_svdc: // Save Register and Descriptor - case NN_rsdc: // Restore Register and Descriptor - case NN_svldt: // Save LDTR and Descriptor - case NN_rsldt: // Restore LDTR and Descriptor - case NN_svts: // Save TR and Descriptor - case NN_rsts: // Restore TR and Descriptor - case NN_icebp: // ICE Break Point - case NN_loadall: // Load the entire CPU state from ES:EDI + case STARS_NN_setalc: // Set AL to Carry Flag + case STARS_NN_svdc: // Save Register and Descriptor + case STARS_NN_rsdc: // Restore Register and Descriptor + case STARS_NN_svldt: // Save LDTR and Descriptor + case STARS_NN_rsldt: // Restore LDTR and Descriptor + case STARS_NN_svts: // Save TR and Descriptor + case STARS_NN_rsts: // Restore TR and Descriptor + case STARS_NN_icebp: // ICE Break Point + case STARS_NN_loadall: // Load the entire CPU state from ES:EDI return false; break; @@ -16476,7 +16481,7 @@ bool SMPInstr::BuildRTL(void) { // MMX instructions // - case NN_emms: // Empty MMX state + case STARS_NN_emms: // Empty MMX state NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); NopRT->SetOperator(SMP_NULL_OPERATOR); @@ -16485,106 +16490,106 @@ bool SMPInstr::BuildRTL(void) { return true; break; - case NN_movd: // Move 32 bits - case NN_movq: // Move 64 bits + case STARS_NN_movd: // Move 32 bits + case STARS_NN_movq: // Move 64 bits return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; - case NN_packsswb: // Pack with Signed Saturation (Word->Byte) - case NN_packssdw: // Pack with Signed Saturation (Dword->Word) + case STARS_NN_packsswb: // Pack with Signed Saturation (Word->Byte) + case STARS_NN_packssdw: // Pack with Signed Saturation (Dword->Word) return this->BuildBinaryRTL(SMP_PACK_S); break; - case NN_packuswb: // Pack with Unsigned Saturation (Word->Byte) + case STARS_NN_packuswb: // Pack with Unsigned Saturation (Word->Byte) return this->BuildBinaryRTL(SMP_PACK_U); break; - case NN_paddb: // Packed Add Byte - case NN_paddw: // Packed Add Word - case NN_paddd: // Packed Add Dword - case NN_paddsb: // Packed Add with Saturation (Byte) - case NN_paddsw: // Packed Add with Saturation (Word) - case NN_paddusb: // Packed Add Unsigned with Saturation (Byte) - case NN_paddusw: // Packed Add Unsigned with Saturation (Word) + case STARS_NN_paddb: // Packed Add Byte + case STARS_NN_paddw: // Packed Add Word + case STARS_NN_paddd: // Packed Add Dword + case STARS_NN_paddsb: // Packed Add with Saturation (Byte) + case STARS_NN_paddsw: // Packed Add with Saturation (Word) + case STARS_NN_paddusb: // Packed Add Unsigned with Saturation (Byte) + case STARS_NN_paddusw: // Packed Add Unsigned with Saturation (Word) return this->BuildBinaryRTL(SMP_ADD); break; - case NN_pand: // Bitwise Logical And + case STARS_NN_pand: // Bitwise Logical And return this->BuildBinaryRTL(SMP_BITWISE_AND); break; - case NN_pandn: // Bitwise Logical And Not + case STARS_NN_pandn: // Bitwise Logical And Not return this->BuildBinaryRTL(SMP_BITWISE_AND_NOT); break; - case NN_pcmpeqb: // Packed Compare for Equal (Byte) - case NN_pcmpeqw: // Packed Compare for Equal (Word) - case NN_pcmpeqd: // Packed Compare for Equal (Dword) + case STARS_NN_pcmpeqb: // Packed Compare for Equal (Byte) + case STARS_NN_pcmpeqw: // Packed Compare for Equal (Word) + case STARS_NN_pcmpeqd: // Packed Compare for Equal (Dword) return this->BuildBinaryRTL(SMP_COMPARE_EQ_AND_SET); break; - case NN_pcmpgtb: // Packed Compare for Greater Than (Byte) - case NN_pcmpgtw: // Packed Compare for Greater Than (Word) - case NN_pcmpgtd: // Packed Compare for Greater Than (Dword) + case STARS_NN_pcmpgtb: // Packed Compare for Greater Than (Byte) + case STARS_NN_pcmpgtw: // Packed Compare for Greater Than (Word) + case STARS_NN_pcmpgtd: // Packed Compare for Greater Than (Dword) return this->BuildBinaryRTL(SMP_COMPARE_GT_AND_SET); break; - case NN_pmaddwd: // Packed Multiply and Add + case STARS_NN_pmaddwd: // Packed Multiply and Add return this->BuildBinaryRTL(SMP_MULTIPLY_AND_ADD); break; - case NN_pmulhw: // Packed Multiply High - case NN_pmullw: // Packed Multiply Low + case STARS_NN_pmulhw: // Packed Multiply High + case STARS_NN_pmullw: // Packed Multiply Low return this->BuildBinaryRTL(SMP_U_MULTIPLY); break; - case NN_por: // Bitwise Logical Or + case STARS_NN_por: // Bitwise Logical Or return this->BuildBinaryRTL(SMP_BITWISE_OR); break; - case NN_psllw: // Packed Shift Left Logical (Word) - case NN_pslld: // Packed Shift Left Logical (Dword) - case NN_psllq: // Packed Shift Left Logical (Qword) + case STARS_NN_psllw: // Packed Shift Left Logical (Word) + case STARS_NN_pslld: // Packed Shift Left Logical (Dword) + case STARS_NN_psllq: // Packed Shift Left Logical (Qword) return this->BuildBinaryRTL(SMP_U_LEFT_SHIFT); break; - case NN_psraw: // Packed Shift Right Arithmetic (Word) - case NN_psrad: // Packed Shift Right Arithmetic (Dword) + case STARS_NN_psraw: // Packed Shift Right Arithmetic (Word) + case STARS_NN_psrad: // Packed Shift Right Arithmetic (Dword) return this->BuildBinaryRTL(SMP_S_RIGHT_SHIFT); break; - case NN_psrlw: // Packed Shift Right Logical (Word) - case NN_psrld: // Packed Shift Right Logical (Dword) - case NN_psrlq: // Packed Shift Right Logical (Qword) + case STARS_NN_psrlw: // Packed Shift Right Logical (Word) + case STARS_NN_psrld: // Packed Shift Right Logical (Dword) + case STARS_NN_psrlq: // Packed Shift Right Logical (Qword) return this->BuildBinaryRTL(SMP_U_RIGHT_SHIFT); break; - case NN_psubb: // Packed Subtract Byte - case NN_psubw: // Packed Subtract Word - case NN_psubd: // Packed Subtract Dword + case STARS_NN_psubb: // Packed Subtract Byte + case STARS_NN_psubw: // Packed Subtract Word + case STARS_NN_psubd: // Packed Subtract Dword return this->BuildBinaryRTL(SMP_SUBTRACT); break; - case NN_psubsb: // Packed Subtract with Saturation (Byte) - case NN_psubsw: // Packed Subtract with Saturation (Word) + case STARS_NN_psubsb: // Packed Subtract with Saturation (Byte) + case STARS_NN_psubsw: // Packed Subtract with Saturation (Word) return this->BuildBinaryRTL(SMP_SUBTRACT); break; - case NN_psubusb: // Packed Subtract Unsigned with Saturation (Byte) - case NN_psubusw: // Packed Subtract Unsigned with Saturation (Word) + case STARS_NN_psubusb: // Packed Subtract Unsigned with Saturation (Byte) + case STARS_NN_psubusw: // Packed Subtract Unsigned with Saturation (Word) return this->BuildBinaryRTL(SMP_SUBTRACT); break; - case NN_punpckhbw: // Unpack High Packed Data (Byte->Word) - case NN_punpckhwd: // Unpack High Packed Data (Word->Dword) - case NN_punpckhdq: // Unpack High Packed Data (Dword->Qword) - case NN_punpcklbw: // Unpack Low Packed Data (Byte->Word) - case NN_punpcklwd: // Unpack Low Packed Data (Word->Dword) - case NN_punpckldq: // Unpack Low Packed Data (Dword->Qword) + case STARS_NN_punpckhbw: // Unpack High Packed Data (Byte->Word) + case STARS_NN_punpckhwd: // Unpack High Packed Data (Word->Dword) + case STARS_NN_punpckhdq: // Unpack High Packed Data (Dword->Qword) + case STARS_NN_punpcklbw: // Unpack Low Packed Data (Byte->Word) + case STARS_NN_punpcklwd: // Unpack Low Packed Data (Word->Dword) + case STARS_NN_punpckldq: // Unpack Low Packed Data (Dword->Qword) return this->BuildBinaryRTL(SMP_INTERLEAVE); break; - case NN_pxor: // Bitwise Logical Exclusive Or + case STARS_NN_pxor: // Bitwise Logical Exclusive Or return this->BuildBinaryRTL(SMP_BITWISE_XOR); break; @@ -16592,85 +16597,85 @@ bool SMPInstr::BuildRTL(void) { // Undocumented Deschutes processor instructions // - case NN_fxsave: // Fast save FP context - case NN_fxrstor: // Fast restore FP context + case STARS_NN_fxsave: // Fast save FP context + case STARS_NN_fxrstor: // Fast restore FP context return false; break; // Pentium II instructions - case NN_sysenter: // Fast Transition to System Call Entry Point - case NN_sysexit: // Fast Transition from System Call Entry Point + case STARS_NN_sysenter: // Fast Transition to System Call Entry Point + case STARS_NN_sysexit: // Fast Transition from System Call Entry Point return false; break; // 3DNow! instructions - case NN_pavgusb: // Packed 8-bit Unsigned Integer Averaging + case STARS_NN_pavgusb: // Packed 8-bit Unsigned Integer Averaging return this->BuildBinaryRTL(SMP_AVERAGE_U); break; - case NN_pfadd: // Packed Floating-Point Addition + case STARS_NN_pfadd: // Packed Floating-Point Addition return this->BuildBinaryRTL(SMP_ADD); break; - case NN_pfsub: // Packed Floating-Point Subtraction - case NN_pfsubr: // Packed Floating-Point Reverse Subtraction !!!!****!!!! Fix this reversal if we care about the details + case STARS_NN_pfsub: // Packed Floating-Point Subtraction + case STARS_NN_pfsubr: // Packed Floating-Point Reverse Subtraction !!!!****!!!! Fix this reversal if we care about the details return this->BuildBinaryRTL(SMP_SUBTRACT); break; - case NN_pfacc: // Packed Floating-Point Accumulate + case STARS_NN_pfacc: // Packed Floating-Point Accumulate return this->BuildBinaryRTL(SMP_ADD); break; - case NN_pfcmpge: // Packed Floating-Point Comparison: Greater or Equal + case STARS_NN_pfcmpge: // Packed Floating-Point Comparison: Greater or Equal return this->BuildBinaryRTL(SMP_COMPARE_GE_AND_SET); break; - case NN_pfcmpgt: // Packed Floating-Point Comparison: Greater + case STARS_NN_pfcmpgt: // Packed Floating-Point Comparison: Greater return this->BuildBinaryRTL(SMP_COMPARE_GT_AND_SET); break; - case NN_pfcmpeq: // Packed Floating-Point Comparison: Equal + case STARS_NN_pfcmpeq: // Packed Floating-Point Comparison: Equal return this->BuildBinaryRTL(SMP_COMPARE_EQ_AND_SET); break; - case NN_pfmin: // Packed Floating-Point Minimum + case STARS_NN_pfmin: // Packed Floating-Point Minimum return this->BuildBinaryRTL(SMP_MIN_S); break; - case NN_pfmax: // Packed Floating-Point Maximum + case STARS_NN_pfmax: // Packed Floating-Point Maximum return this->BuildBinaryRTL(SMP_MAX_S); break; - case NN_pi2fd: // Packed 32-bit Integer to Floating-Point + case STARS_NN_pi2fd: // Packed 32-bit Integer to Floating-Point return this->BuildBinaryRTL(SMP_CONVERT_INT_TO_FP); break; - case NN_pf2id: // Packed Floating-Point to 32-bit Integer + case STARS_NN_pf2id: // Packed Floating-Point to 32-bit Integer return this->BuildBinaryRTL(SMP_CONVERT_FP_TO_INT); break; - case NN_pfrcp: // Packed Floating-Point Reciprocal Approximation - case NN_pfrsqrt: // Packed Floating-Point Reciprocal Square Root Approximation + case STARS_NN_pfrcp: // Packed Floating-Point Reciprocal Approximation + case STARS_NN_pfrsqrt: // Packed Floating-Point Reciprocal Square Root Approximation return this->BuildUnary2OpndRTL(SMP_UNARY_FLOATING_ARITHMETIC); break; - case NN_pfmul: // Packed Floating-Point Multiplication + case STARS_NN_pfmul: // Packed Floating-Point Multiplication return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_pfrcpit1: // Packed Floating-Point Reciprocal First Iteration Step - case NN_pfrsqit1: // Packed Floating-Point Reciprocal Square Root First Iteration Step - case NN_pfrcpit2: // Packed Floating-Point Reciprocal Second Iteration Step + case STARS_NN_pfrcpit1: // Packed Floating-Point Reciprocal First Iteration Step + case STARS_NN_pfrsqit1: // Packed Floating-Point Reciprocal Square Root First Iteration Step + case STARS_NN_pfrcpit2: // Packed Floating-Point Reciprocal Second Iteration Step return this->BuildUnary2OpndRTL(SMP_UNARY_FLOATING_ARITHMETIC); break; - case NN_pmulhrw: // Packed Floating-Point 16-bit Integer Multiply with rounding + case STARS_NN_pmulhrw: // Packed Floating-Point 16-bit Integer Multiply with rounding return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_femms: // Faster entry/exit of the MMX or floating-point state + case STARS_NN_femms: // Faster entry/exit of the MMX or floating-point state NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); NopRT->SetOperator(SMP_NULL_OPERATOR); @@ -16679,8 +16684,8 @@ bool SMPInstr::BuildRTL(void) { return true; break; - case NN_prefetch: // Prefetch at least a 32-byte line into L1 data cache - case NN_prefetchw: // Prefetch processor cache line into L1 data cache (mark as modified) + case STARS_NN_prefetch: // Prefetch at least a 32-byte line into L1 data cache + case STARS_NN_prefetchw: // Prefetch processor cache line into L1 data cache (mark as modified) // Prefetch opcodes are no-ops to us. NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); @@ -16691,170 +16696,170 @@ bool SMPInstr::BuildRTL(void) { // Pentium III instructions - case NN_addps: // Packed Single-FP Add - case NN_addss: // Scalar Single-FP Add - case NN_andnps: // Bitwise Logical And Not for Single-FP - case NN_andps: // Bitwise Logical And for Single-FP + case STARS_NN_addps: // Packed Single-FP Add + case STARS_NN_addss: // Scalar Single-FP Add + case STARS_NN_andnps: // Bitwise Logical And Not for Single-FP + case STARS_NN_andps: // Bitwise Logical And for Single-FP return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_cmpps: // Packed Single-FP Compare - case NN_cmpss: // Scalar Single-FP Compare - case NN_comiss: // Scalar Ordered Single-FP Compare and Set EFLAGS + case STARS_NN_cmpps: // Packed Single-FP Compare + case STARS_NN_cmpss: // Scalar Single-FP Compare + case STARS_NN_comiss: // Scalar Ordered Single-FP Compare and Set EFLAGS return false; break; - case NN_cvtpi2ps: // Packed signed INT32 to Packed Single-FP conversion + case STARS_NN_cvtpi2ps: // Packed signed INT32 to Packed Single-FP conversion return this->BuildBinaryRTL(SMP_CONVERT_INT_TO_FP); break; - case NN_cvtps2pi: // Packed Single-FP to Packed INT32 conversion + case STARS_NN_cvtps2pi: // Packed Single-FP to Packed INT32 conversion return this->BuildBinaryRTL(SMP_CONVERT_FP_TO_INT); break; - case NN_cvtsi2ss: // Scalar signed INT32 to Single-FP conversion + case STARS_NN_cvtsi2ss: // Scalar signed INT32 to Single-FP conversion return this->BuildBinaryRTL(SMP_CONVERT_INT_TO_FP); break; - case NN_cvtss2si: // Scalar Single-FP to signed INT32 conversion - case NN_cvttps2pi: // Packed Single-FP to Packed INT32 conversion (truncate) - case NN_cvttss2si: // Scalar Single-FP to signed INT32 conversion (truncate) + case STARS_NN_cvtss2si: // Scalar Single-FP to signed INT32 conversion + case STARS_NN_cvttps2pi: // Packed Single-FP to Packed INT32 conversion (truncate) + case STARS_NN_cvttss2si: // Scalar Single-FP to signed INT32 conversion (truncate) return this->BuildBinaryRTL(SMP_CONVERT_FP_TO_INT); break; - case NN_divps: // Packed Single-FP Divide - case NN_divss: // Scalar Single-FP Divide + case STARS_NN_divps: // Packed Single-FP Divide + case STARS_NN_divss: // Scalar Single-FP Divide return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_ldmxcsr: // Load Streaming SIMD Extensions Technology Control/Status Register + case STARS_NN_ldmxcsr: // Load Streaming SIMD Extensions Technology Control/Status Register return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; - case NN_maxps: // Packed Single-FP Maximum - case NN_maxss: // Scalar Single-FP Maximum + case STARS_NN_maxps: // Packed Single-FP Maximum + case STARS_NN_maxss: // Scalar Single-FP Maximum return this->BuildBinaryRTL(SMP_MAX_S); break; - case NN_minps: // Packed Single-FP Minimum - case NN_minss: // Scalar Single-FP Minimum + case STARS_NN_minps: // Packed Single-FP Minimum + case STARS_NN_minss: // Scalar Single-FP Minimum return this->BuildBinaryRTL(SMP_MIN_S); break; - case NN_movaps: // Move Aligned Four Packed Single-FP - case NN_movhlps: // Move High to Low Packed Single-FP - case NN_movhps: // Move High Packed Single-FP - case NN_movlhps: // Move Low to High Packed Single-FP - case NN_movlps: // Move Low Packed Single-FP - case NN_movmskps: // Move Mask to Register - case NN_movss: // Move Scalar Single-FP - case NN_movups: // Move Unaligned Four Packed Single-FP + case STARS_NN_movaps: // Move Aligned Four Packed Single-FP + case STARS_NN_movhlps: // Move High to Low Packed Single-FP + case STARS_NN_movhps: // Move High Packed Single-FP + case STARS_NN_movlhps: // Move Low to High Packed Single-FP + case STARS_NN_movlps: // Move Low Packed Single-FP + case STARS_NN_movmskps: // Move Mask to Register + case STARS_NN_movss: // Move Scalar Single-FP + case STARS_NN_movups: // Move Unaligned Four Packed Single-FP return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; - case NN_mulps: // Packed Single-FP Multiply - case NN_mulss: // Scalar Single-FP Multiply - case NN_orps: // Bitwise Logical OR for Single-FP Data + case STARS_NN_mulps: // Packed Single-FP Multiply + case STARS_NN_mulss: // Scalar Single-FP Multiply + case STARS_NN_orps: // Bitwise Logical OR for Single-FP Data return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_rcpps: // Packed Single-FP Reciprocal - case NN_rcpss: // Scalar Single-FP Reciprocal - case NN_rsqrtps: // Packed Single-FP Square Root Reciprocal - case NN_rsqrtss: // Scalar Single-FP Square Root Reciprocal + case STARS_NN_rcpps: // Packed Single-FP Reciprocal + case STARS_NN_rcpss: // Scalar Single-FP Reciprocal + case STARS_NN_rsqrtps: // Packed Single-FP Square Root Reciprocal + case STARS_NN_rsqrtss: // Scalar Single-FP Square Root Reciprocal return this->BuildUnary2OpndRTL(SMP_UNARY_FLOATING_ARITHMETIC); break; - case NN_shufps: // Shuffle Single-FP + case STARS_NN_shufps: // Shuffle Single-FP return this->BuildBinaryRTL(SMP_SHUFFLE); break; - case NN_sqrtps: // Packed Single-FP Square Root - case NN_sqrtss: // Scalar Single-FP Square Root + case STARS_NN_sqrtps: // Packed Single-FP Square Root + case STARS_NN_sqrtss: // Scalar Single-FP Square Root return this->BuildUnary2OpndRTL(SMP_UNARY_FLOATING_ARITHMETIC); break; - case NN_stmxcsr: // Store Streaming SIMD Extensions Technology Control/Status Register + case STARS_NN_stmxcsr: // Store Streaming SIMD Extensions Technology Control/Status Register return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; - case NN_subps: // Packed Single-FP Subtract - case NN_subss: // Scalar Single-FP Subtract + case STARS_NN_subps: // Packed Single-FP Subtract + case STARS_NN_subss: // Scalar Single-FP Subtract return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_ucomiss: // Scalar Unordered Single-FP Compare and Set EFLAGS + case STARS_NN_ucomiss: // Scalar Unordered Single-FP Compare and Set EFLAGS return this->BuildFlagsDestBinaryRTL(SMP_S_COMPARE); break; - case NN_unpckhps: // Unpack High Packed Single-FP Data - case NN_unpcklps: // Unpack Low Packed Single-FP Data + case STARS_NN_unpckhps: // Unpack High Packed Single-FP Data + case STARS_NN_unpcklps: // Unpack Low Packed Single-FP Data return this->BuildBinaryRTL(SMP_INTERLEAVE); break; - case NN_xorps: // Bitwise Logical XOR for Single-FP Data + case STARS_NN_xorps: // Bitwise Logical XOR for Single-FP Data return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_pavgb: // Packed Average (Byte) - case NN_pavgw: // Packed Average (Word) + case STARS_NN_pavgb: // Packed Average (Byte) + case STARS_NN_pavgw: // Packed Average (Word) return this->BuildBinaryRTL(SMP_AVERAGE_U); break; - case NN_pextrw: // Extract Word + case STARS_NN_pextrw: // Extract Word return this->BuildBinaryPlusImmedRTL(SMP_EXTRACT_ZERO_EXTEND, SMP_CREATE_MASK); break; - case NN_pinsrw: // Insert Word + case STARS_NN_pinsrw: // Insert Word return this->BuildBinaryPlusImmedRTL(SMP_BITWISE_AND, SMP_CREATE_MASK); break; - case NN_pmaxsw: // Packed Signed Integer Word Maximum + case STARS_NN_pmaxsw: // Packed Signed Integer Word Maximum return this->BuildBinaryRTL(SMP_MAX_S); break; - case NN_pmaxub: // Packed Unsigned Integer Byte Maximum + case STARS_NN_pmaxub: // Packed Unsigned Integer Byte Maximum return this->BuildBinaryRTL(SMP_MAX_U); break; - case NN_pminsw: // Packed Signed Integer Word Minimum + case STARS_NN_pminsw: // Packed Signed Integer Word Minimum return this->BuildBinaryRTL(SMP_MIN_S); break; - case NN_pminub: // Packed Unsigned Integer Byte Minimum + case STARS_NN_pminub: // Packed Unsigned Integer Byte Minimum return this->BuildBinaryRTL(SMP_MIN_U); break; - case NN_pmovmskb: // Move Byte Mask to Integer + case STARS_NN_pmovmskb: // Move Byte Mask to Integer return this->BuildBinaryRTL(SMP_SHUFFLE); break; - case NN_pmulhuw: // Packed Multiply High Unsigned + case STARS_NN_pmulhuw: // Packed Multiply High Unsigned return this->BuildBinaryRTL(SMP_U_MULTIPLY); break; - case NN_psadbw: // Packed Sum of Absolute Differences + case STARS_NN_psadbw: // Packed Sum of Absolute Differences return this->BuildBinaryRTL(SMP_SUM_OF_DIFFS); break; - case NN_pshufw: // Packed Shuffle Word + case STARS_NN_pshufw: // Packed Shuffle Word return this->BuildBinaryRTL(SMP_SHUFFLE); break; - case NN_maskmovq: // Byte Mask write + case STARS_NN_maskmovq: // Byte Mask write return false; break; - case NN_movntps: // Move Aligned Four Packed Single-FP Non Temporal - case NN_movntq: // Move 64 Bits Non Temporal + case STARS_NN_movntps: // Move Aligned Four Packed Single-FP Non Temporal + case STARS_NN_movntq: // Move 64 Bits Non Temporal return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; - case NN_prefetcht0: // Prefetch to all cache levels - case NN_prefetcht1: // Prefetch to all cache levels - case NN_prefetcht2: // Prefetch to L2 cache - case NN_prefetchnta: // Prefetch to L1 cache - case NN_sfence: // Store Fence + case STARS_NN_prefetcht0: // Prefetch to all cache levels + case STARS_NN_prefetcht1: // Prefetch to all cache levels + case STARS_NN_prefetcht2: // Prefetch to L2 cache + case STARS_NN_prefetchnta: // Prefetch to L1 cache + case STARS_NN_sfence: // Store Fence // Cache prefetch and store fence opcodes are no-ops to us. NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); @@ -16865,100 +16870,100 @@ bool SMPInstr::BuildRTL(void) { // Pentium III Pseudo instructions - case NN_cmpeqps: // Packed Single-FP Compare EQ + case STARS_NN_cmpeqps: // Packed Single-FP Compare EQ return this->BuildBinaryRTL(SMP_COMPARE_EQ_AND_SET); break; - case NN_cmpltps: // Packed Single-FP Compare LT + case STARS_NN_cmpltps: // Packed Single-FP Compare LT return this->BuildBinaryRTL(SMP_COMPARE_LT_AND_SET); break; - case NN_cmpleps: // Packed Single-FP Compare LE + case STARS_NN_cmpleps: // Packed Single-FP Compare LE return this->BuildBinaryRTL(SMP_COMPARE_LE_AND_SET); break; - case NN_cmpunordps: // Packed Single-FP Compare UNORD + case STARS_NN_cmpunordps: // Packed Single-FP Compare UNORD return false; break; - case NN_cmpneqps: // Packed Single-FP Compare NOT EQ + case STARS_NN_cmpneqps: // Packed Single-FP Compare NOT EQ return this->BuildBinaryRTL(SMP_COMPARE_NE_AND_SET); break; - case NN_cmpnltps: // Packed Single-FP Compare NOT LT + case STARS_NN_cmpnltps: // Packed Single-FP Compare NOT LT return this->BuildBinaryRTL(SMP_COMPARE_LT_AND_SET); break; - case NN_cmpnleps: // Packed Single-FP Compare NOT LE + case STARS_NN_cmpnleps: // Packed Single-FP Compare NOT LE return this->BuildBinaryRTL(SMP_COMPARE_GT_AND_SET); break; - case NN_cmpordps: // Packed Single-FP Compare ORDERED + case STARS_NN_cmpordps: // Packed Single-FP Compare ORDERED return false; break; - case NN_cmpeqss: // Scalar Single-FP Compare EQ + case STARS_NN_cmpeqss: // Scalar Single-FP Compare EQ return this->BuildBinaryRTL(SMP_COMPARE_EQ_AND_SET); break; - case NN_cmpltss: // Scalar Single-FP Compare LT + case STARS_NN_cmpltss: // Scalar Single-FP Compare LT return this->BuildBinaryRTL(SMP_COMPARE_LT_AND_SET); break; - case NN_cmpless: // Scalar Single-FP Compare LE + case STARS_NN_cmpless: // Scalar Single-FP Compare LE return this->BuildBinaryRTL(SMP_COMPARE_LE_AND_SET); break; - case NN_cmpunordss: // Scalar Single-FP Compare UNORD + case STARS_NN_cmpunordss: // Scalar Single-FP Compare UNORD return false; break; - case NN_cmpneqss: // Scalar Single-FP Compare NOT EQ + case STARS_NN_cmpneqss: // Scalar Single-FP Compare NOT EQ return this->BuildBinaryRTL(SMP_COMPARE_NE_AND_SET); break; - case NN_cmpnltss: // Scalar Single-FP Compare NOT LT + case STARS_NN_cmpnltss: // Scalar Single-FP Compare NOT LT return this->BuildBinaryRTL(SMP_COMPARE_LT_AND_SET); break; - case NN_cmpnless: // Scalar Single-FP Compare NOT LE + case STARS_NN_cmpnless: // Scalar Single-FP Compare NOT LE return this->BuildBinaryRTL(SMP_COMPARE_LE_AND_SET); break; - case NN_cmpordss: // Scalar Single-FP Compare ORDERED + case STARS_NN_cmpordss: // Scalar Single-FP Compare ORDERED return false; break; // AMD K7 instructions - case NN_pf2iw: // Packed Floating-Point to Integer with Sign Extend + case STARS_NN_pf2iw: // Packed Floating-Point to Integer with Sign Extend return this->BuildBinaryRTL(SMP_CONVERT_FP_TO_INT); break; - case NN_pfnacc: // Packed Floating-Point Negative Accumulate - case NN_pfpnacc: // Packed Floating-Point Mixed Positive-Negative Accumulate + case STARS_NN_pfnacc: // Packed Floating-Point Negative Accumulate + case STARS_NN_pfpnacc: // Packed Floating-Point Mixed Positive-Negative Accumulate return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_pi2fw: // Packed 16-bit Integer to Floating-Point + case STARS_NN_pi2fw: // Packed 16-bit Integer to Floating-Point return this->BuildBinaryRTL(SMP_CONVERT_INT_TO_FP); break; - case NN_pswapd: // Packed Swap Double Word + case STARS_NN_pswapd: // Packed Swap Double Word return this->BuildExchangeRTL(); break; // Undocumented FP instructions (thanks to norbert.juffa@adm.com) - case NN_fstp1: // Alias of Store Real and Pop - case NN_fcom2: // Alias of Compare Real - case NN_fcomp3: // Alias of Compare Real and Pop - case NN_fxch4: // Alias of Exchange Registers - case NN_fcomp5: // Alias of Compare Real and Pop + case STARS_NN_fstp1: // Alias of Store Real and Pop + case STARS_NN_fcom2: // Alias of Compare Real + case STARS_NN_fcomp3: // Alias of Compare Real and Pop + case STARS_NN_fxch4: // Alias of Exchange Registers + case STARS_NN_fcomp5: // Alias of Compare Real and Pop return false; break; - case NN_ffreep: // Free Register and Pop; used in mplayer binary + case STARS_NN_ffreep: // Free Register and Pop; used in mplayer binary // Floating point stack and control word and flags operations // with no memory operands are no-ops to us. NopRT = new SMPRegTransfer; @@ -16969,69 +16974,69 @@ bool SMPInstr::BuildRTL(void) { return true; - case NN_fxch7: // Alias of Exchange Registers - case NN_fstp8: // Alias of Store Real and Pop - case NN_fstp9: // Alias of Store Real and Pop + case STARS_NN_fxch7: // Alias of Exchange Registers + case STARS_NN_fstp8: // Alias of Store Real and Pop + case STARS_NN_fstp9: // Alias of Store Real and Pop return false; break; // Pentium 4 instructions - case NN_addpd: // Add Packed Double-Precision Floating-Point Values - case NN_addsd: // Add Scalar Double-Precision Floating-Point Values - case NN_andnpd: // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values - case NN_andpd: // Bitwise Logical AND of Packed Double-Precision Floating-Point Values + case STARS_NN_addpd: // Add Packed Double-Precision Floating-Point Values + case STARS_NN_addsd: // Add Scalar Double-Precision Floating-Point Values + case STARS_NN_andnpd: // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values + case STARS_NN_andpd: // Bitwise Logical AND of Packed Double-Precision Floating-Point Values return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_clflush: // Flush Cache Line - case NN_cmppd: // Compare Packed Double-Precision Floating-Point Values - case NN_cmpsd: // Compare Scalar Double-Precision Floating-Point Values - case NN_comisd: // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + case STARS_NN_clflush: // Flush Cache Line + case STARS_NN_cmppd: // Compare Packed Double-Precision Floating-Point Values + case STARS_NN_cmpsd: // Compare Scalar Double-Precision Floating-Point Values + case STARS_NN_comisd: // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS return false; break; - case NN_cvtdq2pd: // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values - case NN_cvtdq2ps: // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + case STARS_NN_cvtdq2pd: // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values + case STARS_NN_cvtdq2ps: // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values return this->BuildBinaryRTL(SMP_CONVERT_INT_TO_FP); break; - case NN_cvtpd2dq: // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers - case NN_cvtpd2pi: // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers - case NN_cvtpd2ps: // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values + case STARS_NN_cvtpd2dq: // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_cvtpd2pi: // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_cvtpd2ps: // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values return this->BuildBinaryRTL(SMP_CONVERT_FP_TO_INT); break; - case NN_cvtpi2pd: // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + case STARS_NN_cvtpi2pd: // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values return this->BuildBinaryRTL(SMP_CONVERT_INT_TO_FP); break; - case NN_cvtps2dq: // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers - case NN_cvtps2pd: // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values - case NN_cvtsd2si: // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer - case NN_cvtsd2ss: // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value + case STARS_NN_cvtps2dq: // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_cvtps2pd: // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values + case STARS_NN_cvtsd2si: // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer + case STARS_NN_cvtsd2ss: // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value return this->BuildBinaryRTL(SMP_CONVERT_FP_TO_INT); break; - case NN_cvtsi2sd: // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value + case STARS_NN_cvtsi2sd: // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value return this->BuildBinaryRTL(SMP_CONVERT_INT_TO_FP); break; - case NN_cvtss2sd: // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value - case NN_cvttpd2dq: // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers - case NN_cvttpd2pi: // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers - case NN_cvttps2dq: // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers - case NN_cvttsd2si: // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer + case STARS_NN_cvtss2sd: // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value + case STARS_NN_cvttpd2dq: // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_cvttpd2pi: // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_cvttps2dq: // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_cvttsd2si: // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer return this->BuildBinaryRTL(SMP_CONVERT_FP_TO_INT); break; - case NN_divpd: // Divide Packed Double-Precision Floating-Point Values - case NN_divsd: // Divide Scalar Double-Precision Floating-Point Values + case STARS_NN_divpd: // Divide Packed Double-Precision Floating-Point Values + case STARS_NN_divsd: // Divide Scalar Double-Precision Floating-Point Values return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_lfence: // Load Fence + case STARS_NN_lfence: // Load Fence NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); NopRT->SetOperator(SMP_NULL_OPERATOR); @@ -17039,16 +17044,16 @@ bool SMPInstr::BuildRTL(void) { NopRT = NULL; return true; - case NN_maskmovdqu: // Store Selected Bytes of Double Quadword + case STARS_NN_maskmovdqu: // Store Selected Bytes of Double Quadword return false; break; - case NN_maxpd: // Return Maximum Packed Double-Precision Floating-Point Values - case NN_maxsd: // Return Maximum Scalar Double-Precision Floating-Point Value + case STARS_NN_maxpd: // Return Maximum Packed Double-Precision Floating-Point Values + case STARS_NN_maxsd: // Return Maximum Scalar Double-Precision Floating-Point Value return this->BuildBinaryRTL(SMP_MAX_S); break; - case NN_mfence: // Memory Fence + case STARS_NN_mfence: // Memory Fence NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); NopRT->SetOperator(SMP_NULL_OPERATOR); @@ -17056,44 +17061,44 @@ bool SMPInstr::BuildRTL(void) { NopRT = NULL; return true; - case NN_minpd: // Return Minimum Packed Double-Precision Floating-Point Values - case NN_minsd: // Return Minimum Scalar Double-Precision Floating-Point Value + case STARS_NN_minpd: // Return Minimum Packed Double-Precision Floating-Point Values + case STARS_NN_minsd: // Return Minimum Scalar Double-Precision Floating-Point Value return this->BuildBinaryRTL(SMP_MIN_S); break; - case NN_movapd: // Move Aligned Packed Double-Precision Floating-Point Values - case NN_movdq2q: // Move Quadword from XMM to MMX Register - case NN_movdqa: // Move Aligned Double Quadword - case NN_movdqu: // Move Unaligned Double Quadword - case NN_movhpd: // Move High Packed Double-Precision Floating-Point Values - case NN_movlpd: // Move Low Packed Double-Precision Floating-Point Values + case STARS_NN_movapd: // Move Aligned Packed Double-Precision Floating-Point Values + case STARS_NN_movdq2q: // Move Quadword from XMM to MMX Register + case STARS_NN_movdqa: // Move Aligned Double Quadword + case STARS_NN_movdqu: // Move Unaligned Double Quadword + case STARS_NN_movhpd: // Move High Packed Double-Precision Floating-Point Values + case STARS_NN_movlpd: // Move Low Packed Double-Precision Floating-Point Values return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; - case NN_movmskpd: // Extract Packed Double-Precision Floating-Point Sign Mask + case STARS_NN_movmskpd: // Extract Packed Double-Precision Floating-Point Sign Mask return false; break; - case NN_movntdq: // Store Double Quadword Using Non-Temporal Hint - case NN_movnti: // Store Doubleword Using Non-Temporal Hint - case NN_movntpd: // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint - case NN_movq2dq: // Move Quadword from MMX to XMM Register - case NN_movsd: // Move Scalar Double-Precision Floating-Point Values - case NN_movupd: // Move Unaligned Packed Double-Precision Floating-Point Values + case STARS_NN_movntdq: // Store Double Quadword Using Non-Temporal Hint + case STARS_NN_movnti: // Store Doubleword Using Non-Temporal Hint + case STARS_NN_movntpd: // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint + case STARS_NN_movq2dq: // Move Quadword from MMX to XMM Register + case STARS_NN_movsd: // Move Scalar Double-Precision Floating-Point Values + case STARS_NN_movupd: // Move Unaligned Packed Double-Precision Floating-Point Values return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; - case NN_mulpd: // Multiply Packed Double-Precision Floating-Point Values - case NN_mulsd: // Multiply Scalar Double-Precision Floating-Point Values - case NN_orpd: // Bitwise Logical OR of Double-Precision Floating-Point Values + case STARS_NN_mulpd: // Multiply Packed Double-Precision Floating-Point Values + case STARS_NN_mulsd: // Multiply Scalar Double-Precision Floating-Point Values + case STARS_NN_orpd: // Bitwise Logical OR of Double-Precision Floating-Point Values return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_paddq: // Add Packed Quadword Integers + case STARS_NN_paddq: // Add Packed Quadword Integers return this->BuildBinaryRTL(SMP_ADD); break; - case NN_pause: // Spin Loop Hint + case STARS_NN_pause: // Spin Loop Hint NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); NopRT->SetOperator(SMP_NULL_OPERATOR); @@ -17101,995 +17106,995 @@ bool SMPInstr::BuildRTL(void) { NopRT = NULL; return true; - case NN_pmuludq: // Multiply Packed Unsigned Doubleword Integers + case STARS_NN_pmuludq: // Multiply Packed Unsigned Doubleword Integers return this->BuildBinaryRTL(SMP_U_MULTIPLY); break; - case NN_pshufd: // Shuffle Packed Doublewords - case NN_pshufhw: // Shuffle Packed High Words - case NN_pshuflw: // Shuffle Packed Low Words + case STARS_NN_pshufd: // Shuffle Packed Doublewords + case STARS_NN_pshufhw: // Shuffle Packed High Words + case STARS_NN_pshuflw: // Shuffle Packed Low Words return this->BuildBinaryRTL(SMP_SHUFFLE); break; - case NN_pslldq: // Shift Double Quadword Left Logical + case STARS_NN_pslldq: // Shift Double Quadword Left Logical return this->BuildBinaryRTL(SMP_U_LEFT_SHIFT); break; - case NN_psrldq: // Shift Double Quadword Right Logical + case STARS_NN_psrldq: // Shift Double Quadword Right Logical return this->BuildBinaryRTL(SMP_U_RIGHT_SHIFT); break; - case NN_psubq: // Subtract Packed Quadword Integers + case STARS_NN_psubq: // Subtract Packed Quadword Integers return this->BuildBinaryRTL(SMP_SUBTRACT); break; - case NN_punpckhqdq: // Unpack High Data - case NN_punpcklqdq: // Unpack Low Data + case STARS_NN_punpckhqdq: // Unpack High Data + case STARS_NN_punpcklqdq: // Unpack Low Data return this->BuildBinaryRTL(SMP_INTERLEAVE); break; - case NN_shufpd: // Shuffle Packed Double-Precision Floating-Point Values + case STARS_NN_shufpd: // Shuffle Packed Double-Precision Floating-Point Values return this->BuildBinaryRTL(SMP_SHUFFLE); break; - case NN_sqrtpd: // Compute Square Roots of Packed Double-Precision Floating-Point Values - case NN_sqrtsd: // Compute Square Rootof Scalar Double-Precision Floating-Point Value + case STARS_NN_sqrtpd: // Compute Square Roots of Packed Double-Precision Floating-Point Values + case STARS_NN_sqrtsd: // Compute Square Rootof Scalar Double-Precision Floating-Point Value return this->BuildUnary2OpndRTL(SMP_UNARY_FLOATING_ARITHMETIC); break; - case NN_subpd: // Subtract Packed Double-Precision Floating-Point Values - case NN_subsd: // Subtract Scalar Double-Precision Floating-Point Values + case STARS_NN_subpd: // Subtract Packed Double-Precision Floating-Point Values + case STARS_NN_subsd: // Subtract Scalar Double-Precision Floating-Point Values return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_ucomisd: // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + case STARS_NN_ucomisd: // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS return this->BuildFlagsDestBinaryRTL(SMP_S_COMPARE); break; - case NN_unpckhpd: // Unpack and Interleave High Packed Double-Precision Floating-Point Values - case NN_unpcklpd: // Unpack and Interleave Low Packed Double-Precision Floating-Point Values + case STARS_NN_unpckhpd: // Unpack and Interleave High Packed Double-Precision Floating-Point Values + case STARS_NN_unpcklpd: // Unpack and Interleave Low Packed Double-Precision Floating-Point Values return this->BuildBinaryRTL(SMP_INTERLEAVE); break; - case NN_xorpd: // Bitwise Logical OR of Double-Precision Floating-Point Values + case STARS_NN_xorpd: // Bitwise Logical OR of Double-Precision Floating-Point Values return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; // AMD syscall/sysret instructions - case NN_syscall: // Low latency system call - case NN_sysret: // Return from system call + case STARS_NN_syscall: // Low latency system call + case STARS_NN_sysret: // Return from system call // AMD64 instructions - case NN_swapgs: // Exchange GS base with KernelGSBase MSR + case STARS_NN_swapgs: // Exchange GS base with KernelGSBase MSR return false; break; // New Pentium instructions (SSE3) - case NN_movddup: // Move One Double-FP and Duplicate - case NN_movshdup: // Move Packed Single-FP High and Duplicate - case NN_movsldup: // Move Packed Single-FP Low and Duplicate + case STARS_NN_movddup: // Move One Double-FP and Duplicate + case STARS_NN_movshdup: // Move Packed Single-FP High and Duplicate + case STARS_NN_movsldup: // Move Packed Single-FP Low and Duplicate return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; // Missing AMD64 instructions : NOTE: Also found in Intel manual -- clc - case NN_movsxd: // Move with Sign-Extend Doubleword + case STARS_NN_movsxd: // Move with Sign-Extend Doubleword return this->BuildUnary2OpndRTL(SMP_SIGN_EXTEND); - case NN_cmpxchg16b: // Compare and Exchange 16 Bytes + case STARS_NN_cmpxchg16b: // Compare and Exchange 16 Bytes return false; break; // SSE3 instructions - case NN_addsubpd: // Add /Sub packed DP FP numbers - case NN_addsubps: // Add /Sub packed SP FP numbers - case NN_haddpd: // Add horizontally packed DP FP numbers - case NN_haddps: // Add horizontally packed SP FP numbers - case NN_hsubpd: // Sub horizontally packed DP FP numbers - case NN_hsubps: // Sub horizontally packed SP FP numbers + case STARS_NN_addsubpd: // Add /Sub packed DP FP numbers + case STARS_NN_addsubps: // Add /Sub packed SP FP numbers + case STARS_NN_haddpd: // Add horizontally packed DP FP numbers + case STARS_NN_haddps: // Add horizontally packed SP FP numbers + case STARS_NN_hsubpd: // Sub horizontally packed DP FP numbers + case STARS_NN_hsubps: // Sub horizontally packed SP FP numbers return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_monitor: // Set up a linear address range to be monitored by hardware - case NN_mwait: // Wait until write-back store performed within the range specified by the MONITOR instruction + case STARS_NN_monitor: // Set up a linear address range to be monitored by hardware + case STARS_NN_mwait: // Wait until write-back store performed within the range specified by the MONITOR instruction return false; break; - case NN_fisttp: // Store ST in intXX (chop) and pop + case STARS_NN_fisttp: // Store ST in intXX (chop) and pop return this->BuildBinaryRTL(SMP_CONVERT_FP_TO_INT); break; - case NN_lddqu: // Load unaligned integer 128-bit + case STARS_NN_lddqu: // Load unaligned integer 128-bit return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; // SSSE3 instructions - case NN_psignb: // Packed SIGN Byte - case NN_psignw: // Packed SIGN Word - case NN_psignd: // Packed SIGN Doubleword - case NN_pshufb: // Packed Shuffle Bytes + case STARS_NN_psignb: // Packed SIGN Byte + case STARS_NN_psignw: // Packed SIGN Word + case STARS_NN_psignd: // Packed SIGN Doubleword + case STARS_NN_pshufb: // Packed Shuffle Bytes return this->BuildBinaryRTL(SMP_SHUFFLE); break; - case NN_pmulhrsw: // Packed Multiply High with Round and Scale + case STARS_NN_pmulhrsw: // Packed Multiply High with Round and Scale return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_pmaddubsw: // Multiply and Add Packed Signed and Unsigned Bytes + case STARS_NN_pmaddubsw: // Multiply and Add Packed Signed and Unsigned Bytes return this->BuildBinaryRTL(SMP_MULTIPLY_AND_ADD); break; - case NN_phsubsw: // Packed Horizontal Subtract and Saturate + case STARS_NN_phsubsw: // Packed Horizontal Subtract and Saturate return this->BuildBinaryRTL(SMP_SUBTRACT); break; - case NN_phaddsw: // Packed Horizontal Add and Saturate + case STARS_NN_phaddsw: // Packed Horizontal Add and Saturate return this->BuildBinaryRTL(SMP_ADD); break; - case NN_phaddw: // Packed Horizontal Add Word - case NN_phaddd: // Packed Horizontal Add Doubleword + case STARS_NN_phaddw: // Packed Horizontal Add Word + case STARS_NN_phaddd: // Packed Horizontal Add Doubleword return this->BuildBinaryRTL(SMP_ADD); break; - case NN_phsubw: // Packed Horizontal Subtract Word - case NN_phsubd: // Packed Horizontal Subtract Doubleword + case STARS_NN_phsubw: // Packed Horizontal Subtract Word + case STARS_NN_phsubd: // Packed Horizontal Subtract Doubleword return this->BuildBinaryRTL(SMP_SUBTRACT); break; - case NN_palignr: // Packed Align Right + case STARS_NN_palignr: // Packed Align Right return this->BuildPackShiftRTL(SMP_CONCATENATE, SMP_REVERSE_SHIFT_U); break; - case NN_pabsb: // Packed Absolute Value Byte - case NN_pabsw: // Packed Absolute Value Word - case NN_pabsd: // Packed Absolute Value Doubleword + case STARS_NN_pabsb: // Packed Absolute Value Byte + case STARS_NN_pabsw: // Packed Absolute Value Word + case STARS_NN_pabsd: // Packed Absolute Value Doubleword return this->BuildUnary2OpndRTL(SMP_ABSOLUTE_VALUE); break; // VMX instructions - case NN_vmcall: // Call to VM Monitor - case NN_vmclear: // Clear Virtual Machine Control Structure - case NN_vmlaunch: // Launch Virtual Machine - case NN_vmresume: // Resume Virtual Machine - case NN_vmptrld: // Load Pointer to Virtual Machine Control Structure - case NN_vmptrst: // Store Pointer to Virtual Machine Control Structure - case NN_vmread: // Read Field from Virtual Machine Control Structure - case NN_vmwrite: // Write Field from Virtual Machine Control Structure - case NN_vmxoff: // Leave VMX Operation - case NN_vmxon: // Enter VMX Operation + case STARS_NN_vmcall: // Call to VM Monitor + case STARS_NN_vmclear: // Clear Virtual Machine Control Structure + case STARS_NN_vmlaunch: // Launch Virtual Machine + case STARS_NN_vmresume: // Resume Virtual Machine + case STARS_NN_vmptrld: // Load Pointer to Virtual Machine Control Structure + case STARS_NN_vmptrst: // Store Pointer to Virtual Machine Control Structure + case STARS_NN_vmread: // Read Field from Virtual Machine Control Structure + case STARS_NN_vmwrite: // Write Field from Virtual Machine Control Structure + case STARS_NN_vmxoff: // Leave VMX Operation + case STARS_NN_vmxon: // Enter VMX Operation return false; break; #if 599 < IDA_SDK_VERSION - case NN_ud2: // Undefined Instruction + case STARS_NN_ud2: // Undefined Instruction return false; break; // Added with x86-64 - case NN_rdtscp: // Read Time-Stamp Counter and Processor ID + case STARS_NN_rdtscp: // Read Time-Stamp Counter and Processor ID return false; break; // Geode LX 3DNow! extensions - case NN_pfrcpv: // Reciprocal Approximation for a Pair of 32-bit Floats - case NN_pfrsqrtv: // Reciprocal Square Root Approximation for a Pair of 32-bit Floats + case STARS_NN_pfrcpv: // Reciprocal Approximation for a Pair of 32-bit Floats + case STARS_NN_pfrsqrtv: // Reciprocal Square Root Approximation for a Pair of 32-bit Floats return false; break; // SSE2 pseudoinstructions - case NN_cmpeqpd: // Packed Double-FP Compare EQ + case STARS_NN_cmpeqpd: // Packed Double-FP Compare EQ return this->BuildBinaryRTL(SMP_COMPARE_EQ_AND_SET); break; - case NN_cmpltpd: // Packed Double-FP Compare LT + case STARS_NN_cmpltpd: // Packed Double-FP Compare LT return this->BuildBinaryRTL(SMP_COMPARE_LT_AND_SET); break; - case NN_cmplepd: // Packed Double-FP Compare LE + case STARS_NN_cmplepd: // Packed Double-FP Compare LE return this->BuildBinaryRTL(SMP_COMPARE_LE_AND_SET); break; - case NN_cmpunordpd: // Packed Double-FP Compare UNORD + case STARS_NN_cmpunordpd: // Packed Double-FP Compare UNORD return this->BuildBinaryRTL(SMP_COMPARE_EQ_AND_SET); break; - case NN_cmpneqpd: // Packed Double-FP Compare NOT EQ + case STARS_NN_cmpneqpd: // Packed Double-FP Compare NOT EQ return this->BuildBinaryRTL(SMP_COMPARE_NE_AND_SET); break; - case NN_cmpnltpd: // Packed Double-FP Compare NOT LT + case STARS_NN_cmpnltpd: // Packed Double-FP Compare NOT LT return this->BuildBinaryRTL(SMP_COMPARE_GE_AND_SET); break; - case NN_cmpnlepd: // Packed Double-FP Compare NOT LE + case STARS_NN_cmpnlepd: // Packed Double-FP Compare NOT LE return this->BuildBinaryRTL(SMP_COMPARE_GT_AND_SET); break; - case NN_cmpordpd: // Packed Double-FP Compare ORDERED + case STARS_NN_cmpordpd: // Packed Double-FP Compare ORDERED return this->BuildBinaryRTL(SMP_COMPARE_EQ_AND_SET); break; - case NN_cmpeqsd: // Scalar Double-FP Compare EQ + case STARS_NN_cmpeqsd: // Scalar Double-FP Compare EQ return this->BuildBinaryRTL(SMP_COMPARE_EQ_AND_SET); break; - case NN_cmpltsd: // Scalar Double-FP Compare LT + case STARS_NN_cmpltsd: // Scalar Double-FP Compare LT return this->BuildBinaryRTL(SMP_COMPARE_LT_AND_SET); break; - case NN_cmplesd: // Scalar Double-FP Compare LE + case STARS_NN_cmplesd: // Scalar Double-FP Compare LE return this->BuildBinaryRTL(SMP_COMPARE_LE_AND_SET); break; - case NN_cmpunordsd: // Scalar Double-FP Compare UNORD + case STARS_NN_cmpunordsd: // Scalar Double-FP Compare UNORD return this->BuildBinaryRTL(SMP_COMPARE_EQ_AND_SET); break; - case NN_cmpneqsd: // Scalar Double-FP Compare NOT EQ + case STARS_NN_cmpneqsd: // Scalar Double-FP Compare NOT EQ return this->BuildBinaryRTL(SMP_COMPARE_NE_AND_SET); break; - case NN_cmpnltsd: // Scalar Double-FP Compare NOT LT + case STARS_NN_cmpnltsd: // Scalar Double-FP Compare NOT LT return this->BuildBinaryRTL(SMP_COMPARE_GE_AND_SET); break; - case NN_cmpnlesd: // Scalar Double-FP Compare NOT LE + case STARS_NN_cmpnlesd: // Scalar Double-FP Compare NOT LE return this->BuildBinaryRTL(SMP_COMPARE_GT_AND_SET); break; - case NN_cmpordsd: // Scalar Double-FP Compare ORDERED + case STARS_NN_cmpordsd: // Scalar Double-FP Compare ORDERED return this->BuildBinaryRTL(SMP_COMPARE_EQ_AND_SET); break; // SSSE4.1 instructions - case NN_blendpd: // Blend Packed Double Precision Floating-Point Values - case NN_blendps: // Blend Packed Single Precision Floating-Point Values - case NN_blendvpd: // Variable Blend Packed Double Precision Floating-Point Values - case NN_blendvps: // Variable Blend Packed Single Precision Floating-Point Values + case STARS_NN_blendpd: // Blend Packed Double Precision Floating-Point Values + case STARS_NN_blendps: // Blend Packed Single Precision Floating-Point Values + case STARS_NN_blendvpd: // Variable Blend Packed Double Precision Floating-Point Values + case STARS_NN_blendvps: // Variable Blend Packed Single Precision Floating-Point Values return this->BuildBinaryRTL(SMP_SHUFFLE); break; - case NN_dppd: // Dot Product of Packed Double Precision Floating-Point Values - case NN_dpps: // Dot Product of Packed Single Precision Floating-Point Values + case STARS_NN_dppd: // Dot Product of Packed Double Precision Floating-Point Values + case STARS_NN_dpps: // Dot Product of Packed Single Precision Floating-Point Values return false; break; - case NN_extractps: // Extract Packed Single Precision Floating-Point Value - case NN_insertps: // Insert Packed Single Precision Floating-Point Value - case NN_movntdqa: // Load Double Quadword Non-Temporal Aligned Hint - case NN_mpsadbw: // Compute Multiple Packed Sums of Absolute Difference - case NN_packusdw: // Pack with Unsigned Saturation + case STARS_NN_extractps: // Extract Packed Single Precision Floating-Point Value + case STARS_NN_insertps: // Insert Packed Single Precision Floating-Point Value + case STARS_NN_movntdqa: // Load Double Quadword Non-Temporal Aligned Hint + case STARS_NN_mpsadbw: // Compute Multiple Packed Sums of Absolute Difference + case STARS_NN_packusdw: // Pack with Unsigned Saturation return false; break; - case NN_pblendvb: // Variable Blend Packed Bytes - case NN_pblendw: // Blend Packed Words + case STARS_NN_pblendvb: // Variable Blend Packed Bytes + case STARS_NN_pblendw: // Blend Packed Words return this->BuildBinaryRTL(SMP_SHUFFLE); break; - case NN_pcmpeqq: // Compare Packed Qword Data for Equal + case STARS_NN_pcmpeqq: // Compare Packed Qword Data for Equal return false; break; - case NN_pextrb: // Extract Byte - case NN_pextrd: // Extract Dword - case NN_pextrq: // Extract Qword + case STARS_NN_pextrb: // Extract Byte + case STARS_NN_pextrd: // Extract Dword + case STARS_NN_pextrq: // Extract Qword return this->BuildBinaryPlusImmedRTL(SMP_EXTRACT_ZERO_EXTEND, SMP_CREATE_MASK); - case NN_phminposuw: // Packed Horizontal Word Minimum + case STARS_NN_phminposuw: // Packed Horizontal Word Minimum return false; break; - case NN_pinsrb: // Insert Byte - case NN_pinsrd: // Insert Dword - case NN_pinsrq: // Insert Qword + case STARS_NN_pinsrb: // Insert Byte + case STARS_NN_pinsrd: // Insert Dword + case STARS_NN_pinsrq: // Insert Qword return this->BuildBinaryPlusImmedRTL(SMP_BITWISE_AND, SMP_CREATE_MASK); break; - case NN_pmaxsb: // Maximum of Packed Signed Byte Integers - case NN_pmaxsd: // Maximum of Packed Signed Dword Integers + case STARS_NN_pmaxsb: // Maximum of Packed Signed Byte Integers + case STARS_NN_pmaxsd: // Maximum of Packed Signed Dword Integers return this->BuildBinaryRTL(SMP_MAX_S); break; - case NN_pmaxud: // Maximum of Packed Unsigned Dword Integers - case NN_pmaxuw: // Maximum of Packed Word Integers + case STARS_NN_pmaxud: // Maximum of Packed Unsigned Dword Integers + case STARS_NN_pmaxuw: // Maximum of Packed Word Integers return this->BuildBinaryRTL(SMP_MAX_U); break; - case NN_pminsb: // Minimum of Packed Signed Byte Integers - case NN_pminsd: // Minimum of Packed Signed Dword Integers + case STARS_NN_pminsb: // Minimum of Packed Signed Byte Integers + case STARS_NN_pminsd: // Minimum of Packed Signed Dword Integers return this->BuildBinaryRTL(SMP_MIN_S); break; - case NN_pminud: // Minimum of Packed Unsigned Dword Integers - case NN_pminuw: // Minimum of Packed Word Integers + case STARS_NN_pminud: // Minimum of Packed Unsigned Dword Integers + case STARS_NN_pminuw: // Minimum of Packed Word Integers return this->BuildBinaryRTL(SMP_MIN_U); break; - case NN_pmovsxbw: // Packed Move with Sign Extend - case NN_pmovsxbd: // Packed Move with Sign Extend - case NN_pmovsxbq: // Packed Move with Sign Extend - case NN_pmovsxwd: // Packed Move with Sign Extend - case NN_pmovsxwq: // Packed Move with Sign Extend - case NN_pmovsxdq: // Packed Move with Sign Extend + case STARS_NN_pmovsxbw: // Packed Move with Sign Extend + case STARS_NN_pmovsxbd: // Packed Move with Sign Extend + case STARS_NN_pmovsxbq: // Packed Move with Sign Extend + case STARS_NN_pmovsxwd: // Packed Move with Sign Extend + case STARS_NN_pmovsxwq: // Packed Move with Sign Extend + case STARS_NN_pmovsxdq: // Packed Move with Sign Extend return this->BuildUnary2OpndRTL(SMP_SIGN_EXTEND); break; - case NN_pmovzxbw: // Packed Move with Zero Extend - case NN_pmovzxbd: // Packed Move with Zero Extend - case NN_pmovzxbq: // Packed Move with Zero Extend - case NN_pmovzxwd: // Packed Move with Zero Extend - case NN_pmovzxwq: // Packed Move with Zero Extend - case NN_pmovzxdq: // Packed Move with Zero Extend + case STARS_NN_pmovzxbw: // Packed Move with Zero Extend + case STARS_NN_pmovzxbd: // Packed Move with Zero Extend + case STARS_NN_pmovzxbq: // Packed Move with Zero Extend + case STARS_NN_pmovzxwd: // Packed Move with Zero Extend + case STARS_NN_pmovzxwq: // Packed Move with Zero Extend + case STARS_NN_pmovzxdq: // Packed Move with Zero Extend return this->BuildUnary2OpndRTL(SMP_ZERO_EXTEND); break; - case NN_pmuldq: // Multiply Packed Signed Dword Integers - case NN_pmulld: // Multiply Packed Signed Dword Integers and Store Low Result + case STARS_NN_pmuldq: // Multiply Packed Signed Dword Integers + case STARS_NN_pmulld: // Multiply Packed Signed Dword Integers and Store Low Result return false; break; - case NN_ptest: // Logical Compare + case STARS_NN_ptest: // Logical Compare return this->BuildFlagsDestBinaryRTL(SMP_U_COMPARE); - case NN_roundpd: // Round Packed Double Precision Floating-Point Values - case NN_roundps: // Round Packed Single Precision Floating-Point Values - case NN_roundsd: // Round Scalar Double Precision Floating-Point Values - case NN_roundss: // Round Scalar Single Precision Floating-Point Values + case STARS_NN_roundpd: // Round Packed Double Precision Floating-Point Values + case STARS_NN_roundps: // Round Packed Single Precision Floating-Point Values + case STARS_NN_roundsd: // Round Scalar Double Precision Floating-Point Values + case STARS_NN_roundss: // Round Scalar Single Precision Floating-Point Values return false; break; // SSSE4.2 instructions - case NN_crc32: // Accumulate CRC32 Value + case STARS_NN_crc32: // Accumulate CRC32 Value return false; break; - case NN_pcmpestri: // Packed Compare Explicit Length Strings, Return Index - case NN_pcmpestrm: // Packed Compare Explicit Length Strings, Return Mask - case NN_pcmpistri: // Packed Compare Implicit Length Strings, Return Index - case NN_pcmpistrm: // Packed Compare Implicit Length Strings, Return Mask + case STARS_NN_pcmpestri: // Packed Compare Explicit Length Strings, Return Index + case STARS_NN_pcmpestrm: // Packed Compare Explicit Length Strings, Return Mask + case STARS_NN_pcmpistri: // Packed Compare Implicit Length Strings, Return Index + case STARS_NN_pcmpistrm: // Packed Compare Implicit Length Strings, Return Mask return BuildBinaryIgnoreImmedRTL(SMP_GENERAL_COMPARE); break; - case NN_pcmpgtq: // Compare Packed Data for Greater Than - case NN_popcnt: // Return the Count of Number of Bits Set to 1 + case STARS_NN_pcmpgtq: // Compare Packed Data for Greater Than + case STARS_NN_popcnt: // Return the Count of Number of Bits Set to 1 return false; break; // AMD SSE4a instructions - case NN_extrq: // Extract Field From Register - case NN_insertq: // Insert Field - case NN_movntsd: // Move Non-Temporal Scalar Double-Precision Floating-Point - case NN_movntss: // Move Non-Temporal Scalar Single-Precision Floating-Point - case NN_lzcnt: // Leading Zero Count + case STARS_NN_extrq: // Extract Field From Register + case STARS_NN_insertq: // Insert Field + case STARS_NN_movntsd: // Move Non-Temporal Scalar Double-Precision Floating-Point + case STARS_NN_movntss: // Move Non-Temporal Scalar Single-Precision Floating-Point + case STARS_NN_lzcnt: // Leading Zero Count return false; break; // xsave/xrstor instructions - case NN_xgetbv: // Get Value of Extended Control Register + case STARS_NN_xgetbv: // Get Value of Extended Control Register return this->BuildOptType8RTL(); - case NN_xrstor: // Restore Processor Extended States - case NN_xsave: // Save Processor Extended States - case NN_xsetbv: // Set Value of Extended Control Register + case STARS_NN_xrstor: // Restore Processor Extended States + case STARS_NN_xsave: // Save Processor Extended States + case STARS_NN_xsetbv: // Set Value of Extended Control Register return false; break; // Intel Safer Mode Extensions (SMX) - case NN_getsec: // Safer Mode Extensions (SMX) Instruction + case STARS_NN_getsec: // Safer Mode Extensions (SMX) Instruction return false; break; // AMD-V Virtualization ISA Extension - case NN_clgi: // Clear Global Interrupt Flag - case NN_invlpga: // Invalidate TLB Entry in a Specified ASID - case NN_skinit: // Secure Init and Jump with Attestation - case NN_stgi: // Set Global Interrupt Flag - case NN_vmexit: // Stop Executing Guest, Begin Executing Host - case NN_vmload: // Load State from VMCB - case NN_vmmcall: // Call VMM - case NN_vmrun: // Run Virtual Machine - case NN_vmsave: // Save State to VMCB + case STARS_NN_clgi: // Clear Global Interrupt Flag + case STARS_NN_invlpga: // Invalidate TLB Entry in a Specified ASID + case STARS_NN_skinit: // Secure Init and Jump with Attestation + case STARS_NN_stgi: // Set Global Interrupt Flag + case STARS_NN_vmexit: // Stop Executing Guest, Begin Executing Host + case STARS_NN_vmload: // Load State from VMCB + case STARS_NN_vmmcall: // Call VMM + case STARS_NN_vmrun: // Run Virtual Machine + case STARS_NN_vmsave: // Save State to VMCB return false; break; // VMX+ instructions - case NN_invept: // Invalidate Translations Derived from EPT - case NN_invvpid: // Invalidate Translations Based on VPID + case STARS_NN_invept: // Invalidate Translations Derived from EPT + case STARS_NN_invvpid: // Invalidate Translations Based on VPID return false; break; // Intel Atom instructions - case NN_movbe: // Move Data After Swapping Bytes + case STARS_NN_movbe: // Move Data After Swapping Bytes return false; break; // Intel AES instructions - case NN_aesenc: // Perform One Round of an AES Encryption Flow - case NN_aesenclast: // Perform the Last Round of an AES Encryption Flow - case NN_aesdec: // Perform One Round of an AES Decryption Flow - case NN_aesdeclast: // Perform the Last Round of an AES Decryption Flow - case NN_aesimc: // Perform the AES InvMixColumn Transformation - case NN_aeskeygenassist: // AES Round Key Generation Assist + case STARS_NN_aesenc: // Perform One Round of an AES Encryption Flow + case STARS_NN_aesenclast: // Perform the Last Round of an AES Encryption Flow + case STARS_NN_aesdec: // Perform One Round of an AES Decryption Flow + case STARS_NN_aesdeclast: // Perform the Last Round of an AES Decryption Flow + case STARS_NN_aesimc: // Perform the AES InvMixColumn Transformation + case STARS_NN_aeskeygenassist: // AES Round Key Generation Assist return this->BuildBinaryRTL(SMP_ENCRYPTION_OPERATION); break; // Carryless multiplication - case NN_pclmulqdq: // Carry-Less Multiplication Quadword + case STARS_NN_pclmulqdq: // Carry-Less Multiplication Quadword return BuildBinaryIgnoreImmedRTL(SMP_U_MULTIPLY); break; // Returns modified by operand size prefixes - case NN_retnw: // Return Near from Procedure (use16) - case NN_retnd: // Return Near from Procedure (use32) - case NN_retnq: // Return Near from Procedure (use64) - case NN_retfw: // Return Far from Procedure (use16) - case NN_retfd: // Return Far from Procedure (use32) - case NN_retfq: // Return Far from Procedure (use64) + case STARS_NN_retnw: // Return Near from Procedure (use16) + case STARS_NN_retnd: // Return Near from Procedure (use32) + case STARS_NN_retnq: // Return Near from Procedure (use64) + case STARS_NN_retfw: // Return Far from Procedure (use16) + case STARS_NN_retfd: // Return Far from Procedure (use32) + case STARS_NN_retfq: // Return Far from Procedure (use64) return this->BuildReturnRTL(); // RDRAND support - case NN_rdrand: // Read Random Number + case STARS_NN_rdrand: // Read Random Number return this->BuildUnaryRTL(SMP_UNARY_NUMERIC_OPERATION); // new GPR instructions - case NN_adcx: // Unsigned Integer Addition of Two Operands with Carry Flag + case STARS_NN_adcx: // Unsigned Integer Addition of Two Operands with Carry Flag return this->BuildBinaryPlusFlagsRTL(SMP_ADD_CARRY); - case NN_adox: // Unsigned Integer Addition of Two Operands with Overflow Flag - case NN_andn: // Logical AND NOT - case NN_bextr: // Bit Field Extract - case NN_blsi: // Extract Lowest Set Isolated Bit - case NN_blsmsk: // Get Mask Up to Lowest Set Bit - case NN_blsr: // Reset Lowest Set Bit - case NN_bzhi: // Zero High Bits Starting with Specified Bit Position + case STARS_NN_adox: // Unsigned Integer Addition of Two Operands with Overflow Flag + case STARS_NN_andn: // Logical AND NOT + case STARS_NN_bextr: // Bit Field Extract + case STARS_NN_blsi: // Extract Lowest Set Isolated Bit + case STARS_NN_blsmsk: // Get Mask Up to Lowest Set Bit + case STARS_NN_blsr: // Reset Lowest Set Bit + case STARS_NN_bzhi: // Zero High Bits Starting with Specified Bit Position return this->BuildBinaryPlusFlagsRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_clac: // Clear AC Flag in EFLAGS Register + case STARS_NN_clac: // Clear AC Flag in EFLAGS Register return false; - case NN_mulx: // Unsigned Multiply Without Affecting Flags + case STARS_NN_mulx: // Unsigned Multiply Without Affecting Flags return this->BuildBinaryRTL(SMP_U_MULTIPLY); - case NN_pdep: // Parallel Bits Deposit - case NN_pext: // Parallel Bits Extract + case STARS_NN_pdep: // Parallel Bits Deposit + case STARS_NN_pext: // Parallel Bits Extract return this->BuildBinaryRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_rorx: // Rotate Right Logical Without Affecting Flags + case STARS_NN_rorx: // Rotate Right Logical Without Affecting Flags return this->BuildBinaryRTL(SMP_ROTATE_RIGHT); - case NN_sarx: // Shift Arithmetically Right Without Affecting Flags + case STARS_NN_sarx: // Shift Arithmetically Right Without Affecting Flags return this->BuildBinaryRTL(SMP_S_RIGHT_SHIFT); - case NN_shlx: // Shift Logically Left Without Affecting Flags + case STARS_NN_shlx: // Shift Logically Left Without Affecting Flags - case NN_shrx: // Shift Logically Right Without Affecting Flags + case STARS_NN_shrx: // Shift Logically Right Without Affecting Flags return this->BuildBinaryRTL(SMP_U_RIGHT_SHIFT); - case NN_stac: // Set AC Flag in EFLAGS Register + case STARS_NN_stac: // Set AC Flag in EFLAGS Register return false; - case NN_tzcnt: // Count the Number of Trailing Zero Bits + case STARS_NN_tzcnt: // Count the Number of Trailing Zero Bits return this->BuildBinaryRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_xsaveopt: // Save Processor Extended States Optimized - case NN_invpcid: // Invalidate Processor Context ID + case STARS_NN_xsaveopt: // Save Processor Extended States Optimized + case STARS_NN_invpcid: // Invalidate Processor Context ID return false; - case NN_rdseed: // Read Random Seed + case STARS_NN_rdseed: // Read Random Seed return this->BuildBinaryRTL(SMP_BINARY_NUMERIC_OPERATION); - case NN_rdfsbase: // Read FS Segment Base - case NN_rdgsbase: // Read GS Segment Base - case NN_wrfsbase: // Write FS Segment Base - case NN_wrgsbase: // Write GS Segment Base + case STARS_NN_rdfsbase: // Read FS Segment Base + case STARS_NN_rdgsbase: // Read GS Segment Base + case STARS_NN_wrfsbase: // Write FS Segment Base + case STARS_NN_wrgsbase: // Write GS Segment Base return false; // new AVX instructions - case NN_vaddpd: // Add Packed Double-Precision Floating-Point Values - case NN_vaddps: // Packed Single-FP Add - case NN_vaddsd: // Add Scalar Double-Precision Floating-Point Values - case NN_vaddss: // Scalar Single-FP Add - case NN_vaddsubpd: // Add /Sub packed DP FP numbers - case NN_vaddsubps: // Add /Sub packed SP FP numbers + case STARS_NN_vaddpd: // Add Packed Double-Precision Floating-Point Values + case STARS_NN_vaddps: // Packed Single-FP Add + case STARS_NN_vaddsd: // Add Scalar Double-Precision Floating-Point Values + case STARS_NN_vaddss: // Scalar Single-FP Add + case STARS_NN_vaddsubpd: // Add /Sub packed DP FP numbers + case STARS_NN_vaddsubps: // Add /Sub packed SP FP numbers return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_vaesdec: // Perform One Round of an AES Decryption Flow - case NN_vaesdeclast: // Perform the Last Round of an AES Decryption Flow - case NN_vaesenc: // Perform One Round of an AES Encryption Flow - case NN_vaesenclast: // Perform the Last Round of an AES Encryption Flow - case NN_vaesimc: // Perform the AES InvMixColumn Transformation - case NN_vaeskeygenassist: // AES Round Key Generation Assist + case STARS_NN_vaesdec: // Perform One Round of an AES Decryption Flow + case STARS_NN_vaesdeclast: // Perform the Last Round of an AES Decryption Flow + case STARS_NN_vaesenc: // Perform One Round of an AES Encryption Flow + case STARS_NN_vaesenclast: // Perform the Last Round of an AES Encryption Flow + case STARS_NN_vaesimc: // Perform the AES InvMixColumn Transformation + case STARS_NN_vaeskeygenassist: // AES Round Key Generation Assist return this->BuildBinaryRTL(SMP_ENCRYPTION_OPERATION); break; - case NN_vandnpd: // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values - case NN_vandnps: // Bitwise Logical And Not for Single-FP - case NN_vandpd: // Bitwise Logical AND of Packed Double-Precision Floating-Point Values - case NN_vandps: // Bitwise Logical And for Single-FP + case STARS_NN_vandnpd: // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values + case STARS_NN_vandnps: // Bitwise Logical And Not for Single-FP + case STARS_NN_vandpd: // Bitwise Logical AND of Packed Double-Precision Floating-Point Values + case STARS_NN_vandps: // Bitwise Logical And for Single-FP return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_vblendpd: // Blend Packed Double Precision Floating-Point Values - case NN_vblendps: // Blend Packed Single Precision Floating-Point Values - case NN_vblendvpd: // Variable Blend Packed Double Precision Floating-Point Values - case NN_vblendvps: // Variable Blend Packed Single Precision Floating-Point Values + case STARS_NN_vblendpd: // Blend Packed Double Precision Floating-Point Values + case STARS_NN_vblendps: // Blend Packed Single Precision Floating-Point Values + case STARS_NN_vblendvpd: // Variable Blend Packed Double Precision Floating-Point Values + case STARS_NN_vblendvps: // Variable Blend Packed Single Precision Floating-Point Values return this->BuildBinaryRTL(SMP_SHUFFLE); break; - case NN_vbroadcastf128: // Broadcast 128 Bits of Floating-Point Data - case NN_vbroadcasti128: // Broadcast 128 Bits of Integer Data - case NN_vbroadcastsd: // Broadcast Double-Precision Floating-Point Element - case NN_vbroadcastss: // Broadcast Single-Precision Floating-Point Element + case STARS_NN_vbroadcastf128: // Broadcast 128 Bits of Floating-Point Data + case STARS_NN_vbroadcasti128: // Broadcast 128 Bits of Integer Data + case STARS_NN_vbroadcastsd: // Broadcast Double-Precision Floating-Point Element + case STARS_NN_vbroadcastss: // Broadcast Single-Precision Floating-Point Element return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; - case NN_vcmppd: // Compare Packed Double-Precision Floating-Point Values - case NN_vcmpps: // Packed Single-FP Compare - case NN_vcmpsd: // Compare Scalar Double-Precision Floating-Point Values - case NN_vcmpss: // Scalar Single-FP Compare - case NN_vcomisd: // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS - case NN_vcomiss: // Scalar Ordered Single-FP Compare and Set EFLAGS - case NN_vcvtdq2pd: // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values - case NN_vcvtdq2ps: // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values - case NN_vcvtpd2dq: // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers - case NN_vcvtpd2ps: // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values - case NN_vcvtph2ps: // Convert 16-bit FP Values to Single-Precision FP Values - case NN_vcvtps2dq: // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers - case NN_vcvtps2pd: // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values - case NN_vcvtps2ph: // Convert Single-Precision FP value to 16-bit FP value - case NN_vcvtsd2si: // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer - case NN_vcvtsd2ss: // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value - case NN_vcvtsi2sd: // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value - case NN_vcvtsi2ss: // Scalar signed INT32 to Single-FP conversion - case NN_vcvtss2sd: // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value - case NN_vcvtss2si: // Scalar Single-FP to signed INT32 conversion - case NN_vcvttpd2dq: // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers - case NN_vcvttps2dq: // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers - case NN_vcvttsd2si: // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer - case NN_vcvttss2si: // Scalar Single-FP to signed INT32 conversion (truncate) - case NN_vdivpd: // Divide Packed Double-Precision Floating-Point Values - case NN_vdivps: // Packed Single-FP Divide - case NN_vdivsd: // Divide Scalar Double-Precision Floating-Point Values - case NN_vdivss: // Scalar Single-FP Divide - case NN_vdppd: // Dot Product of Packed Double Precision Floating-Point Values - case NN_vdpps: // Dot Product of Packed Single Precision Floating-Point Values + case STARS_NN_vcmppd: // Compare Packed Double-Precision Floating-Point Values + case STARS_NN_vcmpps: // Packed Single-FP Compare + case STARS_NN_vcmpsd: // Compare Scalar Double-Precision Floating-Point Values + case STARS_NN_vcmpss: // Scalar Single-FP Compare + case STARS_NN_vcomisd: // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + case STARS_NN_vcomiss: // Scalar Ordered Single-FP Compare and Set EFLAGS + case STARS_NN_vcvtdq2pd: // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values + case STARS_NN_vcvtdq2ps: // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + case STARS_NN_vcvtpd2dq: // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_vcvtpd2ps: // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values + case STARS_NN_vcvtph2ps: // Convert 16-bit FP Values to Single-Precision FP Values + case STARS_NN_vcvtps2dq: // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_vcvtps2pd: // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values + case STARS_NN_vcvtps2ph: // Convert Single-Precision FP value to 16-bit FP value + case STARS_NN_vcvtsd2si: // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer + case STARS_NN_vcvtsd2ss: // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value + case STARS_NN_vcvtsi2sd: // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value + case STARS_NN_vcvtsi2ss: // Scalar signed INT32 to Single-FP conversion + case STARS_NN_vcvtss2sd: // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value + case STARS_NN_vcvtss2si: // Scalar Single-FP to signed INT32 conversion + case STARS_NN_vcvttpd2dq: // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_vcvttps2dq: // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + case STARS_NN_vcvttsd2si: // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer + case STARS_NN_vcvttss2si: // Scalar Single-FP to signed INT32 conversion (truncate) + case STARS_NN_vdivpd: // Divide Packed Double-Precision Floating-Point Values + case STARS_NN_vdivps: // Packed Single-FP Divide + case STARS_NN_vdivsd: // Divide Scalar Double-Precision Floating-Point Values + case STARS_NN_vdivss: // Scalar Single-FP Divide + case STARS_NN_vdppd: // Dot Product of Packed Double Precision Floating-Point Values + case STARS_NN_vdpps: // Dot Product of Packed Single Precision Floating-Point Values return false; break; - case NN_vextractf128: // Extract Packed Floating-Point Values - case NN_vextracti128: // Extract Packed Integer Values - case NN_vextractps: // Extract Packed Floating-Point Values + case STARS_NN_vextractf128: // Extract Packed Floating-Point Values + case STARS_NN_vextracti128: // Extract Packed Integer Values + case STARS_NN_vextractps: // Extract Packed Floating-Point Values return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; - case NN_vfmadd132pd: // Fused Multiply-Add of Packed Double-Precision Floating-Point Values - case NN_vfmadd132ps: // Fused Multiply-Add of Packed Single-Precision Floating-Point Values - case NN_vfmadd132sd: // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values - case NN_vfmadd132ss: // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values - case NN_vfmadd213pd: // Fused Multiply-Add of Packed Double-Precision Floating-Point Values - case NN_vfmadd213ps: // Fused Multiply-Add of Packed Single-Precision Floating-Point Values - case NN_vfmadd213sd: // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values - case NN_vfmadd213ss: // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values - case NN_vfmadd231pd: // Fused Multiply-Add of Packed Double-Precision Floating-Point Values - case NN_vfmadd231ps: // Fused Multiply-Add of Packed Single-Precision Floating-Point Values - case NN_vfmadd231sd: // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values - case NN_vfmadd231ss: // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values - case NN_vfmaddsub132pd: // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values - case NN_vfmaddsub132ps: // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values - case NN_vfmaddsub213pd: // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values - case NN_vfmaddsub213ps: // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values - case NN_vfmaddsub231pd: // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values - case NN_vfmaddsub231ps: // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values - case NN_vfmsub132pd: // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values - case NN_vfmsub132ps: // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values - case NN_vfmsub132sd: // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values - case NN_vfmsub132ss: // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values - case NN_vfmsub213pd: // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values - case NN_vfmsub213ps: // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values - case NN_vfmsub213sd: // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values - case NN_vfmsub213ss: // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values - case NN_vfmsub231pd: // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values - case NN_vfmsub231ps: // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values - case NN_vfmsub231sd: // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values - case NN_vfmsub231ss: // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values - case NN_vfmsubadd132pd: // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values - case NN_vfmsubadd132ps: // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values - case NN_vfmsubadd213pd: // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values - case NN_vfmsubadd213ps: // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values - case NN_vfmsubadd231pd: // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values - case NN_vfmsubadd231ps: // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values - case NN_vfnmadd132pd: // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values - case NN_vfnmadd132ps: // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values - case NN_vfnmadd132sd: // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values - case NN_vfnmadd132ss: // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values - case NN_vfnmadd213pd: // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values - case NN_vfnmadd213ps: // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values - case NN_vfnmadd213sd: // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values - case NN_vfnmadd213ss: // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values - case NN_vfnmadd231pd: // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values - case NN_vfnmadd231ps: // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values - case NN_vfnmadd231sd: // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values - case NN_vfnmadd231ss: // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values - case NN_vfnmsub132pd: // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values - case NN_vfnmsub132ps: // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values - case NN_vfnmsub132sd: // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values - case NN_vfnmsub132ss: // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values - case NN_vfnmsub213pd: // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values - case NN_vfnmsub213ps: // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values - case NN_vfnmsub213sd: // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values - case NN_vfnmsub213ss: // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values - case NN_vfnmsub231pd: // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values - case NN_vfnmsub231ps: // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values - case NN_vfnmsub231sd: // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values - case NN_vfnmsub231ss: // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfmadd132pd: // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmadd132ps: // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmadd132sd: // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfmadd132ss: // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfmadd213pd: // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmadd213ps: // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmadd213sd: // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfmadd213ss: // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfmadd231pd: // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmadd231ps: // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmadd231sd: // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfmadd231ss: // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfmaddsub132pd: // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmaddsub132ps: // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmaddsub213pd: // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmaddsub213ps: // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmaddsub231pd: // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmaddsub231ps: // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmsub132pd: // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmsub132ps: // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmsub132sd: // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfmsub132ss: // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfmsub213pd: // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmsub213ps: // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmsub213sd: // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfmsub213ss: // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfmsub231pd: // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmsub231ps: // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmsub231sd: // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfmsub231ss: // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfmsubadd132pd: // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmsubadd132ps: // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmsubadd213pd: // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmsubadd213ps: // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfmsubadd231pd: // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfmsubadd231ps: // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfnmadd132pd: // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfnmadd132ps: // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfnmadd132sd: // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfnmadd132ss: // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfnmadd213pd: // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfnmadd213ps: // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfnmadd213sd: // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfnmadd213ss: // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfnmadd231pd: // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + case STARS_NN_vfnmadd231ps: // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + case STARS_NN_vfnmadd231sd: // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfnmadd231ss: // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfnmsub132pd: // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfnmsub132ps: // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfnmsub132sd: // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfnmsub132ss: // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfnmsub213pd: // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfnmsub213ps: // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfnmsub213sd: // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfnmsub213ss: // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + case STARS_NN_vfnmsub231pd: // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + case STARS_NN_vfnmsub231ps: // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + case STARS_NN_vfnmsub231sd: // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + case STARS_NN_vfnmsub231ss: // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_vgatherdps: // Gather Packed SP FP Values Using Signed Dword Indices - case NN_vgatherdpd: // Gather Packed DP FP Values Using Signed Dword Indices - case NN_vgatherqps: // Gather Packed SP FP Values Using Signed Qword Indices - case NN_vgatherqpd: // Gather Packed DP FP Values Using Signed Qword Indices + case STARS_NN_vgatherdps: // Gather Packed SP FP Values Using Signed Dword Indices + case STARS_NN_vgatherdpd: // Gather Packed DP FP Values Using Signed Dword Indices + case STARS_NN_vgatherqps: // Gather Packed SP FP Values Using Signed Qword Indices + case STARS_NN_vgatherqpd: // Gather Packed DP FP Values Using Signed Qword Indices return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; - case NN_vhaddpd: // Add horizontally packed DP FP numbers - case NN_vhaddps: // Add horizontally packed SP FP numbers - case NN_vhsubpd: // Sub horizontally packed DP FP numbers - case NN_vhsubps: // Sub horizontally packed SP FP numbers + case STARS_NN_vhaddpd: // Add horizontally packed DP FP numbers + case STARS_NN_vhaddps: // Add horizontally packed SP FP numbers + case STARS_NN_vhsubpd: // Sub horizontally packed DP FP numbers + case STARS_NN_vhsubps: // Sub horizontally packed SP FP numbers return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_vinsertf128: // Insert Packed Floating-Point Values - case NN_vinserti128: // Insert Packed Integer Values - case NN_vinsertps: // Insert Packed Single Precision Floating-Point Value - case NN_vlddqu: // Load Unaligned Packed Integer Values - case NN_vldmxcsr: // Load Streaming SIMD Extensions Technology Control/Status Register + case STARS_NN_vinsertf128: // Insert Packed Floating-Point Values + case STARS_NN_vinserti128: // Insert Packed Integer Values + case STARS_NN_vinsertps: // Insert Packed Single Precision Floating-Point Value + case STARS_NN_vlddqu: // Load Unaligned Packed Integer Values + case STARS_NN_vldmxcsr: // Load Streaming SIMD Extensions Technology Control/Status Register return false; break; - case NN_vmaskmovdqu: // Store Selected Bytes of Double Quadword with NT Hint - case NN_vmaskmovpd: // Conditionally Load Packed Double-Precision Floating-Point Values - case NN_vmaskmovps: // Conditionally Load Packed Single-Precision Floating-Point Values + case STARS_NN_vmaskmovdqu: // Store Selected Bytes of Double Quadword with NT Hint + case STARS_NN_vmaskmovpd: // Conditionally Load Packed Double-Precision Floating-Point Values + case STARS_NN_vmaskmovps: // Conditionally Load Packed Single-Precision Floating-Point Values return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; - case NN_vmaxpd: // Return Maximum Packed Double-Precision Floating-Point Values - case NN_vmaxps: // Packed Single-FP Maximum - case NN_vmaxsd: // Return Maximum Scalar Double-Precision Floating-Point Value - case NN_vmaxss: // Scalar Single-FP Maximum - case NN_vminpd: // Return Minimum Packed Double-Precision Floating-Point Values - case NN_vminps: // Packed Single-FP Minimum - case NN_vminsd: // Return Minimum Scalar Double-Precision Floating-Point Value - case NN_vminss: // Scalar Single-FP Minimum + case STARS_NN_vmaxpd: // Return Maximum Packed Double-Precision Floating-Point Values + case STARS_NN_vmaxps: // Packed Single-FP Maximum + case STARS_NN_vmaxsd: // Return Maximum Scalar Double-Precision Floating-Point Value + case STARS_NN_vmaxss: // Scalar Single-FP Maximum + case STARS_NN_vminpd: // Return Minimum Packed Double-Precision Floating-Point Values + case STARS_NN_vminps: // Packed Single-FP Minimum + case STARS_NN_vminsd: // Return Minimum Scalar Double-Precision Floating-Point Value + case STARS_NN_vminss: // Scalar Single-FP Minimum return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_vmovapd: // Move Aligned Packed Double-Precision Floating-Point Values - case NN_vmovaps: // Move Aligned Four Packed Single-FP - case NN_vmovd: // Move 32 bits - case NN_vmovddup: // Move One Double-FP and Duplicate - case NN_vmovdqa: // Move Aligned Double Quadword - case NN_vmovdqu: // Move Unaligned Double Quadword - case NN_vmovhlps: // Move High to Low Packed Single-FP - case NN_vmovhpd: // Move High Packed Double-Precision Floating-Point Values - case NN_vmovhps: // Move High Packed Single-FP - case NN_vmovlhps: // Move Low to High Packed Single-FP - case NN_vmovlpd: // Move Low Packed Double-Precision Floating-Point Values - case NN_vmovlps: // Move Low Packed Single-FP - case NN_vmovmskpd: // Extract Packed Double-Precision Floating-Point Sign Mask - case NN_vmovmskps: // Move Mask to Register - case NN_vmovntdq: // Store Double Quadword Using Non-Temporal Hint - case NN_vmovntdqa: // Load Double Quadword Non-Temporal Aligned Hint - case NN_vmovntpd: // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint - case NN_vmovntps: // Move Aligned Four Packed Single-FP Non Temporal - case NN_vmovntsd: // Move Non-Temporal Scalar Double-Precision Floating-Point - case NN_vmovntss: // Move Non-Temporal Scalar Single-Precision Floating-Point - case NN_vmovq: // Move 64 bits - case NN_vmovsd: // Move Scalar Double-Precision Floating-Point Values - case NN_vmovshdup: // Move Packed Single-FP High and Duplicate - case NN_vmovsldup: // Move Packed Single-FP Low and Duplicate - case NN_vmovss: // Move Scalar Single-FP - case NN_vmovupd: // Move Unaligned Packed Double-Precision Floating-Point Values - case NN_vmovups: // Move Unaligned Four Packed Single-FP + case STARS_NN_vmovapd: // Move Aligned Packed Double-Precision Floating-Point Values + case STARS_NN_vmovaps: // Move Aligned Four Packed Single-FP + case STARS_NN_vmovd: // Move 32 bits + case STARS_NN_vmovddup: // Move One Double-FP and Duplicate + case STARS_NN_vmovdqa: // Move Aligned Double Quadword + case STARS_NN_vmovdqu: // Move Unaligned Double Quadword + case STARS_NN_vmovhlps: // Move High to Low Packed Single-FP + case STARS_NN_vmovhpd: // Move High Packed Double-Precision Floating-Point Values + case STARS_NN_vmovhps: // Move High Packed Single-FP + case STARS_NN_vmovlhps: // Move Low to High Packed Single-FP + case STARS_NN_vmovlpd: // Move Low Packed Double-Precision Floating-Point Values + case STARS_NN_vmovlps: // Move Low Packed Single-FP + case STARS_NN_vmovmskpd: // Extract Packed Double-Precision Floating-Point Sign Mask + case STARS_NN_vmovmskps: // Move Mask to Register + case STARS_NN_vmovntdq: // Store Double Quadword Using Non-Temporal Hint + case STARS_NN_vmovntdqa: // Load Double Quadword Non-Temporal Aligned Hint + case STARS_NN_vmovntpd: // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint + case STARS_NN_vmovntps: // Move Aligned Four Packed Single-FP Non Temporal + case STARS_NN_vmovntsd: // Move Non-Temporal Scalar Double-Precision Floating-Point + case STARS_NN_vmovntss: // Move Non-Temporal Scalar Single-Precision Floating-Point + case STARS_NN_vmovq: // Move 64 bits + case STARS_NN_vmovsd: // Move Scalar Double-Precision Floating-Point Values + case STARS_NN_vmovshdup: // Move Packed Single-FP High and Duplicate + case STARS_NN_vmovsldup: // Move Packed Single-FP Low and Duplicate + case STARS_NN_vmovss: // Move Scalar Single-FP + case STARS_NN_vmovupd: // Move Unaligned Packed Double-Precision Floating-Point Values + case STARS_NN_vmovups: // Move Unaligned Four Packed Single-FP return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; - case NN_vmpsadbw: // Compute Multiple Packed Sums of Absolute Difference - case NN_vmulpd: // Multiply Packed Double-Precision Floating-Point Values - case NN_vmulps: // Packed Single-FP Multiply - case NN_vmulsd: // Multiply Scalar Double-Precision Floating-Point Values - case NN_vmulss: // Scalar Single-FP Multiply - case NN_vorpd: // Bitwise Logical OR of Double-Precision Floating-Point Values - case NN_vorps: // Bitwise Logical OR for Single-FP Data - case NN_vpabsb: // Packed Absolute Value Byte - case NN_vpabsd: // Packed Absolute Value Doubleword - case NN_vpabsw: // Packed Absolute Value Word - case NN_vpackssdw: // Pack with Signed Saturation (Dword->Word) - case NN_vpacksswb: // Pack with Signed Saturation (Word->Byte) - case NN_vpackusdw: // Pack with Unsigned Saturation - case NN_vpackuswb: // Pack with Unsigned Saturation (Word->Byte) - case NN_vpaddb: // Packed Add Byte - case NN_vpaddd: // Packed Add Dword - case NN_vpaddq: // Add Packed Quadword Integers - case NN_vpaddsb: // Packed Add with Saturation (Byte) - case NN_vpaddsw: // Packed Add with Saturation (Word) - case NN_vpaddusb: // Packed Add Unsigned with Saturation (Byte) - case NN_vpaddusw: // Packed Add Unsigned with Saturation (Word) - case NN_vpaddw: // Packed Add Word - case NN_vpalignr: // Packed Align Right - case NN_vpand: // Bitwise Logical And - case NN_vpandn: // Bitwise Logical And Not - case NN_vpavgb: // Packed Average (Byte) - case NN_vpavgw: // Packed Average (Word) + case STARS_NN_vmpsadbw: // Compute Multiple Packed Sums of Absolute Difference + case STARS_NN_vmulpd: // Multiply Packed Double-Precision Floating-Point Values + case STARS_NN_vmulps: // Packed Single-FP Multiply + case STARS_NN_vmulsd: // Multiply Scalar Double-Precision Floating-Point Values + case STARS_NN_vmulss: // Scalar Single-FP Multiply + case STARS_NN_vorpd: // Bitwise Logical OR of Double-Precision Floating-Point Values + case STARS_NN_vorps: // Bitwise Logical OR for Single-FP Data + case STARS_NN_vpabsb: // Packed Absolute Value Byte + case STARS_NN_vpabsd: // Packed Absolute Value Doubleword + case STARS_NN_vpabsw: // Packed Absolute Value Word + case STARS_NN_vpackssdw: // Pack with Signed Saturation (Dword->Word) + case STARS_NN_vpacksswb: // Pack with Signed Saturation (Word->Byte) + case STARS_NN_vpackusdw: // Pack with Unsigned Saturation + case STARS_NN_vpackuswb: // Pack with Unsigned Saturation (Word->Byte) + case STARS_NN_vpaddb: // Packed Add Byte + case STARS_NN_vpaddd: // Packed Add Dword + case STARS_NN_vpaddq: // Add Packed Quadword Integers + case STARS_NN_vpaddsb: // Packed Add with Saturation (Byte) + case STARS_NN_vpaddsw: // Packed Add with Saturation (Word) + case STARS_NN_vpaddusb: // Packed Add Unsigned with Saturation (Byte) + case STARS_NN_vpaddusw: // Packed Add Unsigned with Saturation (Word) + case STARS_NN_vpaddw: // Packed Add Word + case STARS_NN_vpalignr: // Packed Align Right + case STARS_NN_vpand: // Bitwise Logical And + case STARS_NN_vpandn: // Bitwise Logical And Not + case STARS_NN_vpavgb: // Packed Average (Byte) + case STARS_NN_vpavgw: // Packed Average (Word) return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_vpblendd: // Blend Packed Dwords - case NN_vpblendvb: // Variable Blend Packed Bytes - case NN_vpblendw: // Blend Packed Words + case STARS_NN_vpblendd: // Blend Packed Dwords + case STARS_NN_vpblendvb: // Variable Blend Packed Bytes + case STARS_NN_vpblendw: // Blend Packed Words return this->BuildBinaryRTL(SMP_SHUFFLE); break; - case NN_vpbroadcastb: // Broadcast a Byte Integer - case NN_vpbroadcastd: // Broadcast a Dword Integer - case NN_vpbroadcastq: // Broadcast a Qword Integer - case NN_vpbroadcastw: // Broadcast a Word Integer - case NN_vpclmulqdq: // Carry-Less Multiplication Quadword - case NN_vpcmpeqb: // Packed Compare for Equal (Byte) - case NN_vpcmpeqd: // Packed Compare for Equal (Dword) - case NN_vpcmpeqq: // Compare Packed Qword Data for Equal - case NN_vpcmpeqw: // Packed Compare for Equal (Word) - case NN_vpcmpestri: // Packed Compare Explicit Length Strings, Return Index - case NN_vpcmpestrm: // Packed Compare Explicit Length Strings, Return Mask - case NN_vpcmpgtb: // Packed Compare for Greater Than (Byte) - case NN_vpcmpgtd: // Packed Compare for Greater Than (Dword) - case NN_vpcmpgtq: // Compare Packed Data for Greater Than - case NN_vpcmpgtw: // Packed Compare for Greater Than (Word) - case NN_vpcmpistri: // Packed Compare Implicit Length Strings, Return Index - case NN_vpcmpistrm: // Packed Compare Implicit Length Strings, Return Mask - case NN_vperm2f128: // Permute Floating-Point Values - case NN_vperm2i128: // Permute Integer Values - case NN_vpermd: // Full Doublewords Element Permutation - case NN_vpermilpd: // Permute Double-Precision Floating-Point Values - case NN_vpermilps: // Permute Single-Precision Floating-Point Values - case NN_vpermpd: // Permute Double-Precision Floating-Point Elements - case NN_vpermps: // Permute Single-Precision Floating-Point Elements - case NN_vpermq: // Qwords Element Permutation - case NN_vpextrb: // Extract Byte - case NN_vpextrd: // Extract Dword - case NN_vpextrq: // Extract Qword - case NN_vpextrw: // Extract Word - case NN_vpgatherdd: // Gather Packed Dword Values Using Signed Dword Indices - case NN_vpgatherdq: // Gather Packed Qword Values Using Signed Dword Indices - case NN_vpgatherqd: // Gather Packed Dword Values Using Signed Qword Indices - case NN_vpgatherqq: // Gather Packed Qword Values Using Signed Qword Indices + case STARS_NN_vpbroadcastb: // Broadcast a Byte Integer + case STARS_NN_vpbroadcastd: // Broadcast a Dword Integer + case STARS_NN_vpbroadcastq: // Broadcast a Qword Integer + case STARS_NN_vpbroadcastw: // Broadcast a Word Integer + case STARS_NN_vpclmulqdq: // Carry-Less Multiplication Quadword + case STARS_NN_vpcmpeqb: // Packed Compare for Equal (Byte) + case STARS_NN_vpcmpeqd: // Packed Compare for Equal (Dword) + case STARS_NN_vpcmpeqq: // Compare Packed Qword Data for Equal + case STARS_NN_vpcmpeqw: // Packed Compare for Equal (Word) + case STARS_NN_vpcmpestri: // Packed Compare Explicit Length Strings, Return Index + case STARS_NN_vpcmpestrm: // Packed Compare Explicit Length Strings, Return Mask + case STARS_NN_vpcmpgtb: // Packed Compare for Greater Than (Byte) + case STARS_NN_vpcmpgtd: // Packed Compare for Greater Than (Dword) + case STARS_NN_vpcmpgtq: // Compare Packed Data for Greater Than + case STARS_NN_vpcmpgtw: // Packed Compare for Greater Than (Word) + case STARS_NN_vpcmpistri: // Packed Compare Implicit Length Strings, Return Index + case STARS_NN_vpcmpistrm: // Packed Compare Implicit Length Strings, Return Mask + case STARS_NN_vperm2f128: // Permute Floating-Point Values + case STARS_NN_vperm2i128: // Permute Integer Values + case STARS_NN_vpermd: // Full Doublewords Element Permutation + case STARS_NN_vpermilpd: // Permute Double-Precision Floating-Point Values + case STARS_NN_vpermilps: // Permute Single-Precision Floating-Point Values + case STARS_NN_vpermpd: // Permute Double-Precision Floating-Point Elements + case STARS_NN_vpermps: // Permute Single-Precision Floating-Point Elements + case STARS_NN_vpermq: // Qwords Element Permutation + case STARS_NN_vpextrb: // Extract Byte + case STARS_NN_vpextrd: // Extract Dword + case STARS_NN_vpextrq: // Extract Qword + case STARS_NN_vpextrw: // Extract Word + case STARS_NN_vpgatherdd: // Gather Packed Dword Values Using Signed Dword Indices + case STARS_NN_vpgatherdq: // Gather Packed Qword Values Using Signed Dword Indices + case STARS_NN_vpgatherqd: // Gather Packed Dword Values Using Signed Qword Indices + case STARS_NN_vpgatherqq: // Gather Packed Qword Values Using Signed Qword Indices return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_vphaddd: // Packed Horizontal Add Doubleword - case NN_vphaddsw: // Packed Horizontal Add and Saturate - case NN_vphaddw: // Packed Horizontal Add Word - case NN_vphminposuw: // Packed Horizontal Word Minimum - case NN_vphsubd: // Packed Horizontal Subtract Doubleword - case NN_vphsubsw: // Packed Horizontal Subtract and Saturate - case NN_vphsubw: // Packed Horizontal Subtract Word + case STARS_NN_vphaddd: // Packed Horizontal Add Doubleword + case STARS_NN_vphaddsw: // Packed Horizontal Add and Saturate + case STARS_NN_vphaddw: // Packed Horizontal Add Word + case STARS_NN_vphminposuw: // Packed Horizontal Word Minimum + case STARS_NN_vphsubd: // Packed Horizontal Subtract Doubleword + case STARS_NN_vphsubsw: // Packed Horizontal Subtract and Saturate + case STARS_NN_vphsubw: // Packed Horizontal Subtract Word return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_vpinsrb: // Insert Byte - case NN_vpinsrd: // Insert Dword - case NN_vpinsrq: // Insert Qword - case NN_vpinsrw: // Insert Word + case STARS_NN_vpinsrb: // Insert Byte + case STARS_NN_vpinsrd: // Insert Dword + case STARS_NN_vpinsrq: // Insert Qword + case STARS_NN_vpinsrw: // Insert Word return false; break; - case NN_vpmaddubsw: // Multiply and Add Packed Signed and Unsigned Bytes - case NN_vpmaddwd: // Packed Multiply and Add + case STARS_NN_vpmaddubsw: // Multiply and Add Packed Signed and Unsigned Bytes + case STARS_NN_vpmaddwd: // Packed Multiply and Add return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_vpmaskmovd: // Conditionally Store Dword Values Using Mask - case NN_vpmaskmovq: // Conditionally Store Qword Values Using Mask + case STARS_NN_vpmaskmovd: // Conditionally Store Dword Values Using Mask + case STARS_NN_vpmaskmovq: // Conditionally Store Qword Values Using Mask return false; break; - case NN_vpmaxsb: // Maximum of Packed Signed Byte Integers - case NN_vpmaxsd: // Maximum of Packed Signed Dword Integers - case NN_vpmaxsw: // Packed Signed Integer Word Maximum + case STARS_NN_vpmaxsb: // Maximum of Packed Signed Byte Integers + case STARS_NN_vpmaxsd: // Maximum of Packed Signed Dword Integers + case STARS_NN_vpmaxsw: // Packed Signed Integer Word Maximum return this->BuildBinaryRTL(SMP_MAX_S); break; - case NN_vpmaxub: // Packed Unsigned Integer Byte Maximum - case NN_vpmaxud: // Maximum of Packed Unsigned Dword Integers - case NN_vpmaxuw: // Maximum of Packed Word Integers + case STARS_NN_vpmaxub: // Packed Unsigned Integer Byte Maximum + case STARS_NN_vpmaxud: // Maximum of Packed Unsigned Dword Integers + case STARS_NN_vpmaxuw: // Maximum of Packed Word Integers return this->BuildBinaryRTL(SMP_MAX_U); break; - case NN_vpminsb: // Minimum of Packed Signed Byte Integers - case NN_vpminsd: // Minimum of Packed Signed Dword Integers - case NN_vpminsw: // Packed Signed Integer Word Minimum + case STARS_NN_vpminsb: // Minimum of Packed Signed Byte Integers + case STARS_NN_vpminsd: // Minimum of Packed Signed Dword Integers + case STARS_NN_vpminsw: // Packed Signed Integer Word Minimum return this->BuildBinaryRTL(SMP_MIN_S); break; - case NN_vpminub: // Packed Unsigned Integer Byte Minimum - case NN_vpminud: // Minimum of Packed Unsigned Dword Integers - case NN_vpminuw: // Minimum of Packed Word Integers + case STARS_NN_vpminub: // Packed Unsigned Integer Byte Minimum + case STARS_NN_vpminud: // Minimum of Packed Unsigned Dword Integers + case STARS_NN_vpminuw: // Minimum of Packed Word Integers return this->BuildBinaryRTL(SMP_MIN_U); break; - case NN_vpmovmskb: // Move Byte Mask to Integer + case STARS_NN_vpmovmskb: // Move Byte Mask to Integer return this->BuildMoveRTL(SMP_NULL_OPERATOR); break; - case NN_vpmovsxbd: // Packed Move with Sign Extend - case NN_vpmovsxbq: // Packed Move with Sign Extend - case NN_vpmovsxbw: // Packed Move with Sign Extend - case NN_vpmovsxdq: // Packed Move with Sign Extend - case NN_vpmovsxwd: // Packed Move with Sign Extend - case NN_vpmovsxwq: // Packed Move with Sign Extend + case STARS_NN_vpmovsxbd: // Packed Move with Sign Extend + case STARS_NN_vpmovsxbq: // Packed Move with Sign Extend + case STARS_NN_vpmovsxbw: // Packed Move with Sign Extend + case STARS_NN_vpmovsxdq: // Packed Move with Sign Extend + case STARS_NN_vpmovsxwd: // Packed Move with Sign Extend + case STARS_NN_vpmovsxwq: // Packed Move with Sign Extend return this->BuildUnary2OpndRTL(SMP_SIGN_EXTEND); break; - case NN_vpmovzxbd: // Packed Move with Zero Extend - case NN_vpmovzxbq: // Packed Move with Zero Extend - case NN_vpmovzxbw: // Packed Move with Zero Extend - case NN_vpmovzxdq: // Packed Move with Zero Extend - case NN_vpmovzxwd: // Packed Move with Zero Extend - case NN_vpmovzxwq: // Packed Move with Zero Extend + case STARS_NN_vpmovzxbd: // Packed Move with Zero Extend + case STARS_NN_vpmovzxbq: // Packed Move with Zero Extend + case STARS_NN_vpmovzxbw: // Packed Move with Zero Extend + case STARS_NN_vpmovzxdq: // Packed Move with Zero Extend + case STARS_NN_vpmovzxwd: // Packed Move with Zero Extend + case STARS_NN_vpmovzxwq: // Packed Move with Zero Extend return this->BuildUnary2OpndRTL(SMP_ZERO_EXTEND); break; - case NN_vpmuldq: // Multiply Packed Signed Dword Integers - case NN_vpmulhrsw: // Packed Multiply High with Round and Scale - case NN_vpmulhuw: // Packed Multiply High Unsigned - case NN_vpmulhw: // Packed Multiply High - case NN_vpmulld: // Multiply Packed Signed Dword Integers and Store Low Result - case NN_vpmullw: // Packed Multiply Low - case NN_vpmuludq: // Multiply Packed Unsigned Doubleword Integers - case NN_vpor: // Bitwise Logical Or - case NN_vpsadbw: // Packed Sum of Absolute Differences + case STARS_NN_vpmuldq: // Multiply Packed Signed Dword Integers + case STARS_NN_vpmulhrsw: // Packed Multiply High with Round and Scale + case STARS_NN_vpmulhuw: // Packed Multiply High Unsigned + case STARS_NN_vpmulhw: // Packed Multiply High + case STARS_NN_vpmulld: // Multiply Packed Signed Dword Integers and Store Low Result + case STARS_NN_vpmullw: // Packed Multiply Low + case STARS_NN_vpmuludq: // Multiply Packed Unsigned Doubleword Integers + case STARS_NN_vpor: // Bitwise Logical Or + case STARS_NN_vpsadbw: // Packed Sum of Absolute Differences return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_vpshufb: // Packed Shuffle Bytes - case NN_vpshufd: // Shuffle Packed Doublewords - case NN_vpshufhw: // Shuffle Packed High Words - case NN_vpshuflw: // Shuffle Packed Low Words + case STARS_NN_vpshufb: // Packed Shuffle Bytes + case STARS_NN_vpshufd: // Shuffle Packed Doublewords + case STARS_NN_vpshufhw: // Shuffle Packed High Words + case STARS_NN_vpshuflw: // Shuffle Packed Low Words return this->BuildBinaryRTL(SMP_SHUFFLE); break; - case NN_vpsignb: // Packed SIGN Byte - case NN_vpsignd: // Packed SIGN Doubleword - case NN_vpsignw: // Packed SIGN Word + case STARS_NN_vpsignb: // Packed SIGN Byte + case STARS_NN_vpsignd: // Packed SIGN Doubleword + case STARS_NN_vpsignw: // Packed SIGN Word return false; break; - case NN_vpslld: // Packed Shift Left Logical (Dword) - case NN_vpslldq: // Shift Double Quadword Left Logical - case NN_vpsllq: // Packed Shift Left Logical (Qword) - case NN_vpsllvd: // Variable Bit Shift Left Logical (Dword) - case NN_vpsllvq: // Variable Bit Shift Left Logical (Qword) - case NN_vpsllw: // Packed Shift Left Logical (Word) - case NN_vpsrad: // Packed Shift Right Arithmetic (Dword) - case NN_vpsravd: // Variable Bit Shift Right Arithmetic - case NN_vpsraw: // Packed Shift Right Arithmetic (Word) - case NN_vpsrld: // Packed Shift Right Logical (Dword) - case NN_vpsrldq: // Shift Double Quadword Right Logical (Qword) - case NN_vpsrlq: // Packed Shift Right Logical (Qword) - case NN_vpsrlvd: // Variable Bit Shift Right Logical (Dword) - case NN_vpsrlvq: // Variable Bit Shift Right Logical (Qword) - case NN_vpsrlw: // Packed Shift Right Logical (Word) + case STARS_NN_vpslld: // Packed Shift Left Logical (Dword) + case STARS_NN_vpslldq: // Shift Double Quadword Left Logical + case STARS_NN_vpsllq: // Packed Shift Left Logical (Qword) + case STARS_NN_vpsllvd: // Variable Bit Shift Left Logical (Dword) + case STARS_NN_vpsllvq: // Variable Bit Shift Left Logical (Qword) + case STARS_NN_vpsllw: // Packed Shift Left Logical (Word) + case STARS_NN_vpsrad: // Packed Shift Right Arithmetic (Dword) + case STARS_NN_vpsravd: // Variable Bit Shift Right Arithmetic + case STARS_NN_vpsraw: // Packed Shift Right Arithmetic (Word) + case STARS_NN_vpsrld: // Packed Shift Right Logical (Dword) + case STARS_NN_vpsrldq: // Shift Double Quadword Right Logical (Qword) + case STARS_NN_vpsrlq: // Packed Shift Right Logical (Qword) + case STARS_NN_vpsrlvd: // Variable Bit Shift Right Logical (Dword) + case STARS_NN_vpsrlvq: // Variable Bit Shift Right Logical (Qword) + case STARS_NN_vpsrlw: // Packed Shift Right Logical (Word) return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_vpsubb: // Packed Subtract Byte - case NN_vpsubd: // Packed Subtract Dword - case NN_vpsubq: // Subtract Packed Quadword Integers - case NN_vpsubsb: // Packed Subtract with Saturation (Byte) - case NN_vpsubsw: // Packed Subtract with Saturation (Word) - case NN_vpsubusb: // Packed Subtract Unsigned with Saturation (Byte) - case NN_vpsubusw: // Packed Subtract Unsigned with Saturation (Word) - case NN_vpsubw: // Packed Subtract Word + case STARS_NN_vpsubb: // Packed Subtract Byte + case STARS_NN_vpsubd: // Packed Subtract Dword + case STARS_NN_vpsubq: // Subtract Packed Quadword Integers + case STARS_NN_vpsubsb: // Packed Subtract with Saturation (Byte) + case STARS_NN_vpsubsw: // Packed Subtract with Saturation (Word) + case STARS_NN_vpsubusb: // Packed Subtract Unsigned with Saturation (Byte) + case STARS_NN_vpsubusw: // Packed Subtract Unsigned with Saturation (Word) + case STARS_NN_vpsubw: // Packed Subtract Word return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_vptest: // Logical Compare + case STARS_NN_vptest: // Logical Compare return false; break; - case NN_vpunpckhbw: // Unpack High Packed Data (Byte->Word) - case NN_vpunpckhdq: // Unpack High Packed Data (Dword->Qword) - case NN_vpunpckhqdq: // Unpack High Packed Data (Qword->Xmmword) - case NN_vpunpckhwd: // Unpack High Packed Data (Word->Dword) - case NN_vpunpcklbw: // Unpack Low Packed Data (Byte->Word) - case NN_vpunpckldq: // Unpack Low Packed Data (Dword->Qword) - case NN_vpunpcklqdq: // Unpack Low Packed Data (Qword->Xmmword) - case NN_vpunpcklwd: // Unpack Low Packed Data (Word->Dword) + case STARS_NN_vpunpckhbw: // Unpack High Packed Data (Byte->Word) + case STARS_NN_vpunpckhdq: // Unpack High Packed Data (Dword->Qword) + case STARS_NN_vpunpckhqdq: // Unpack High Packed Data (Qword->Xmmword) + case STARS_NN_vpunpckhwd: // Unpack High Packed Data (Word->Dword) + case STARS_NN_vpunpcklbw: // Unpack Low Packed Data (Byte->Word) + case STARS_NN_vpunpckldq: // Unpack Low Packed Data (Dword->Qword) + case STARS_NN_vpunpcklqdq: // Unpack Low Packed Data (Qword->Xmmword) + case STARS_NN_vpunpcklwd: // Unpack Low Packed Data (Word->Dword) return this->BuildBinaryRTL(SMP_INTERLEAVE); break; - case NN_vpxor: // Bitwise Logical Exclusive Or - case NN_vrcpps: // Packed Single-FP Reciprocal - case NN_vrcpss: // Scalar Single-FP Reciprocal + case STARS_NN_vpxor: // Bitwise Logical Exclusive Or + case STARS_NN_vrcpps: // Packed Single-FP Reciprocal + case STARS_NN_vrcpss: // Scalar Single-FP Reciprocal return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_vroundpd: // Round Packed Double Precision Floating-Point Values - case NN_vroundps: // Round Packed Single Precision Floating-Point Values - case NN_vroundsd: // Round Scalar Double Precision Floating-Point Values - case NN_vroundss: // Round Scalar Single Precision Floating-Point Values - case NN_vrsqrtps: // Packed Single-FP Square Root Reciprocal - case NN_vrsqrtss: // Scalar Single-FP Square Root Reciprocal + case STARS_NN_vroundpd: // Round Packed Double Precision Floating-Point Values + case STARS_NN_vroundps: // Round Packed Single Precision Floating-Point Values + case STARS_NN_vroundsd: // Round Scalar Double Precision Floating-Point Values + case STARS_NN_vroundss: // Round Scalar Single Precision Floating-Point Values + case STARS_NN_vrsqrtps: // Packed Single-FP Square Root Reciprocal + case STARS_NN_vrsqrtss: // Scalar Single-FP Square Root Reciprocal return false; break; - case NN_vshufpd: // Shuffle Packed Double-Precision Floating-Point Values - case NN_vshufps: // Shuffle Single-FP + case STARS_NN_vshufpd: // Shuffle Packed Double-Precision Floating-Point Values + case STARS_NN_vshufps: // Shuffle Single-FP return this->BuildBinaryRTL(SMP_SHUFFLE); break; - case NN_vsqrtpd: // Compute Square Roots of Packed Double-Precision Floating-Point Values - case NN_vsqrtps: // Packed Single-FP Square Root - case NN_vsqrtsd: // Compute Square Rootof Scalar Double-Precision Floating-Point Value - case NN_vsqrtss: // Scalar Single-FP Square Root - case NN_vstmxcsr: // Store Streaming SIMD Extensions Technology Control/Status Register + case STARS_NN_vsqrtpd: // Compute Square Roots of Packed Double-Precision Floating-Point Values + case STARS_NN_vsqrtps: // Packed Single-FP Square Root + case STARS_NN_vsqrtsd: // Compute Square Rootof Scalar Double-Precision Floating-Point Value + case STARS_NN_vsqrtss: // Scalar Single-FP Square Root + case STARS_NN_vstmxcsr: // Store Streaming SIMD Extensions Technology Control/Status Register return false; break; - case NN_vsubpd: // Subtract Packed Double-Precision Floating-Point Values - case NN_vsubps: // Packed Single-FP Subtract - case NN_vsubsd: // Subtract Scalar Double-Precision Floating-Point Values - case NN_vsubss: // Scalar Single-FP Subtract + case STARS_NN_vsubpd: // Subtract Packed Double-Precision Floating-Point Values + case STARS_NN_vsubps: // Packed Single-FP Subtract + case STARS_NN_vsubsd: // Subtract Scalar Double-Precision Floating-Point Values + case STARS_NN_vsubss: // Scalar Single-FP Subtract return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_vtestpd: // Packed Double-Precision Floating-Point Bit Test - case NN_vtestps: // Packed Single-Precision Floating-Point Bit Test - case NN_vucomisd: // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS - case NN_vucomiss: // Scalar Unordered Single-FP Compare and Set EFLAGS + case STARS_NN_vtestpd: // Packed Double-Precision Floating-Point Bit Test + case STARS_NN_vtestps: // Packed Single-Precision Floating-Point Bit Test + case STARS_NN_vucomisd: // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + case STARS_NN_vucomiss: // Scalar Unordered Single-FP Compare and Set EFLAGS return false; break; - case NN_vunpckhpd: // Unpack and Interleave High Packed Double-Precision Floating-Point Values - case NN_vunpckhps: // Unpack High Packed Single-FP Data - case NN_vunpcklpd: // Unpack and Interleave Low Packed Double-Precision Floating-Point Values - case NN_vunpcklps: // Unpack Low Packed Single-FP Data + case STARS_NN_vunpckhpd: // Unpack and Interleave High Packed Double-Precision Floating-Point Values + case STARS_NN_vunpckhps: // Unpack High Packed Single-FP Data + case STARS_NN_vunpcklpd: // Unpack and Interleave Low Packed Double-Precision Floating-Point Values + case STARS_NN_vunpcklps: // Unpack Low Packed Single-FP Data return this->BuildBinaryRTL(SMP_INTERLEAVE); break; - case NN_vxorpd: // Bitwise Logical OR of Double-Precision Floating-Point Values - case NN_vxorps: // Bitwise Logical XOR for Single-FP Data + case STARS_NN_vxorpd: // Bitwise Logical OR of Double-Precision Floating-Point Values + case STARS_NN_vxorps: // Bitwise Logical XOR for Single-FP Data return this->BuildBinaryRTL(SMP_BINARY_FLOATING_ARITHMETIC); break; - case NN_vzeroall: // Zero All YMM Registers - case NN_vzeroupper: // Zero Upper Bits of YMM Registers + case STARS_NN_vzeroall: // Zero All YMM Registers + case STARS_NN_vzeroupper: // Zero Upper Bits of YMM Registers NopRT = new SMPRegTransfer; NopRT->SetParentInst(this); NopRT->SetOperator(SMP_NULL_OPERATOR); @@ -18099,33 +18104,33 @@ bool SMPInstr::BuildRTL(void) { // Transactional Synchronization Extensions - case NN_xabort: // Transaction Abort - case NN_xbegin: // Transaction Begin - case NN_xend: // Transaction End - case NN_xtest: // Test If In Transactional Execution + case STARS_NN_xabort: // Transaction Abort + case STARS_NN_xbegin: // Transaction Begin + case STARS_NN_xend: // Transaction End + case STARS_NN_xtest: // Test If In Transactional Execution return false; break; // Virtual PC synthetic instructions - case NN_vmgetinfo: // Virtual PC - Get VM Information - case NN_vmsetinfo: // Virtual PC - Set VM Information - case NN_vmdxdsbl: // Virtual PC - Disable Direct Execution - case NN_vmdxenbl: // Virtual PC - Enable Direct Execution - case NN_vmcpuid: // Virtual PC - Virtualized CPU Information - case NN_vmhlt: // Virtual PC - Halt - case NN_vmsplaf: // Virtual PC - Spin Lock Acquisition Failed - case NN_vmpushfd: // Virtual PC - Push virtualized flags register - case NN_vmpopfd: // Virtual PC - Pop virtualized flags register - case NN_vmcli: // Virtual PC - Clear Interrupt Flag - case NN_vmsti: // Virtual PC - Set Interrupt Flag - case NN_vmiretd: // Virtual PC - Return From Interrupt - case NN_vmsgdt: // Virtual PC - Store Global Descriptor Table - case NN_vmsidt: // Virtual PC - Store Interrupt Descriptor Table - case NN_vmsldt: // Virtual PC - Store Local Descriptor Table - case NN_vmstr: // Virtual PC - Store Task Register - case NN_vmsdte: // Virtual PC - Store to Descriptor Table Entry - case NN_vpcext: // Virtual PC - ISA extension + case STARS_NN_vmgetinfo: // Virtual PC - Get VM Information + case STARS_NN_vmsetinfo: // Virtual PC - Set VM Information + case STARS_NN_vmdxdsbl: // Virtual PC - Disable Direct Execution + case STARS_NN_vmdxenbl: // Virtual PC - Enable Direct Execution + case STARS_NN_vmcpuid: // Virtual PC - Virtualized CPU Information + case STARS_NN_vmhlt: // Virtual PC - Halt + case STARS_NN_vmsplaf: // Virtual PC - Spin Lock Acquisition Failed + case STARS_NN_vmpushfd: // Virtual PC - Push virtualized flags register + case STARS_NN_vmpopfd: // Virtual PC - Pop virtualized flags register + case STARS_NN_vmcli: // Virtual PC - Clear Interrupt Flag + case STARS_NN_vmsti: // Virtual PC - Set Interrupt Flag + case STARS_NN_vmiretd: // Virtual PC - Return From Interrupt + case STARS_NN_vmsgdt: // Virtual PC - Store Global Descriptor Table + case STARS_NN_vmsidt: // Virtual PC - Store Interrupt Descriptor Table + case STARS_NN_vmsldt: // Virtual PC - Store Local Descriptor Table + case STARS_NN_vmstr: // Virtual PC - Store Task Register + case STARS_NN_vmsdte: // Virtual PC - Store to Descriptor Table Entry + case STARS_NN_vpcext: // Virtual PC - ISA extension return false; break; @@ -18141,7 +18146,7 @@ bool SMPInstr::BuildRTL(void) { } // end SMPInstr::BuildRTL() // Iterate through all reg transfers and call SyncRTLDefUse for each. -void SMPInstr::SyncAllRTs(bool UseFP, sval_t FPDelta) { +void SMPInstr::SyncAllRTs(bool UseFP, STARS_sval_t FPDelta) { for (std::size_t index = 0; index < this->RTL.GetCount(); ++index) { this->SyncRTLDefUse(this->RTL.GetRT(index), UseFP, FPDelta); } @@ -18149,7 +18154,7 @@ void SMPInstr::SyncAllRTs(bool UseFP, sval_t FPDelta) { } // end of SMPInstr:SyncAllRTs() // Ensure that each operand of the RTL is found in the appropriate DEF or USE list. -void SMPInstr::SyncRTLDefUse(SMPRegTransfer *CurrRT, bool UseFP, sval_t FPDelta) { +void SMPInstr::SyncRTLDefUse(SMPRegTransfer *CurrRT, bool UseFP, STARS_sval_t FPDelta) { // The ExtraKills are almost never represented in the DEF // lists. When they are, they are added in MDFixupDefUseLists(), so we ignore them here. @@ -18172,7 +18177,7 @@ void SMPInstr::SyncRTLDefUse(SMPRegTransfer *CurrRT, bool UseFP, sval_t FPDelta) assert(! LeftOp->IsVoidOp()); assert(! LeftOp->IsImmedOp()); CurrDef = this->Defs.FindRef(LeftOp); - if (CurrDef == this->GetLastDef() && !LeftOp->MatchesReg(R_ip)) { + if (CurrDef == this->GetLastDef() && !LeftOp->MatchesReg(STARS_x86_R_ip)) { #if SMP_VERBOSE_DEBUG_BUILD_RTL SMP_msg("WARNING: DEF not found for SMP_ASSIGN in %s ; added op:", DisAsmText.GetDisAsm(this->GetAddr())); PrintOperand(LeftOp); @@ -18265,7 +18270,7 @@ bool SMPInstr::MDIsAddImmediateToReg(STARSOpndTypePtr &DefOp, STARSOpndTypePtr & bool FoundImmed = false; bool FoundRegUse = false; - if (NN_add == this->GetIDAOpcode()) { + if (STARS_NN_add == this->GetIDAOpcode()) { set<DefOrUse, LessDefUse>::iterator UseIter = this->GetFirstUse(); while (UseIter != this->GetLastUse()) { STARSOpndTypePtr UseOp = UseIter->GetOp(); diff --git a/src/base/SMPProgram.cpp b/src/base/SMPProgram.cpp index 6ee6bd59..4101edc0 100644 --- a/src/base/SMPProgram.cpp +++ b/src/base/SMPProgram.cpp @@ -19,7 +19,7 @@ * e-mail: jwd@virginia.com * URL : http://www.cs.virginia.edu/ * - * Additional copyrights 2010, 2011, 2014 by Zephyr Software LLC + * Additional copyrights 2010, 2011, 2012, 2013, 2014, 2015 by Zephyr Software LLC * e-mail: {clc,jwd}@zephyr-software.com * URL : http://www.zephyr-software.com/ * @@ -42,25 +42,27 @@ #include <cstring> #include <cstdlib> +#include <cassert> #include <pro.h> #include <ua.hpp> -#include <assert.h> +#include <intel.hpp> + +#if 0 #include <ida.hpp> #include <idp.hpp> #include <auto.hpp> #include <bytes.hpp> #include <funcs.hpp> -#include <intel.hpp> #include <name.hpp> +#endif -#include "SMPDBInterface.h" -#include "SMPDataFlowAnalysis.h" -#include "SMPStaticAnalyzer.h" -#include "SMPFunction.h" -#include "SMPBasicBlock.h" -#include "SMPInstr.h" -#include "SMPProgram.h" +#include "interfaces/SMPDBInterface.h" +#include "base/SMPDataFlowAnalysis.h" +#include "base/SMPFunction.h" +#include "base/SMPBasicBlock.h" +#include "base/SMPInstr.h" +#include "base/SMPProgram.h" using namespace std; @@ -88,6 +90,12 @@ STARS_ea_t HighestGlobalVarAddress; STARS_ea_t LowestCodeAddress; STARS_ea_t HighestCodeAddress; +// The types of data objects based on their first operand flags. +static const char *DataTypes[] = { "VOID", "NUMHEX", "NUMDEC", "CHAR", +"SEG", "OFFSET", "NUMBIN", "NUMOCT", "ENUM", "FORCED", +"STRUCTOFFSET", "STACKVAR", "NUMFLOAT", "UNKNOWN", +"UNKNOWN", "UNKNOWN", 0}; + #if 0 // Is Address in a data segment? bool IsDataAddress(STARS_ea_t Address) { @@ -118,18 +126,18 @@ bool MDIsIndexedAccess(STARS_ea_t InstAddr, STARS_ea_t GlobalAddr) { #if SMP_DETECT_INDEXED_ACCESSES for (int i = 0; i < UA_MAXOP; ++i) { STARSOpndTypePtr CurrOp = LocalCmd.Operands[i]; - if ((CurrOp.type == o_mem) || (CurrOp.type == o_displ)) { + if (CurrOp->IsStaticMemOp() || CurrOp->IsMemDisplacementOp()) { if (GlobalAddr == CurrOp.addr) { - if (CurrOp.hasSIB) { + if (CurrOp->HasSIBByte()) { // GlobalAddr is referenced, and SIB byte is present, so we might have // an indexed access to GlobalAddr. - regnum_t IndexReg = sib_index(CurrOp); - if (R_sp != IndexReg) { - // R_sp is a SIB index dummy value; means no index register + short IndexReg = sib_index(CurrOp); + if (STARS_x86_R_sp != IndexReg) { + // STARS_x86_R_sp is a SIB index dummy value; means no index register return true; } } - else if (o_displ == CurrOp.type) { // index reg in reg field, not in SIB byte + else if (CurrOp->IsMemDisplacementOp()) { // index reg in reg field, not in SIB byte return true; } else if (DebugFlag) { @@ -308,7 +316,7 @@ void SMPProgram::InitStaticDataTable(void) { if ((NULL != SegInfo) && (SegInfo->IsCodeSegment())) { bool NewTarget = this->InsertDataToCodeXref(TargetAddr); if (NewTarget) - PrintDataToCodeXref(TempAddr, TargetAddr, 0); + global_STARS_program->PrintDataToCodeXref(TempAddr, TargetAddr, 0); } } } @@ -324,7 +332,7 @@ void SMPProgram::InitStaticDataTable(void) { if ((NULL != SegInfo) && (SegInfo->IsCodeSegment())) { bool NewTarget = this->InsertDataToCodeXref(PossibleCodeAddr); if (NewTarget) - PrintDataToCodeXref(TempAddr, PossibleCodeAddr, 0); + global_STARS_program->PrintDataToCodeXref(TempAddr, PossibleCodeAddr, 0); } } TempAddr += MD_DEFAULT_RETURN_ADDRESS_SIZE; @@ -551,8 +559,8 @@ void SMPProgram::Analyze(ProfilerInformation *pi, FILE *AnnotFile, FILE *InfoAnn #if SMP_DEBUG SMP_msg("INFO: Number of functions: %zu Total Code Size: %llu\n", NumFuncs, STARS_TotalCodeSize); #endif - if (STARS_CODESIZE_FULL_ANALYSIS_LIMIT < STARS_TotalCodeSize) { - STARS_PerformReducedAnalysis = true; + global_STARS_program->ReportTotalCodeSize(STARS_TotalCodeSize); + if (global_STARS_program->ShouldSTARSPerformReducedAnalysis()) { SMP_msg("INFO: Performing reduced STARS analyses due to code size.\n"); } @@ -590,7 +598,7 @@ void SMPProgram::Analyze(ProfilerInformation *pi, FILE *AnnotFile, FILE *InfoAnn else { pair<STARS_ea_t, SMPFunction *> TempFunc(FuncInfo->get_startEA(), CurrFunc); this->FuncMap.insert(TempFunc); - if (STARS_PerformReducedAnalysis) { + if (global_STARS_program->ShouldSTARSPerformReducedAnalysis()) { // Not enough memory to hold all functions. Emit reduced annotations and release memory. CurrFunc->EmitAnnotations(AnnotFile, InfoAnnotFile); // memory released in EmitAnnotations() } @@ -631,7 +639,7 @@ void SMPProgram::Analyze(ProfilerInformation *pi, FILE *AnnotFile, FILE *InfoAnn SMP_msg("INFO: Number of functions in FuncMap: %zu\n", this->FuncMap.size()); #endif - if (STARS_PerformReducedAnalysis) { + if (global_STARS_program->ShouldSTARSPerformReducedAnalysis()) { this->EmitDataAnnotations(this->AnnotationFile, this->InfoAnnotationFile); this->GlobalVarTable.clear(); this->GlobalNameMap.clear(); @@ -950,7 +958,8 @@ void SMPProgram::EmitDataAnnotations(FILE *AnnotFile, FILE *InfoAnnotFile) { SMP_msg("Inserted offset 0 for global var %s\n", TempGlobal.name); #endif } - unsigned long ParentReferentID = DataReferentID++; + unsigned long ParentReferentID = global_STARS_program->GetDataReferentID(); + global_STARS_program->IncrementDataReferentID(); bool DirectAccesses = false; // Any direct field accesses in this global? set<pair<size_t, bool>, LessOff>::iterator CurrOffset; for (CurrOffset = TempGlobal.FieldOffsets.begin(); CurrOffset != TempGlobal.FieldOffsets.end(); ++CurrOffset) { @@ -1005,7 +1014,7 @@ void SMPProgram::EmitDataAnnotations(FILE *AnnotFile, FILE *InfoAnnotFile) { } SMP_fprintf(AnnotFile, "%10x %6zu DATAREF GLOBAL %8lu %llx CHILDOF %lu OFFSET %zu %s + %zu FIELD", - 0, FieldSize, DataReferentID, (uint64) TempGlobal.addr, ParentReferentID, + 0, FieldSize, global_STARS_program->GetDataReferentID(), (uint64) TempGlobal.addr, ParentReferentID, CurrOffset.first, TempGlobal.name, CurrOffset.first); if (CurrOffset.second) { // indexed accesses to this field SMP_fprintf(AnnotFile, " INDEXED\n"); @@ -1013,7 +1022,7 @@ void SMPProgram::EmitDataAnnotations(FILE *AnnotFile, FILE *InfoAnnotFile) { else { // only direct accesses to this field SMP_fprintf(AnnotFile, " DIRECT\n"); } - ++DataReferentID; + global_STARS_program->IncrementDataReferentID(); } } // end if unstructured data ... else ... } // end for all globals in the global var table @@ -1180,7 +1189,7 @@ FuncType SMPProgram::RecurseAndMarkRetAdd(SMPFunction* FuncAttrib) { // If exception throwing code is detected, mark exception-handling functions as unsafe for fast returns. void SMPProgram::ProcessExceptionHandlingFileSections(void) { - string EHFileName(RootFileName); + string EHFileName(global_STARS_program->GetRootFileName()); string FileSuffix(".eh_frame_addrs"); EHFileName += FileSuffix; diff --git a/src/base/SMPStaticAnalyzer.cpp b/src/base/SMPStaticAnalyzer.cpp index 3103453d..6c0755e0 100644 --- a/src/base/SMPStaticAnalyzer.cpp +++ b/src/base/SMPStaticAnalyzer.cpp @@ -19,7 +19,7 @@ * e-mail: jwd@virginia.com * URL : http://www.cs.virginia.edu/ * - * Additional copyrights 2010, 2011 by Zephyr Software LLC + * Additional copyrights 2010, 2011, 2012, 2013, 2014, 2015 by Zephyr Software LLC * e-mail: {clc,jwd}@zephyr-software.com * URL : http://www.zephyr-software.com/ */ @@ -35,10 +35,14 @@ #include <list> #include <vector> #include <set> - #include <string> + #include <ctime> +#include <pro.h> +#include <ua.hpp> +#include <bytes.hpp> + #include "interfaces/SMPDBInterface.h" #include "base/SMPStaticAnalyzer.h" #include "base/SMPDataFlowAnalysis.h" @@ -47,7 +51,9 @@ #include "base/SMPInstr.h" #include "base/ProfilerInformation.h" #include "interfaces/abstract/STARSOp.h" +#include "interfaces/abstract/STARSInterface.h" #include "interfaces/idapro/STARSInterface.h" +#include "interfaces/idapro/STARSProgram.h" using namespace std; @@ -68,7 +74,7 @@ using namespace std; #define SMP_DEBUG_COUNT 356 // How many funcs to process in problem search int FuncsProcessed = 0; -#define SMP_FIXUP_IDB 0 // Try to fix the IDA database? +#define SMP_FIXUP_IDB 0 // Try to fix the IDA database? NOTE: Needs lots of updating before re-enabling. #define SMP_DEBUG_FIXUP_IDB 0 // debugging output for FixupIDB chain #define SMP_FIND_ORPHANS 1 // find code outside of functions #define SMP_DEBUG_CODE_ORPHANS 1 // Detect whether we are causing code to be orphaned @@ -78,175 +84,41 @@ int FuncsProcessed = 0; #define STARS_GENERATE_ASM_FILE 1 // Generate ASM file at end of processing? #define STARS_GENERATE_DIF_FILE STARS_SCCP_CONVERT_UNREACHABLE_BLOCKS // If we optimize, generate DIF file +typedef op_t STARSOpndType; + static SMPProgram *CurrProg = NULL; -STARS_Interface_t* global_stars_interface=NULL; +STARS_Interface_t* global_stars_interface = NULL; +STARS_Program_t *global_STARS_program = NULL; #if SMP_DEBUG_CODE_ORPHANS -set<ea_t> CodeOrphans; +set<STARS_ea_t> CodeOrphans; #endif +// Should we convert the x86 LOCK prefix byte to a no-op to avoid +// IDA Pro problems with instructions that jump past the LOCK +// prefix and look like they are jumping into the middle of an +// instruction? +#define STARS_REMOVE_LOCK_PREFIX 0 // Lock prefix for x86 code; jumping around this prefix conditionally looks like jumping // into the middle of an instruction to IDA Pro, causing it to not collect instructions // into a procedure. We replace these bytes with no-op opcodes because none of our analyses // care about LOCK prefices. We store the addresses where we have done the replacement in a // set in case we ever care. #define X86_LOCK_PREFIX 0xF0 -set<ea_t> LockPreficesRemoved; // Addresses where x86 LOCK prefix byte was turned into a no-op by STARS_custom_ana() callback. +set<STARS_ea_t> LockPreficesRemoved; // Addresses where x86 LOCK prefix byte was turned into a no-op by STARS_custom_ana() callback. static unsigned long CustomAnaCallCount = 0; -// Define optimization categories for instructions. -int OptCategory[NN_last + 1]; -// Initialize the OptCategory[] array. -void InitOptCategory(void); - -// Flag to force reduced analysis so we don't run out of virtual memory -bool STARS_PerformReducedAnalysis; - -// Indentation level when emitting SPARK Ada translation of the RTLs. -unsigned short STARS_SPARK_IndentCount; - -// Record which opcodes change the stack pointer, and by how many -// bytes up (reduction in stack size for stacks that grow downward) -// or down (increase in stack size for stacks that grow downward). -sval_t StackAlteration[NN_last + 1]; -// Initialize the StackAlteration[] array. -void InitStackAlteration(void); - -// Keep statistics on how many instructions we saw in each optimization -// category, and how many optimizing annotations were emitted for -// each category. -int OptCount[LAST_OPT_CATEGORY + 1]; -int AnnotationCount[LAST_OPT_CATEGORY + 1]; - -// Unique data referent number to use in data annotations. -unsigned long DataReferentID; - -// Debugging counters for analyzing memory usage. -unsigned long UnusedInstrCount; -unsigned long UnusedBlockCount; -unsigned long UnusedStructCount; -unsigned long UnusedIntCount; - -// Counters for dead metadata analysis. -unsigned long DeadMetadataCount; -unsigned long LiveMetadataCount; - -// Counters for indirect jump resolution. -unsigned long ResolvedIndirectJumpCount; -unsigned long UnresolvedIndirectJumpCount; - -// Counters for measuring SCCP success in finding constant DEFs. -unsigned long ConstantDEFCount; -unsigned long AlwaysTakenBranchCount; -unsigned long NeverTakenBranchCount; - -// Counters for accessing less than machine register width. -unsigned long SubwordRegCount; -unsigned long SubwordMemCount; -unsigned long SubwordAddressRegCount; -unsigned long SPARKOperandCount; // total operands printed - -#if SMP_COUNT_MEMORY_ALLOCATIONS -// Counters for analyzing memory use for allocated and used objects. -unsigned long SMPInstCount; -unsigned long SMPBlockCount; -unsigned long SMPFuncCount; -unsigned long SMPGlobalVarCount; -unsigned long SMPLocalVarCount; -unsigned long SMPDefUseChainCount; -unsigned long SMPInstBytes; -unsigned long SMPDefUseChainBytes; -#endif - -#if SMP_MEASURE_NUMERIC_ANNOTATIONS -unsigned long NumericAnnotationsCount12; // cases 1 and 2 -unsigned long NumericAnnotationsCount3; // case 3 -unsigned long TruncationAnnotationsCount; // case 4 -unsigned long SignednessWithoutTruncationCount; // case 5 -unsigned long LeaInstOverflowCount; // case 6 -unsigned long WidthDoublingTruncationCount; // case 7 -unsigned long BenignOverflowInstCount; -unsigned long BenignOverflowDefCount; -unsigned long SuppressStackPtrOverflowCount; -unsigned long SuppressLiveFlagsOverflowCount; -unsigned long LiveMultiplyBitsCount; -unsigned long BenignTruncationCount; -unsigned long SuppressTruncationRegPiecesAllUsed; -unsigned long SuppressSignednessOnTruncation; -#endif - -#if STARS_SCCP_GATHER_STATISTICS -// Counters for analyzing Sparse Conditional Constant Propagation effectiveness. -unsigned long SCCPFuncsWithArgWriteCount; -unsigned long SCCPFuncsWithConstantArgWriteCount; -unsigned long SCCPOutgoingArgWriteCount; -unsigned long SCCPConstantOutgoingArgWriteCount; -#endif - -// Counter for max # of basic blocks seen in one function. -unsigned long STARS_MaxBlockCount; - -// Is the binary a 32-bit, 64-bit, etc. instruction set architecture -size_t STARS_ISA_Bitwidth; -size_t STARS_ISA_Bytewidth; -char STARS_ISA_dtyp; -int STARS_MD_LAST_SAVED_REG_NUM; - - -// The types of data objects based on their first operand flags. -const char *DataTypes[] = { "VOID", "NUMHEX", "NUMDEC", "CHAR", - "SEG", "OFFSET", "NUMBIN", "NUMOCT", "ENUM", "FORCED", - "STRUCTOFFSET", "STACKVAR", "NUMFLOAT", "UNKNOWN", - "UNKNOWN", "UNKNOWN", 0}; - -// Filename (not including path) of executable being analyzed. -char RootFileName[MAXSTR]; - -// strings for printing ZST_SysCallType -const char *CallTypeNames[4] = { "Unrestricted", "High-Privilege", "File-Access", "Network-Access" }; - -DisAsmString DisAsmText; - -// Operand type that can have all fields initialized to o_void and zero -// values, to be used to copy-initialize operands that we are adding to -// RTLs and DEF and USE lists. -STARSOpndType InitOp; - -// File foo.exe.alarms for Zephyr Security Toolkit security alarm messages. -FILE *ZST_AlarmFile; - -// File for code xref targets (helps ILR, makes IRDB more complete) -FILE *STARS_XrefsFile; - -// File to provide details on fast returns, safe and unsafe return-address functions, etc. -FILE *STARS_CallReturnFile; - -FILE *ZST_SPARKSourceFile; -FILE *ZST_SPARKHeaderFile; - // Code addresses identified by a disassembler, such as objdump on // Linux. These can be used to improve the code vs. data identification // of IDA Pro. -vector<ea_t> DisasmLocs; +vector<STARS_ea_t> DisasmLocs; // Code addresses as identified by IDA Pro, to be compared to DisasmLocs. -vector<ea_t> IDAProLocs; - -// Bit masks for extracting bits from a STARSBitSet unsigned char. -const unsigned char STARSBitMasks[8] = { 1, 2, 4, 8, 16, 32, 64, 128 }; - -// Function start and end addresses (for function entry chunks only). -// Kept here because IDA Pro 5.1 seems to have a memory overwriting -// problem when iterating through all functions in the program. An existing -// STARS_Function_t *ChunkInfo data structure was getting overwritten by one of the -// function STARS_Function_t data structures, causing changes of startEA and endEA among -// other things. - -vector<SMP_bounds_t> FuncBounds; +vector<STARS_ea_t> IDAProLocs; // List of functions that need to be reanalyzed after all the code fixup // and code discovery is complete. Kept as a list of addresses; any address // within the function is good enough to designate it. -list<ea_t> FuncReanalyzeList; +list<STARS_ea_t> FuncReanalyzeList; // A code region that has been converted from data but has code addresses that // need to be reanalyzed. This is usually because a former data address is @@ -255,10 +127,10 @@ list<ea_t> FuncReanalyzeList; class FixupRegion { public: FixupRegion(SMP_bounds_t); - inline ea_t GetStart(void) const { return CodeRegion.startEA; }; - inline ea_t GetEnd(void) const { return CodeRegion.endEA; }; - inline void SetStart(ea_t addr) { CodeRegion.startEA = addr; }; - list<ea_t> FixupInstrs; // easier to expose than to encapsulate + inline STARS_ea_t GetStart(void) const { return CodeRegion.startEA; }; + inline STARS_ea_t GetEnd(void) const { return CodeRegion.endEA; }; + inline void SetStart(STARS_ea_t addr) { CodeRegion.startEA = addr; }; + list<STARS_ea_t> FixupInstrs; // easier to expose than to encapsulate private: SMP_bounds_t CodeRegion; }; @@ -305,14 +177,13 @@ void FixCodeIdentification(void); int FixupNewCodeChunks(void); void AuditCodeTargets(void); void SpecialDebugOutput(void); -void RemoveIDACodeAddr(ea_t); -void ZST_InitPolicies(const char *); +void RemoveIDACodeAddr(STARS_ea_t); static unsigned long DebugCounter = 0; // Turn LOCK prefix into no-op when detected. Each is one byte in length. -bool STARS_custom_ana(ea_t CurrentAddr) { - // static_assert(sizeof(ea_t) == sizeof(uintptr_t), "Sizeof mismatch between ea_t and uintptr_t"); +bool STARS_custom_ana(STARS_ea_t CurrentAddr) { + // static_assert(sizeof(STARS_ea_t) == sizeof(uintptr_t), "Sizeof mismatch between STARS_ea_t and uintptr_t"); int code = get_byte(CurrentAddr); ++CustomAnaCallCount; if (X86_LOCK_PREFIX != code) { @@ -333,7 +204,7 @@ bool STARS_custom_ana(ea_t CurrentAddr) { ++DebugCounter; } #endif - pair<set<ea_t>::iterator, bool> InsertResult; + pair<set<STARS_ea_t>::iterator, bool> InsertResult; InsertResult = LockPreficesRemoved.insert(CurrentAddr); assert(InsertResult.second); cmd.itype = NN_nop; // make it a no-op @@ -351,12 +222,12 @@ bool STARS_custom_ana(ea_t CurrentAddr) { static int idaapi idp_callback(void *, int event_id, va_list va) { #if STARS_REMOVE_LOCK_PREFIX if (event_id == processor_t::custom_ana) { - ea_t CurrentAddr = cmd.ea; + STARS_ea_t CurrentAddr = cmd.ea; #if 1 int code = ua_next_byte(); ++CustomAnaCallCount; if (X86_LOCK_PREFIX == code) { - pair<set<ea_t>::iterator, bool> InsertResult; + pair<set<STARS_ea_t>::iterator, bool> InsertResult; InsertResult = LockPreficesRemoved.insert(CurrentAddr); cmd.itype = NN_nop; // make it a no-op return (int) (cmd.size + 1); @@ -395,7 +266,8 @@ static int idaapi idp_callback(void *, int event_id, va_list va) { int IDAP_init(void) { /* init the interface */ - global_stars_interface=new STARS_IDA_Interface_t; + global_stars_interface = new STARS_IDA_Interface_t; + global_STARS_program = new STARS_IDA_Program_t; #if 0 // We are now calling from the SMP.idc script. @@ -426,73 +298,6 @@ int IDAP_init(void) { #endif hook_to_notification_point(HT_IDP, idp_callback, NULL); - STARS_PerformReducedAnalysis = false; - STARS_SPARK_IndentCount = 1; - DataReferentID = 1; - UnusedStructCount = 0; - UnusedIntCount = 0; - DeadMetadataCount = 0; - LiveMetadataCount = 0; - ResolvedIndirectJumpCount = 0; - UnresolvedIndirectJumpCount = 0; - ConstantDEFCount = 0; - AlwaysTakenBranchCount = 0; - NeverTakenBranchCount = 0; - SubwordRegCount = 0; - SubwordMemCount = 0; - SubwordAddressRegCount = 0; - SPARKOperandCount = 0; -#if SMP_COUNT_MEMORY_ALLOCATIONS - SMPInstCount = 0; - SMPBlockCount = 0; - SMPDefUseChainCount = 0; - SMPFuncCount = 0; - SMPGlobalVarCount = 0; - SMPLocalVarCount = 0; - SMPInstBytes = 0; - SMPDefUseChainBytes = 0; -#endif -#if SMP_MEASURE_NUMERIC_ANNOTATIONS - NumericAnnotationsCount12 = 0; - NumericAnnotationsCount3 = 0; - TruncationAnnotationsCount = 0; - SignednessWithoutTruncationCount = 0; - LeaInstOverflowCount = 0; - WidthDoublingTruncationCount = 0; - BenignOverflowInstCount = 0; - BenignOverflowDefCount = 0; - SuppressStackPtrOverflowCount = 0; - SuppressLiveFlagsOverflowCount = 0; - LiveMultiplyBitsCount = 0; - BenignTruncationCount = 0; - SuppressTruncationRegPiecesAllUsed = 0; - SuppressSignednessOnTruncation = 0; -#endif -#if STARS_SCCP_GATHER_STATISTICS - SCCPFuncsWithArgWriteCount = 0; - SCCPFuncsWithConstantArgWriteCount = 0; - SCCPOutgoingArgWriteCount = 0; - SCCPConstantOutgoingArgWriteCount = 0; -#endif - STARS_MaxBlockCount = 0; - InitOp.n = 0; - InitOp.type = o_void; - InitOp.offb = 0; - InitOp.offo = 0; - InitOp.flags = 0; - InitOp.set_showed(); - // NOTE: InitOp.dtyp field is initialized in IDAP_run() to 32 or 64 bits. - InitOp.reg = R_none; - InitOp.value = 0; - InitOp.addr = 0; - InitOp.specval = 0; - InitOp.specflag1 = 0; - InitOp.specflag2 = 0; - InitOp.specflag3 = 0; - InitOp.specflag4 = 0; - ZST_AlarmFile = NULL; - ZST_SPARKSourceFile = NULL; - ZST_SPARKHeaderFile = NULL; #ifdef STARS_IRDB_INTERFACE SMPLogFile = NULL; #endif @@ -523,37 +328,41 @@ void IDAP_run(int arg) { } while(difftime(current,start) < 15.0); #endif +#if SMP_DEBUG + SMP_msg("Beginning IDAP_run.\n"); +#endif + + SMP_msg("IDA SDK version: %d \n", IDA_SDK_VERSION); + +#ifdef STARS_IDA_INTERFACE + DefOrUse DummyRef; + STARSOpndType DummyOperand; + size_t RefObjectSize = sizeof(DummyRef), OpndSize = sizeof(DummyOperand); + SMP_msg("INFO: Size of DefOrUse: %zu Size of op_t: %zu \n", RefObjectSize, OpndSize); + SMP_msg("INFO: Size of STARS_ea_t: %zu Size of uintptr_t: %zu \n", sizeof(STARS_ea_t), sizeof(uintptr_t)); +#endif + if (inf.is_64bit()) { - STARS_ISA_Bitwidth = 64; - STARS_ISA_dtyp = dt_qword; - STARS_MD_LAST_SAVED_REG_NUM = R_r15; + global_STARS_program->Set64BitBinary(); SMP_msg("INFO: 64-bit binary detected.\n"); } else { - STARS_ISA_Bitwidth = 32; - STARS_ISA_dtyp = dt_dword; - STARS_MD_LAST_SAVED_REG_NUM = R_di; + global_STARS_program->Set32BitBinary(); SMP_msg("INFO: 32-bit binary detected.\n"); } - STARS_ISA_Bytewidth = (STARS_ISA_Bitwidth / 8); - InitOp.dtyp = STARS_ISA_dtyp; - - InitOptCategory(); - InitDFACategory(); - InitTypeCategory(); - InitSMPDefsFlags(); - InitSMPUsesFlags(); - InitLibFuncFGInfoMaps(); - InitIntegerErrorCallSinkMap(); - InitUnsignedArgPositionMap(); - InitTaintWarningArgPositionMap(); - InitPointerArgPositionMap(); - InitStackAlteration(); - MDInitializeCallerSavedRegs(); - MDInitializeArgumentRegs(); + + global_STARS_program->InitData(); + global_STARS_program->DetermineRootFileName(); + if (!(global_STARS_program->OpenFiles())) { + SMP_msg("FATAL ERROR: At least one file could not be opened.\n"); + error("FATAL ERROR: At least one file could not be opened.\n"); + delete global_STARS_program; + delete global_stars_interface; + return; + } #ifdef STARS_IRDB_INTERFACE - string ZSTLogFileName(RootFileName); + string ZSTLogFileName(global_STARS_program->GetRootFileName()); string LogFileSuffix(".STARSlog"); ZSTLogFileName += LogFileSuffix; SMPLogFile = SMP_fopen(ZSTLogFileName.c_str(), "w"); @@ -564,55 +373,19 @@ void IDAP_run(int arg) { } #endif -#if SMP_DEBUG - SMP_msg("Beginning IDAP_run.\n"); -#endif - - SMP_msg("IDA SDK version: %d \n", IDA_SDK_VERSION); - -#if 1 - DefOrUse DummyRef; - STARSOpndType DummyOperand; - size_t RefObjectSize = sizeof(DummyRef), OpndSize = sizeof(DummyOperand); - SMP_msg("INFO: Size of DefOrUse: %zu Size of op_t: %zu \n", RefObjectSize, OpndSize); - SMP_msg("INFO: Size of ea_t: %zu Size of uintptr_t: %zu \n", sizeof(ea_t), sizeof(uintptr_t)); -#endif - // Open the output file. - STARS_ssize_t FileLen; - FileLen = get_root_filename(RootFileName, sizeof(RootFileName) - 1); - string AnnotFileName(RootFileName); + string AnnotFileName(global_STARS_program->GetRootFileName()); string FileSuffix(".annot"); AnnotFileName += FileSuffix; - string InfoAnnotFileName(RootFileName); + string InfoAnnotFileName(global_STARS_program->GetRootFileName()); string InfoFileSuffix(".infoannot"); InfoAnnotFileName += InfoFileSuffix; - string ZSTPolicyFileName(RootFileName); - string PolicyFileSuffix(".policy"); - ZSTPolicyFileName += PolicyFileSuffix; - string ZSTAlarmFileName(RootFileName); - string AlarmFileSuffix(".alarms"); - ZSTAlarmFileName += AlarmFileSuffix; - string AsmFileName(RootFileName); + string AsmFileName(global_STARS_program->GetRootFileName()); string AsmFileSuffix(".asm"); AsmFileName += AsmFileSuffix; - string DifFileName(RootFileName); + string DifFileName(global_STARS_program->GetRootFileName()); string DifFileSuffix(".dif"); DifFileName += DifFileSuffix; - string XrefsFileName(RootFileName); - string XrefsFileSuffix(".STARSxrefs"); - XrefsFileName += XrefsFileSuffix; - string CallRetFileName(RootFileName); - string CallRetFileSuffix(".STARScallreturn"); - CallRetFileName += CallRetFileSuffix; -#if ZST_EMIT_SPARK_ADA_TRANSLATION - string SPARKSourceFileName(RootFileName); - string SPARKSourceFileSuffix(".ZSTSPARK.adb"); - SPARKSourceFileName += SPARKSourceFileSuffix; - string SPARKHeaderFileName(RootFileName); - string SPARKHeaderFileSuffix(".ZSTSPARK.ads"); - SPARKHeaderFileName += SPARKHeaderFileSuffix; -#endif // For debugging, we can add a delay loop so we have time to attach gdb to the // running process and set a breakpoint. @@ -627,7 +400,7 @@ void IDAP_run(int arg) { } while(difftime(current,start) < 15.0); #endif - ea_t RecentAddr; + STARS_ea_t RecentAddr; #if SMP_DEBUG_CODE_ORPHANS CodeOrphans.clear(); RecentAddr = BADADDR; @@ -638,102 +411,48 @@ void IDAP_run(int arg) { } #endif - STARS_XrefsFile = SMP_fopen(XrefsFileName.c_str(), "w"); - if (NULL == STARS_XrefsFile) { - error("FATAL ERROR: Cannot open STARS code xrefs file %s\n", XrefsFileName.c_str()); - return; - } - - STARS_CallReturnFile = SMP_fopen(CallRetFileName.c_str(), "w"); - if (NULL == STARS_CallReturnFile) { - error("FATAL ERROR: Cannot open STARS calls and returns info file %s\n", CallRetFileName.c_str()); - SMP_fclose(STARS_XrefsFile); - return; - } - CurrProg = new SMPProgram(); CurrProg->AnalyzeData(); // Analyze static data in the executable // read the Profiler generated information into a new prof_info class ProfilerInformation *prof_info = new ProfilerInformation(AnnotFileName.c_str(), CurrProg); + // NOTE: ProfilerInformation fopen's the AnnotFile, reads it, then closes it. Then we re-open for writing below. AnnotFile = SMP_fopen(AnnotFileName.c_str(), "w"); if (NULL == AnnotFile) { error("FATAL ERROR: Cannot open output file %s\n", AnnotFileName.c_str()); - SMP_fclose(STARS_XrefsFile); - SMP_fclose(STARS_CallReturnFile); + global_STARS_program->CloseFiles(); delete prof_info; + delete CurrProg; + delete global_STARS_program; + delete global_stars_interface; return; } InfoAnnotFile = SMP_fopen(InfoAnnotFileName.c_str(), "w"); if (NULL == InfoAnnotFile) { error("FATAL ERROR: Cannot open output file %s\n", InfoAnnotFileName.c_str()); - SMP_fclose(STARS_XrefsFile); - SMP_fclose(STARS_CallReturnFile); - SMP_fclose(AnnotFile); - delete prof_info; - return; - } - ZST_AlarmFile = SMP_fopen(ZSTAlarmFileName.c_str(), "w"); - if (NULL == ZST_AlarmFile) { - error("FATAL ERROR: Cannot open security alarms file %s\n", ZSTAlarmFileName.c_str()); - SMP_fclose(STARS_XrefsFile); - SMP_fclose(STARS_CallReturnFile); - SMP_fclose(AnnotFile); - SMP_fclose(InfoAnnotFile); - delete prof_info; - return; - } -#if ZST_EMIT_SPARK_ADA_TRANSLATION - ZST_SPARKSourceFile = SMP_fopen(SPARKSourceFileName.c_str(), "w"); - if (NULL == ZST_SPARKSourceFile) { - error("FATAL ERROR: Cannot open SPARK-Ada source output file %s\n", SPARKSourceFileName.c_str()); - SMP_fclose(STARS_XrefsFile); - SMP_fclose(STARS_CallReturnFile); - SMP_fclose(AnnotFile); - SMP_fclose(InfoAnnotFile); - SMP_fclose(ZST_AlarmFile); - delete prof_info; - return; - } - ZST_SPARKHeaderFile = SMP_fopen(SPARKHeaderFileName.c_str(), "w"); - if (NULL == ZST_SPARKHeaderFile) { - error("FATAL ERROR: Cannot open SPARK-Ada header output file %s\n", SPARKHeaderFileName.c_str()); - SMP_fclose(STARS_XrefsFile); - SMP_fclose(STARS_CallReturnFile); + global_STARS_program->CloseFiles(); SMP_fclose(AnnotFile); - SMP_fclose(InfoAnnotFile); - SMP_fclose(ZST_AlarmFile); - SMP_fclose(ZST_SPARKSourceFile); delete prof_info; + delete CurrProg; + delete global_STARS_program; + delete global_stars_interface; return; } -#endif // Read the Zephyr Security Toolkit system call security policies, if available. - ZST_InitPolicies(ZSTPolicyFileName.c_str()); - - (void) memset(OptCount, 0, sizeof(OptCount)); - (void) memset(AnnotationCount, 0, sizeof(AnnotationCount)); + global_STARS_program->ZST_InitPolicies(); try { // We will catch memory exhaustion errors. - // Record the start and end addresses for all function entry - // chunks in the program. - FuncBounds.reserve(10 + get_func_qty()); - for (size_t FuncIndex = 0; FuncIndex < SMP_get_func_qty(); ++FuncIndex) { - STARS_Function_t *FuncInfo = SMP_getn_func(FuncIndex); - SMP_bounds_t temp; - temp.startEA = FuncInfo->get_startEA(); - temp.endEA = FuncInfo->get_endEA(); - FuncBounds.push_back(temp); - } - #if SMP_DEBUG_DATA_ONLY FindDataInCode(); FixCodeIdentification(); SMP_fclose(SymsFile); delete prof_info; + delete CurrProg; + delete global_STARS_program; + delete global_stars_interface; return; #endif @@ -752,10 +471,12 @@ void IDAP_run(int arg) { } CurrProg->ProfGranularityFinished(AnnotFile, InfoAnnotFile); CurrProg->Analyze(prof_info, AnnotFile, InfoAnnotFile); - if (!STARS_PerformReducedAnalysis) { + if (!global_STARS_program->ShouldSTARSPerformReducedAnalysis()) { CurrProg->EmitAnnotations(AnnotFile, InfoAnnotFile); } + // Process the instructions that are not in functions (generally, an IDA problem, or just no-ops for + // alignment purposes). #if SMP_DEBUG_CODE_ORPHANS RecentAddr = BADADDR; for (STARS_Segment_t *seg = SMP_get_first_seg(); NULL != seg; seg = SMP_get_next_seg(RecentAddr)) { @@ -774,23 +495,18 @@ void IDAP_run(int arg) { } #endif + // Output statistics. for (int OptType = 0; OptType <= LAST_OPT_CATEGORY; ++OptType) { SMP_msg("Optimization Category Count %d: %d Annotations: %d\n", - OptType, OptCount[OptType], AnnotationCount[OptType]); + OptType, global_STARS_program->GetOptCount(OptType), global_STARS_program->GetAnnotationCount(OptType)); } + global_STARS_program->CloseFiles(); SMP_fclose(AnnotFile); SMP_fprintf(InfoAnnotFile, " 8000000 2 SUCCESS ANALYSISCOMPLETED\n"); SMP_fclose(InfoAnnotFile); - SMP_fclose(ZST_AlarmFile); - SMP_fclose(STARS_XrefsFile); - SMP_fclose(STARS_CallReturnFile); -#if ZST_EMIT_SPARK_ADA_TRANSLATION - SMP_fclose(ZST_SPARKSourceFile); - SMP_fclose(ZST_SPARKHeaderFile); -#endif - if (!STARS_PerformReducedAnalysis) { + if (!global_STARS_program->ShouldSTARSPerformReducedAnalysis()) { #if STARS_GENERATE_ASM_FILE AsmFile = SMP_fopen(AsmFileName.c_str(), "w"); if (NULL == AsmFile) { @@ -823,24 +539,26 @@ void IDAP_run(int arg) { SMP_msg("INFO: Deleted prof_info.\n"); delete CurrProg; SMP_msg("INFO: Deleted CurrProg. Returning to IDA Pro.\n"); + delete global_STARS_program; + delete global_stars_interface; return; } catch (std::bad_alloc) { - delete CurrProg; - delete prof_info; error("FATAL ERROR: Memory exhausted.\n"); SMP_fprintf(InfoAnnotFile, " 8000000 2 ERROR MEMORYEXHAUSTED\n"); SMP_fclose(AnnotFile); SMP_fclose(InfoAnnotFile); - SMP_fclose(ZST_AlarmFile); - SMP_fclose(STARS_XrefsFile); + delete CurrProg; + delete prof_info; + delete global_STARS_program; + delete global_stars_interface; return; } } // end IDAP_run() -char IDAP_comment[] = "ZephyrSoftware STARS (Static Analyzer for Reliability and Security)"; +char IDAP_comment[] = "Zephyr Software STARS (Static Analyzer for Reliability and Security)"; char IDAP_help[] = "Good luck"; -char IDAP_name[] = "SMPStaticAnalyzer"; +char IDAP_name[] = "STARS"; char IDAP_hotkey[] = "Alt-J"; plugin_t PLUGIN = { @@ -860,8 +578,8 @@ plugin_t PLUGIN = { // disassembler (e.g. objdump) and enter them into DisasmLocs. void FindCodeAddresses(void) { // Read in code addresses as found by an external disassembler. - ea_t CurrDisasmAddr; - string DisasmFileName(RootFileName); + STARS_ea_t CurrDisasmAddr; + string DisasmFileName(global_STARS_program->GetRootFileName()); string FileSuffix(".SMPobjdump"); DisasmFileName += FileSuffix; FILE *DisasmFile = SMP_fopen(DisasmFileName.c_str(), "r"); @@ -874,7 +592,7 @@ void FindCodeAddresses(void) { DisasmLocs.reserve(DISASM_RESERVE_SIZE); unsigned long TempAddr; int ScanReturn = qfscanf(DisasmFile, "%lx", &TempAddr); - CurrDisasmAddr = (ea_t) TempAddr; + CurrDisasmAddr = (STARS_ea_t) TempAddr; while (1 == ScanReturn) { int NextChar; DisasmLocs.push_back(CurrDisasmAddr); @@ -883,7 +601,7 @@ void FindCodeAddresses(void) { NextChar = qfgetc(DisasmFile); } while ((EOF != NextChar) && ('\n' != NextChar)); ScanReturn = qfscanf(DisasmFile, "%lx", &TempAddr); - CurrDisasmAddr = (ea_t) TempAddr; + CurrDisasmAddr = (STARS_ea_t) TempAddr; } // end while (1 == ScanReturn) if (0 >= DisasmLocs.size()) { SMP_msg("ERROR: No addresses read from %s\n", DisasmFileName.c_str()); @@ -899,13 +617,13 @@ void FindCodeAddresses(void) { // Find all the code locs in the IDA Pro database. As we find // them, store them in IDAProLocs. - ea_t RecentAddr = BADADDR; + STARS_ea_t RecentAddr = BADADDR; for (STARS_Segment_t *seg = SMP_get_first_seg(); NULL != seg; seg = SMP_get_next_seg(RecentAddr)) { RecentAddr = seg->get_startEA(); if (!seg->IsCodeSegment()) continue; - for (ea_t addr = seg->get_startEA(); addr < seg->get_endEA(); addr = get_item_end(addr)) { + for (STARS_ea_t addr = seg->get_startEA(); addr < seg->get_endEA(); addr = SMP_get_item_end(addr)) { flags_t InstrFlags = getFlags(addr); if (isHead(InstrFlags) && isCode(InstrFlags)) { IDAProLocs.push_back(addr); @@ -923,7 +641,7 @@ void FindCodeAddresses(void) { } } #endif - } // end for (ea_t addr = seg->startEA; ...) + } // end for (STARS_ea_t addr = seg->startEA; ...) } // end for all segments return; } // end FindCodeAddresses() @@ -935,7 +653,7 @@ void FindCodeAddresses(void) { // code identification, in which a large code section is identified as data, // but some instructions in the middle of the "data" are identified as // code but IDA often starts on the wrong boundary in these cases. -bool IsCodeMisaligned(ea_t addr) { +bool IsCodeMisaligned(STARS_ea_t addr) { // Do a binary search for addr within DisasmLocs, which is sorted // in ascending address order because of the way in which it was // generated. @@ -960,7 +678,7 @@ bool IsCodeMisaligned(ea_t addr) { return false; } // end of IsCodeMisaligned() -void RemoveIDACodeAddr(ea_t addr) { +void RemoveIDACodeAddr(STARS_ea_t addr) { // Do a binary search for addr within IDAProLocs, which is sorted // in ascending address order because of the way in which it was // generated. Delete the element of IDAProLocs if found. @@ -983,7 +701,7 @@ void RemoveIDACodeAddr(ea_t addr) { } // IDAProLocs[index] contains addr. - vector<ea_t>::iterator RemovalIterator = IDAProLocs.begin(); + vector<STARS_ea_t>::iterator RemovalIterator = IDAProLocs.begin(); RemovalIterator += index; RemovalIterator = IDAProLocs.erase(RemovalIterator); return; @@ -1030,14 +748,14 @@ void FindDataInCode(void) { size_t DataRunLen = 0; // How many data bytes in a row have we seen? bool IsolatedCodeTrigger = false; // Have seen data, then isolated code // Now looking for data - ea_t IsolatedCodeAddr; + STARS_ea_t IsolatedCodeAddr; int IsolatedCodeLen; int InstrLen; bool InstOK; insn_t LocalCmd; uint32 LocalFeatures; - ea_t RecentAddr = BADADDR; + STARS_ea_t RecentAddr = BADADDR; for (STARS_Segment_t *seg = SMP_get_first_seg(); NULL != seg; seg = SMP_get_next_seg(RecentAddr)) { RecentAddr = seg->get_startEA(); if (!seg->IsCodeSegment()) @@ -1048,7 +766,7 @@ void FindDataInCode(void) { SMP_msg("Non-code addresses for code segment %s from %x to %x\n", SegName, seg->startEA, seg->endEA); #endif - for (ea_t addr = seg->get_startEA(); addr < seg->get_endEA(); addr = get_item_end(addr)) { + for (STARS_ea_t addr = seg->get_startEA(); addr < seg->get_endEA(); addr = SMP_get_item_end(addr)) { flags_t AddrFlags = getFlags(addr); if (isHead(AddrFlags)) { if (isData(AddrFlags)) { @@ -1102,10 +820,10 @@ void FindDataInCode(void) { #if SMP_DEBUG_FIXUP_IDB SMP_msg("DataRunLen: %d at %x\n", DataRunLen, addr); #endif - InstOK = SMPGetCmd(addr, LocalCmd, LocalFeatures); - assert(InstOK); + SMPInstr TempInst(addr); + TempInst.Analyze(); - InstrLen = (int) LocalCmd.size; + InstrLen = (int) TempInst.GetSize(); // We don't check the returned InstrLen for validity because IsCodeMisaligned() // will check for validity immediately below. @@ -1116,7 +834,7 @@ void FindDataInCode(void) { #if SMP_DEBUG_FIXUP_IDB SMP_msg("Code was misaligned.\n"); #endif - do_unknown_range(addr, InstrLen, DOUNK_SIMPLE); + ::do_unknown_range(addr, InstrLen, DOUNK_SIMPLE); RemoveIDACodeAddr(addr); if (do_data_ex(addr, byteflag(), InstrLen, BADNODE)) { #if SMP_DEBUG_FIXUP_IDB @@ -1181,7 +899,7 @@ void FindDataInCode(void) { } } } - } // end for (ea_t addr = seg->startEA; ...) + } // end for (STARS_ea_t addr = seg->startEA; ...) } // end for all segments return; } // end of FindDataInCode() @@ -1203,10 +921,10 @@ void AuditTailChunkOwnership(void) { // converted. // Return value: true -> skip to IDAProIndex; false -> convert AreaSize bytes. bool FindDataToConvert(size_t IDAProIndex, size_t DisasmIndex, int &AreaSize) { - ea_t PrevIDAAddr; - ea_t NextIDAAddr; + STARS_ea_t PrevIDAAddr; + STARS_ea_t NextIDAAddr; size_t ShadowDisasmIndex = DisasmIndex - 1; - ea_t DisasmAddr = DisasmLocs[ShadowDisasmIndex]; + STARS_ea_t DisasmAddr = DisasmLocs[ShadowDisasmIndex]; bool CannotConvert = false; // return value bool DebugAddress = false; #if SMP_DEBUG_FIXUP_IDB @@ -1261,11 +979,11 @@ bool FindDataToConvert(size_t IDAProIndex, size_t DisasmIndex, int &AreaSize) { flags_t DataFlags = getFlags(DisasmAddr); if (isTail(DataFlags)) { if (DebugAddress) SMP_msg(" tail byte: %lx\n", (unsigned long) DisasmAddr); - DisasmAddr = get_item_end(DisasmAddr); + DisasmAddr = SMP_get_item_end(DisasmAddr); } else if (isData(DataFlags)) { if (DebugAddress) SMP_msg(" data byte: %lx\n", (unsigned long) DisasmAddr); - DisasmAddr = get_item_end(DisasmAddr); + DisasmAddr = SMP_get_item_end(DisasmAddr); } else if (isCode(DataFlags)) { // How could this ever happen? @@ -1299,7 +1017,7 @@ bool FindDataToConvert(size_t IDAProIndex, size_t DisasmIndex, int &AreaSize) { // Does a converted code region look like a function prologue? If so, // we should not include it in the previous function. -bool IsFunctionPrologue(ea_t StartAddr, ea_t EndAddr) { +bool IsFunctionPrologue(STARS_ea_t StartAddr, STARS_ea_t EndAddr) { return false; // **!!** TODO } // end of IsFunctionPrologue() @@ -1315,7 +1033,7 @@ bool IsFunctionPrologue(ea_t StartAddr, ea_t EndAddr) { // no-ops permits us to continue converting a contiguous range of data to // code, and permits IDA to reanalyze the function later. // Returns true if program bytes were patched. -bool MDPatchUnconvertedBytes(ea_t CurrDisasmAddr) { +bool MDPatchUnconvertedBytes(STARS_ea_t CurrDisasmAddr) { flags_t AddrFlags = getFlags(CurrDisasmAddr); if (isData(AddrFlags) || isTail(AddrFlags)) { // Bytes should have been converted to unknown already. @@ -1349,7 +1067,7 @@ bool MDPatchUnconvertedBytes(ea_t CurrDisasmAddr) { #endif return false; } - ea_t PatchAddr = CurrDisasmAddr; + STARS_ea_t PatchAddr = CurrDisasmAddr; for (int i = 0; i < InstrLen; ++i) { bool ok = patch_byte(PatchAddr, 0x90); // x86 no-op if (!ok) { @@ -1385,9 +1103,9 @@ bool MDPatchUnconvertedBytes(ea_t CurrDisasmAddr) { // not found in DisasmLocs. void FixCodeIdentification(void) { size_t DisasmIndex = 0; - ea_t CurrDisasmAddr = DisasmLocs[DisasmIndex++]; + STARS_ea_t CurrDisasmAddr = DisasmLocs[DisasmIndex++]; size_t IDAProIndex = 0; - ea_t CurrAddr = IDAProLocs[IDAProIndex++]; + STARS_ea_t CurrAddr = IDAProLocs[IDAProIndex++]; while (DisasmIndex <= DisasmLocs.size()) { // If the current address is less than the current @@ -1438,8 +1156,8 @@ void FixCodeIdentification(void) { // contiguous areas of data-to-code conversion that do NOT // follow a return statement. int AreaSize = 0; - ea_t AreaStart = CurrDisasmAddr; - ea_t AreaEnd; + STARS_ea_t AreaStart = CurrDisasmAddr; + STARS_ea_t AreaEnd; #if SMP_DEBUG_FIXUP_IDB SMP_msg("CurrDisasmAddr: %x CurrAddr: %x\n", CurrDisasmAddr, CurrAddr); #endif @@ -1593,7 +1311,7 @@ int FixupNewCodeChunks(void) { CurrRegion->SetStart(BADADDR); // mark for removal continue; // skip to next region } - list<ea_t>::iterator CurrInstr; + list<STARS_ea_t>::iterator CurrInstr; for (CurrInstr = CurrRegion->FixupInstrs.begin(); CurrInstr != CurrRegion->FixupInstrs.end(); ++CurrInstr) { #if IDA_SDK_VERSION < 600 int InstrLen = ua_code(*CurrInstr); @@ -1667,7 +1385,7 @@ int FixupNewCodeChunks(void) { else { // Extend the previous chunk to include the // converted code. - ea_t PrevIDAAddr = IDAProLocs[IDAProIndex - 2]; + STARS_ea_t PrevIDAAddr = IDAProLocs[IDAProIndex - 2]; STARS_Function_t *PrevChunk = get_fchunk(PrevIDAAddr); #if SMP_DEBUG_FIXUP_IDB SMP_msg(" addr in chunk to extend: %x\n", PrevIDAAddr); @@ -1717,14 +1435,14 @@ int FixupNewCodeChunks(void) { // emit on a per-instruction basis. void FindOrphanedCode(STARS_Segment_t *CurrSeg, FILE *AnnotFile, FILE *InfoAnnotFile) { char disasm[MAXSTR]; - for (ea_t addr = CurrSeg->get_startEA(); addr < CurrSeg->get_endEA(); - addr = get_item_end(addr)) { + for (STARS_ea_t addr = CurrSeg->get_startEA(); addr < CurrSeg->get_endEA(); + addr = SMP_get_item_end(addr)) { flags_t InstrFlags = getFlags(addr); if (isTail(InstrFlags)) continue; if (isHead(InstrFlags) && isCode(InstrFlags)) { - ea_t FirstFuncAddr; + STARS_ea_t FirstFuncAddr; if (!(CurrProg->IsInstAddrStillInFunction(addr, FirstFuncAddr))) { SMPInstr CurrInst(addr); CurrInst.Analyze(); @@ -1755,7 +1473,7 @@ void FindOrphanedCode(STARS_Segment_t *CurrSeg, FILE *AnnotFile, FILE *InfoAnnot if (xrefs.GetTo() != 0) { if (xrefs.GetIscode() && (xrefs.GetType() != fl_F)) { // Found a code target, with its address in xrefs.to - PrintCodeToCodeXref(addr, xrefs.GetTo(), CurrInst.GetSize()); + global_STARS_program->PrintCodeToCodeXref(addr, xrefs.GetTo(), CurrInst.GetSize()); } } } @@ -1806,15 +1524,15 @@ void FindOrphanedCode(STARS_Segment_t *CurrSeg, FILE *AnnotFile, FILE *InfoAnnot // Version of FindOrphanedCode that does not emit annotations but can be used // to determine at what point in time code becomes orphaned. void Debug_FindOrphanedCode(STARS_Segment_t *CurrSeg, bool FirstRun) { - ea_t DebugAddr = 0x8050db0; - for (ea_t addr = CurrSeg->get_startEA(); addr < CurrSeg->get_endEA(); - addr = get_item_end(addr)) { + STARS_ea_t DebugAddr = 0x8050db0; + for (STARS_ea_t addr = CurrSeg->get_startEA(); addr < CurrSeg->get_endEA(); + addr = SMP_get_item_end(addr)) { flags_t InstrFlags = getFlags(addr); if (isHead(InstrFlags) && isCode(InstrFlags)) { STARS_Function_t *CurrFunc = SMP_get_func(addr); if (NULL == CurrFunc) { // Code not in a func; orphaned - pair<set<ea_t>::iterator, bool> pairib; + pair<set<STARS_ea_t>::iterator, bool> pairib; pairib = CodeOrphans.insert(addr); if (DebugAddr == addr) { SMP_msg("DEBUG: Orphaned code addr %lx found.\n", (unsigned long) addr); @@ -1824,7 +1542,7 @@ void Debug_FindOrphanedCode(STARS_Segment_t *CurrSeg, bool FirstRun) { } } } - } // end for (ea_t addr = CurrSeg->startEA; ...) + } // end for (STARS_ea_t addr = CurrSeg->startEA; ...) } // end of Debug_FindOrphanedCode() // Audit the IDA database with respect to branches and calls. They should @@ -1837,7 +1555,7 @@ void AuditCodeTargets(void) { void SpecialDebugOutput(void) { char disasm[MAXSTR]; - vector<ea_t> ProblemAddrs; + vector<STARS_ea_t> ProblemAddrs; ProblemAddrs.push_back(0x8066d08); bool IDAsuccess; int InstLen; @@ -1846,7 +1564,7 @@ void SpecialDebugOutput(void) { uint32 LocalFeatures; for (size_t index = 0; index < ProblemAddrs.size(); ++index) { - ea_t addr = ProblemAddrs[index]; + STARS_ea_t addr = ProblemAddrs[index]; flags_t InstrFlags = getFlags(addr); if (isCode(InstrFlags) && isHead(InstrFlags)) { IDAsuccess = SMPGetCmd(addr, LocalCmd, LocalFeatures); @@ -1873,1914 +1591,6 @@ void SpecialDebugOutput(void) { return; } // end of SpecialDebugOutput() -// Convert a call type string from the policy file, such as "FILECALLS", to the -// corresponding ZST_SysCallType, such as ZST_FILE_CALL. -ZST_SysCallType ConvertStringToCallType(char *Str2) { - ZST_SysCallType ReturnVal; - if (0 == strcmp("PRIVILEGECALLS", Str2)) { - ReturnVal = ZST_HIGHPRIVILEGE_CALL; - } - else if (0 == strcmp("FILECALLS", Str2)) { - ReturnVal = ZST_FILE_CALL; - } - else if (0 == strcmp("NETWORKCALLS", Str2)) { - ReturnVal = ZST_NETWORK_CALL; - } - else { - ReturnVal = ZST_UNMONITORED_CALL; - } - return ReturnVal; -} // end of ConvertStringToCallType() - -// Convert a policy string from the policy file, such as "DISALLOW", to -// the corresponding ZST_Policy value, such as ZST_DISALLOW. -ZST_Policy ConvertStringToPolicy(char *Str3) { - ZST_Policy ReturnVal; - if (0 == strcmp("DISALLOW", Str3)) { - ReturnVal = ZST_DISALLOW; - } - else if (0 == strcmp("WHITELIST", Str3)) { - ReturnVal = ZST_WHITELIST; - } - else if (0 == strcmp("BLACKLIST", Str3)) { - ReturnVal = ZST_BLACKLIST; - } - else { // error handling precedes calls to this function - ReturnVal = ZST_ALLOWALL; - } - return ReturnVal; -} // end of ConvertStringToPolicy() - -// Given a function name, return its Zephyr Security Toolkit call type. -ZST_SysCallType GetCallTypeFromFuncName(string SysCallName) { - ZST_SysCallType ReturnVal; - map<string, ZST_SysCallType>::iterator FindIter = ZST_FuncTypeMap.find(SysCallName); - if (FindIter == ZST_FuncTypeMap.end()) { // not found; might not even be system call - ReturnVal = ZST_UNMONITORED_CALL; - } - else { - ReturnVal = FindIter->second; - } - return ReturnVal; -} // end of GetCallTypeFromFuncName() - -// Get the user-specified security policy for the given call type. -ZST_Policy GetPolicyFromCallType(ZST_SysCallType CallType) { - ZST_Policy ReturnVal; - map<ZST_SysCallType, ZST_Policy>::iterator FindIter = ZST_TypePolicyMap.find(CallType); - if (FindIter == ZST_TypePolicyMap.end()) { - // Policy not found; default to ALLOW_ALL - ReturnVal = ZST_ALLOWALL; - } - else { - ReturnVal = FindIter->second; - } - return ReturnVal; -} // end of GetPolicyFromCallType() - -// Given a call type and called function name, is it on the location whitelist -// for that call type? -// NOTE: HANDLE CASE IN WHICH WHITELISTED LOCATION IS A PREFIX, TERMINATING in a slash. -bool IsLocationWhitelisted(ZST_SysCallType CallType, string LocationName) { - set<string>::iterator FindIter; - bool ReturnVal; - - if (CallType == ZST_FILE_CALL) { - FindIter = ZST_FileLocWhitelist.find(LocationName); - ReturnVal = (FindIter != ZST_FileLocWhitelist.end()); - } - else if (CallType == ZST_NETWORK_CALL) { - FindIter = ZST_NetworkLocWhitelist.find(LocationName); - ReturnVal = (FindIter != ZST_NetworkLocWhitelist.end()); - } - else { // should not be here - ReturnVal = false; - } - return ReturnVal; -} // end of IsLocationWhitelisted() - -// Given a call type and called function name, is it on the location blacklist -// for that call type? -// NOTE: HANDLE CASE IN WHICH BLACKLISTED LOCATION IS A PREFIX, TERMINATING in a slash. -bool IsLocationBlacklisted(ZST_SysCallType CallType, string LocationName) { - set<string>::iterator FindIter; - bool ReturnVal; - - if (CallType == ZST_FILE_CALL) { - FindIter = ZST_FileLocBlacklist.find(LocationName); - ReturnVal = (FindIter != ZST_FileLocBlacklist.end()); - } - else if (CallType == ZST_NETWORK_CALL) { - FindIter = ZST_NetworkLocBlacklist.find(LocationName); - ReturnVal = (FindIter != ZST_NetworkLocBlacklist.end()); - } - else { // should not be here - ReturnVal = false; - } - return ReturnVal; -} - -// Given a called function name, does it produce only benign numeric errors when -// its returned values are used in arithmetic? (i.e. it is a trusted input) -bool IsNumericSafeSystemCall(string CallName) { - set<string>::iterator FindIter = ZST_SystemCallNumericWhitelist.find(CallName); - bool ReturnVal = (FindIter != ZST_SystemCallNumericWhitelist.end()); - return ReturnVal; -} - -// Utility functions to print code xrefs to STARS_XrefsFile -void PrintCodeToCodeXref(ea_t FromAddr, ea_t ToAddr, size_t InstrSize) { - SMP_fprintf(STARS_XrefsFile, "%10lx %6zu INSTR XREF IBT FROMIB %10lx \n", - (unsigned long) ToAddr, InstrSize, (unsigned long) FromAddr); - return; -} - -void PrintDataToCodeXref(ea_t FromDataAddr, ea_t ToCodeAddr, size_t InstrSize) { - SMP_fprintf(STARS_XrefsFile, "%10lx %6zu INSTR XREF IBT FROMDATA %10lx \n", - (unsigned long) ToCodeAddr, InstrSize, (unsigned long) FromDataAddr); - return; -} - -// These two constants should agree with their counterparts in ZST-policy.c. -#define ZST_MAX_FILE_NAME_LEN 1024 -#define ZST_MAX_CALL_NAME_LEN 64 - -// Read the foo.exe.policy file to initialize our security policies for system calls. -void ZST_InitPolicies(const char *PolicyFileName) { - FILE *PolicyFile = SMP_fopen(PolicyFileName, "r"); - char Str1[ZST_MAX_CALL_NAME_LEN], Str2[ZST_MAX_CALL_NAME_LEN], Str3[ZST_MAX_FILE_NAME_LEN]; - - string SafeSystemCall1("gettimeofday"); - ZST_SystemCallNumericWhitelist.insert(SafeSystemCall1); - - if (NULL != PolicyFile) { - while (!SMP_feof(PolicyFile)) { - int ItemsRead = qfscanf(PolicyFile, "%63s %63s %1023s", Str1, Str2, Str3); - if (3 != ItemsRead) { - SMP_msg("ERROR: Line in %s had %d items instead of the required 3; line ignored.\n", PolicyFileName, ItemsRead); - } - else { - string ThirdStr(Str3); - pair<set<string>::iterator, bool> SetInsertResult; - if (0 == strcmp(Str1, "SECURITYPOLICY")) { - ZST_SysCallType TempCallType = ConvertStringToCallType(Str2); - ZST_Policy TempPolicy = ConvertStringToPolicy(Str3); - pair<map<ZST_SysCallType, ZST_Policy>::iterator, bool> InsertResult; - pair<ZST_SysCallType, ZST_Policy> TempPair(TempCallType, TempPolicy); - InsertResult = ZST_TypePolicyMap.insert(TempPair); - if (!(InsertResult.second)) { - SMP_msg("ERROR: Could not insert security policy %s for %s. Possible duplicate or conflicting policies.\n", - Str3, Str2); - } - } - else if (0 == strcmp(Str1, "FILELOCATION")) { - if (0 == strcmp(Str2, "WHITELIST")) { - SetInsertResult = ZST_FileLocWhitelist.insert(ThirdStr); - if (!(SetInsertResult.second)) { - SMP_msg("WARNING: Duplicate file whitelist location %s ignored.\n", Str3); - } - } - else if (0 == strcmp(Str2, "BLACKLIST")) { - SetInsertResult = ZST_FileLocBlacklist.insert(ThirdStr); - if (!(SetInsertResult.second)) { - SMP_msg("WARNING: Duplicate file blacklist location %s ignored.\n", Str3); - } - } - else { - SMP_msg("ERROR: Unknown second field value in policy line: %s %s %s ; ignored\n", Str1, Str2, Str3); - } - } - else if (0 == strcmp(Str1, "NETWORKLOCATION")) { - if (0 == strcmp(Str2, "WHITELIST")) { - SetInsertResult = ZST_NetworkLocWhitelist.insert(ThirdStr); - if (!(SetInsertResult.second)) { - SMP_msg("WARNING: Duplicate network whitelist location %s ignored.\n", Str3); - } - } - else if (0 == strcmp(Str2, "BLACKLIST")) { - SetInsertResult = ZST_NetworkLocBlacklist.insert(ThirdStr); - if (!(SetInsertResult.second)) { - SMP_msg("WARNING: Duplicate network blacklist location %s ignored.\n", Str3); - } - } - else { - SMP_msg("ERROR: Unknown second field value in policy line: %s %s %s ; ignored\n", Str1, Str2, Str3); - } - } - else { - SMP_msg("ERROR: Unknown first field value in policy line: %s %s %s ; ignored\n", Str1, Str2, Str3); - } - } - } - if (0 == SMP_fclose(PolicyFile)) { - SMP_msg("Policy file %s successfully closed; all policies recorded.\n", PolicyFileName); - } - else { - SMP_msg("ERROR: fclose failed on policy file %s. However, policies should be in effect.\n", PolicyFileName); - } - // Now, initialize the system call name maps. - pair<map<string, ZST_SysCallType>::iterator, bool> FuncInsertResult; - // Do all the high privilege calls first. - string SysFuncName("putenv"); - pair<string, ZST_SysCallType> FuncNamePolicyPair(SysFuncName, ZST_HIGHPRIVILEGE_CALL); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("setenv"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("setegid"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("seteuid"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("setgid"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("setpgid"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("setregid"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("setreuid"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("setuid"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("execl"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("execv"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("execle"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("execve"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("execlp"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("execvp"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("system"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - - // Now do all the file operation calls. - FuncNamePolicyPair.second = ZST_FILE_CALL; - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("chdir"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("chmod"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("chown"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("creat"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("creat64"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("fopen"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("freopen"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("open"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("open64"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("mknod"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("remove"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("rmdir"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("unlink"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - - // Finally, handle all the network connection calls. - FuncNamePolicyPair.second = ZST_NETWORK_CALL; - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("socket"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("socketpair"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("pipe"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("bind"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("listen"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("accept"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - FuncNamePolicyPair.first.clear(); - FuncNamePolicyPair.first.append("connect"); - FuncInsertResult = ZST_FuncTypeMap.insert(FuncNamePolicyPair); - assert(FuncInsertResult.second); - } - else { - SMP_msg("WARNING: No policy file %s found. System call policies not in effect.\n", PolicyFileName); - } - return; -} // end of ZST_InitPolicies() - -// Initialize the OptCategory[] array to define how we emit -// optimizing annotations. -void InitOptCategory(void) { - // Default category is 0, no optimization without knowing context. - (void) memset(OptCategory, 0, sizeof(OptCategory)); - // Category 1 instructions never need updating of their memory - // metadata by the Memory Monitor SDT. Currently, this is because - // these instructions only have effects on registers we do not maintain - // metadata for, such as the EIP and the FLAGS, e.g. jumps, compares, - // or because they are no-ops, including machine-dependent no-op idioms. - // Effects on floating-point regs are always NUMERIC and can be put into - // categury 1 because mmStrata knows these registers are NUMERIC and does - // not keep a metadata map for them. - // Category 2 instructions always have a result type of 'n' (number). - // Category 3 instructions have a result type of 'n' (number) - // whenever the second source operand is an operand of type 'n'. - // NOTE: MOV is only current example, and this will take some thought if - // other examples arise. - // Category 4 instructions have a result type identical to the 1st source operand type. - // NOTE: This is currently set for single-operand instructions such as - // INC, DEC. As a result, these are treated pretty much as if - // they were category 1 instructions, as there is no metadata update, - // unless the operand is a memory operand (i.e. mem or [reg]). - // If new instructions are added to this category that are not single - // operand and do require some updating, the category should be split. - // Category 5 instructions have a result type identical to the 1st source operand - // type whenever the 2nd source operand is an operand of type 'n'. - // If the destination is memory, metadata still needs to be checked; if - // not, no metadata check is needed, so it becomes category 1. - // Category 6 instructions always have a result type of 'p' (pointer). - // Category 7 instructions are category 2 instructions with two destinations, - // such as multiply and divide instructions that affect EDX:EAX. There are - // forms of these instructions that only have one destination, so they have - // to be distinguished via the operand info. - // Category 8 instructions implicitly write a numeric value to EDX:EAX, but - // EDX and EAX are not listed as operands. RDTSC, RDPMC, RDMSR, and other - // instructions that copy machine registers into EDX:EAX are category 8. - // Category 9 instructions are floating point instructions that either - // have a memory destination (treat as category 0) or a FP reg destination - // (treat as category 1). - // Category 10 instructions are the same as category 8, but also write - // to register ECX in addition to EDX:EAX. - - // NOTE: The Memory Monitor SDT needs just three categories, corresponding - // to categories 0, 1, and all others. For all categories > 1, the - // annotation should tell the SDT exactly how to update its metadata. - // For example, a division instruction will write type 'n' (NUM) as - // the metadata for result registers EDX:EAX. So, the annotation should - // list 'n', EDX, EAX, and a terminator of ZZ. CWD (convert word to - // doubleword) should have a list of 'n', EAX, ZZ. - -OptCategory[NN_null] = 0; // Unknown Operation -OptCategory[NN_aaa] = 2; // ASCII Adjust after Addition -OptCategory[NN_aad] = 2; // ASCII Adjust AX before Division -OptCategory[NN_aam] = 2; // ASCII Adjust AX after Multiply -OptCategory[NN_aas] = 2; // ASCII Adjust AL after Subtraction -OptCategory[NN_adc] = 5; // Add with Carry -OptCategory[NN_add] = 5; // Add -OptCategory[NN_and] = 0; // Logical AND -OptCategory[NN_arpl] = 1; // Adjust RPL Field of Selector -OptCategory[NN_bound] = 1; // Check Array Index Against Bounds -OptCategory[NN_bsf] = 2; // Bit Scan Forward -OptCategory[NN_bsr] = 2; // Bit Scan Reverse -OptCategory[NN_bt] = 0; // Bit Test -OptCategory[NN_btc] = 0; // Bit Test and Complement -OptCategory[NN_btr] = 0; // Bit Test and Reset -OptCategory[NN_bts] = 0; // Bit Test and Set -OptCategory[NN_call] = 1; // Call Procedure -OptCategory[NN_callfi] = 1; // Indirect Call Far Procedure -OptCategory[NN_callni] = 1; // Indirect Call Near Procedure -OptCategory[NN_cbw] = 2; // AL -> AX (with sign) ** No ops? -OptCategory[NN_cwde] = 2; // AX -> EAX (with sign) ** -OptCategory[NN_cdqe] = 2; // EAX -> RAX (with sign) ** -OptCategory[NN_clc] = 1; // Clear Carry Flag -OptCategory[NN_cld] = 1; // Clear Direction Flag -OptCategory[NN_cli] = 1; // Clear Interrupt Flag -OptCategory[NN_clts] = 1; // Clear Task-Switched Flag in CR0 -OptCategory[NN_cmc] = 1; // Complement Carry Flag -OptCategory[NN_cmp] = 1; // Compare Two Operands -OptCategory[NN_cmps] = 1; // Compare Strings -OptCategory[NN_cwd] = 2; // AX -> DX:AX (with sign) -OptCategory[NN_cdq] = 2; // EAX -> EDX:EAX (with sign) -OptCategory[NN_cqo] = 2; // RAX -> RDX:RAX (with sign) -OptCategory[NN_daa] = 2; // Decimal Adjust AL after Addition -OptCategory[NN_das] = 2; // Decimal Adjust AL after Subtraction -OptCategory[NN_dec] = 4; // Decrement by 1 -OptCategory[NN_div] = 7; // Unsigned Divide -OptCategory[NN_enterw] = 0; // Make Stack Frame for Procedure Parameters ** -OptCategory[NN_enter] = 0; // Make Stack Frame for Procedure Parameters ** -OptCategory[NN_enterd] = 0; // Make Stack Frame for Procedure Parameters ** -OptCategory[NN_enterq] = 0; // Make Stack Frame for Procedure Parameters ** -OptCategory[NN_hlt] = 0; // Halt -OptCategory[NN_idiv] = 7; // Signed Divide -OptCategory[NN_imul] = 7; // Signed Multiply -OptCategory[NN_in] = 0; // Input from Port ** -OptCategory[NN_inc] = 4; // Increment by 1 -OptCategory[NN_ins] = 2; // Input Byte(s) from Port to String ** -OptCategory[NN_int] = 0; // Call to Interrupt Procedure -OptCategory[NN_into] = 0; // Call to Interrupt Procedure if Overflow Flag = 1 -OptCategory[NN_int3] = 0; // Trap to Debugger -OptCategory[NN_iretw] = 0; // Interrupt Return -OptCategory[NN_iret] = 0; // Interrupt Return -OptCategory[NN_iretd] = 0; // Interrupt Return (use32) -OptCategory[NN_iretq] = 0; // Interrupt Return (use64) -OptCategory[NN_ja] = 1; // Jump if Above (CF=0 & ZF=0) -OptCategory[NN_jae] = 1; // Jump if Above or Equal (CF=0) -OptCategory[NN_jb] = 1; // Jump if Below (CF=1) -OptCategory[NN_jbe] = 1; // Jump if Below or Equal (CF=1 | ZF=1) -OptCategory[NN_jc] = 1; // Jump if Carry (CF=1) -OptCategory[NN_jcxz] = 1; // Jump if CX is 0 -OptCategory[NN_jecxz] = 1; // Jump if ECX is 0 -OptCategory[NN_jrcxz] = 1; // Jump if RCX is 0 -OptCategory[NN_je] = 1; // Jump if Equal (ZF=1) -OptCategory[NN_jg] = 1; // Jump if Greater (ZF=0 & SF=OF) -OptCategory[NN_jge] = 1; // Jump if Greater or Equal (SF=OF) -OptCategory[NN_jl] = 1; // Jump if Less (SF!=OF) -OptCategory[NN_jle] = 1; // Jump if Less or Equal (ZF=1 | SF!=OF) -OptCategory[NN_jna] = 1; // Jump if Not Above (CF=1 | ZF=1) -OptCategory[NN_jnae] = 1; // Jump if Not Above or Equal (CF=1) -OptCategory[NN_jnb] = 1; // Jump if Not Below (CF=0) -OptCategory[NN_jnbe] = 1; // Jump if Not Below or Equal (CF=0 & ZF=0) -OptCategory[NN_jnc] = 1; // Jump if Not Carry (CF=0) -OptCategory[NN_jne] = 1; // Jump if Not Equal (ZF=0) -OptCategory[NN_jng] = 1; // Jump if Not Greater (ZF=1 | SF!=OF) -OptCategory[NN_jnge] = 1; // Jump if Not Greater or Equal (SF!=OF) -OptCategory[NN_jnl] = 1; // Jump if Not Less (SF=OF) -OptCategory[NN_jnle] = 1; // Jump if Not Less or Equal (ZF=0 & SF=OF) -OptCategory[NN_jno] = 1; // Jump if Not Overflow (OF=0) -OptCategory[NN_jnp] = 1; // Jump if Not Parity (PF=0) -OptCategory[NN_jns] = 1; // Jump if Not Sign (SF=0) -OptCategory[NN_jnz] = 1; // Jump if Not Zero (ZF=0) -OptCategory[NN_jo] = 1; // Jump if Overflow (OF=1) -OptCategory[NN_jp] = 1; // Jump if Parity (PF=1) -OptCategory[NN_jpe] = 1; // Jump if Parity Even (PF=1) -OptCategory[NN_jpo] = 1; // Jump if Parity Odd (PF=0) -OptCategory[NN_js] = 1; // Jump if Sign (SF=1) -OptCategory[NN_jz] = 1; // Jump if Zero (ZF=1) -OptCategory[NN_jmp] = 1; // Jump -OptCategory[NN_jmpfi] = 1; // Indirect Far Jump -OptCategory[NN_jmpni] = 1; // Indirect Near Jump -OptCategory[NN_jmpshort] = 1; // Jump Short (not used) -OptCategory[NN_lahf] = 2; // Load Flags into AH Register -OptCategory[NN_lar] = 2; // Load Access Rights Byte -OptCategory[NN_lea] = 0; // Load Effective Address ** -OptCategory[NN_leavew] = 0; // High Level Procedure Exit ** -OptCategory[NN_leave] = 0; // High Level Procedure Exit ** -OptCategory[NN_leaved] = 0; // High Level Procedure Exit ** -OptCategory[NN_leaveq] = 0; // High Level Procedure Exit ** -OptCategory[NN_lgdt] = 0; // Load Global Descriptor Table Register -OptCategory[NN_lidt] = 0; // Load Interrupt Descriptor Table Register -OptCategory[NN_lgs] = 6; // Load Full Pointer to GS:xx -OptCategory[NN_lss] = 6; // Load Full Pointer to SS:xx -OptCategory[NN_lds] = 6; // Load Full Pointer to DS:xx -OptCategory[NN_les] = 6; // Load Full Pointer to ES:xx -OptCategory[NN_lfs] = 6; // Load Full Pointer to FS:xx -OptCategory[NN_lldt] = 0; // Load Local Descriptor Table Register -OptCategory[NN_lmsw] = 1; // Load Machine Status Word -OptCategory[NN_lock] = 1; // Assert LOCK# Signal Prefix -OptCategory[NN_lods] = 0; // Load String -OptCategory[NN_loopw] = 1; // Loop while ECX != 0 -OptCategory[NN_loop] = 1; // Loop while CX != 0 -OptCategory[NN_loopd] = 1; // Loop while ECX != 0 -OptCategory[NN_loopq] = 1; // Loop while RCX != 0 -OptCategory[NN_loopwe] = 1; // Loop while CX != 0 and ZF=1 -OptCategory[NN_loope] = 1; // Loop while rCX != 0 and ZF=1 -OptCategory[NN_loopde] = 1; // Loop while ECX != 0 and ZF=1 -OptCategory[NN_loopqe] = 1; // Loop while RCX != 0 and ZF=1 -OptCategory[NN_loopwne] = 1; // Loop while CX != 0 and ZF=0 -OptCategory[NN_loopne] = 1; // Loop while rCX != 0 and ZF=0 -OptCategory[NN_loopdne] = 1; // Loop while ECX != 0 and ZF=0 -OptCategory[NN_loopqne] = 1; // Loop while RCX != 0 and ZF=0 -OptCategory[NN_lsl] = 6; // Load Segment Limit -OptCategory[NN_ltr] = 1; // Load Task Register -OptCategory[NN_mov] = 3; // Move Data -OptCategory[NN_movsp] = 3; // Move to/from Special Registers -OptCategory[NN_movs] = 0; // Move Byte(s) from String to String -OptCategory[NN_movsx] = 3; // Move with Sign-Extend -OptCategory[NN_movzx] = 3; // Move with Zero-Extend -OptCategory[NN_mul] = 7; // Unsigned Multiplication of AL or AX -OptCategory[NN_neg] = 2; // Two's Complement Negation !!!!****!!!! Change this when mmStrata handles NEGATEDPTR type. -OptCategory[NN_nop] = 1; // No Operation -OptCategory[NN_not] = 2; // One's Complement Negation -OptCategory[NN_or] = 0; // Logical Inclusive OR -OptCategory[NN_out] = 0; // Output to Port -OptCategory[NN_outs] = 0; // Output Byte(s) to Port -OptCategory[NN_pop] = 0; // Pop a word from the Stack -OptCategory[NN_popaw] = 0; // Pop all General Registers -OptCategory[NN_popa] = 0; // Pop all General Registers -OptCategory[NN_popad] = 0; // Pop all General Registers (use32) -OptCategory[NN_popaq] = 0; // Pop all General Registers (use64) -OptCategory[NN_popfw] = 1; // Pop Stack into Flags Register ** -OptCategory[NN_popf] = 1; // Pop Stack into Flags Register ** -OptCategory[NN_popfd] = 1; // Pop Stack into Eflags Register ** -OptCategory[NN_popfq] = 1; // Pop Stack into Rflags Register ** -OptCategory[NN_push] = 0; // Push Operand onto the Stack -OptCategory[NN_pushaw] = 0; // Push all General Registers -OptCategory[NN_pusha] = 0; // Push all General Registers -OptCategory[NN_pushad] = 0; // Push all General Registers (use32) -OptCategory[NN_pushaq] = 0; // Push all General Registers (use64) -OptCategory[NN_pushfw] = 0; // Push Flags Register onto the Stack -OptCategory[NN_pushf] = 0; // Push Flags Register onto the Stack -OptCategory[NN_pushfd] = 0; // Push Flags Register onto the Stack (use32) -OptCategory[NN_pushfq] = 0; // Push Flags Register onto the Stack (use64) -OptCategory[NN_rcl] = 2; // Rotate Through Carry Left -OptCategory[NN_rcr] = 2; // Rotate Through Carry Right -OptCategory[NN_rol] = 2; // Rotate Left -OptCategory[NN_ror] = 2; // Rotate Right -OptCategory[NN_rep] = 0; // Repeat String Operation -OptCategory[NN_repe] = 0; // Repeat String Operation while ZF=1 -OptCategory[NN_repne] = 0; // Repeat String Operation while ZF=0 -OptCategory[NN_retn] = 0; // Return Near from Procedure -OptCategory[NN_retf] = 0; // Return Far from Procedure -OptCategory[NN_sahf] = 1; // Store AH into Flags Register -OptCategory[NN_sal] = 2; // Shift Arithmetic Left -OptCategory[NN_sar] = 2; // Shift Arithmetic Right -OptCategory[NN_shl] = 2; // Shift Logical Left -OptCategory[NN_shr] = 2; // Shift Logical Right -OptCategory[NN_sbb] = 5; // Integer Subtraction with Borrow -OptCategory[NN_scas] = 1; // Compare String -OptCategory[NN_seta] = 2; // Set Byte if Above (CF=0 & ZF=0) -OptCategory[NN_setae] = 2; // Set Byte if Above or Equal (CF=0) -OptCategory[NN_setb] = 2; // Set Byte if Below (CF=1) -OptCategory[NN_setbe] = 2; // Set Byte if Below or Equal (CF=1 | ZF=1) -OptCategory[NN_setc] = 2; // Set Byte if Carry (CF=1) -OptCategory[NN_sete] = 2; // Set Byte if Equal (ZF=1) -OptCategory[NN_setg] = 2; // Set Byte if Greater (ZF=0 & SF=OF) -OptCategory[NN_setge] = 2; // Set Byte if Greater or Equal (SF=OF) -OptCategory[NN_setl] = 2; // Set Byte if Less (SF!=OF) -OptCategory[NN_setle] = 2; // Set Byte if Less or Equal (ZF=1 | SF!=OF) -OptCategory[NN_setna] = 2; // Set Byte if Not Above (CF=1 | ZF=1) -OptCategory[NN_setnae] = 2; // Set Byte if Not Above or Equal (CF=1) -OptCategory[NN_setnb] = 2; // Set Byte if Not Below (CF=0) -OptCategory[NN_setnbe] = 2; // Set Byte if Not Below or Equal (CF=0 & ZF=0) -OptCategory[NN_setnc] = 2; // Set Byte if Not Carry (CF=0) -OptCategory[NN_setne] = 2; // Set Byte if Not Equal (ZF=0) -OptCategory[NN_setng] = 2; // Set Byte if Not Greater (ZF=1 | SF!=OF) -OptCategory[NN_setnge] = 2; // Set Byte if Not Greater or Equal (SF!=OF) -OptCategory[NN_setnl] = 2; // Set Byte if Not Less (SF=OF) -OptCategory[NN_setnle] = 2; // Set Byte if Not Less or Equal (ZF=0 & SF=OF) -OptCategory[NN_setno] = 2; // Set Byte if Not Overflow (OF=0) -OptCategory[NN_setnp] = 2; // Set Byte if Not Parity (PF=0) -OptCategory[NN_setns] = 2; // Set Byte if Not Sign (SF=0) -OptCategory[NN_setnz] = 2; // Set Byte if Not Zero (ZF=0) -OptCategory[NN_seto] = 2; // Set Byte if Overflow (OF=1) -OptCategory[NN_setp] = 2; // Set Byte if Parity (PF=1) -OptCategory[NN_setpe] = 2; // Set Byte if Parity Even (PF=1) -OptCategory[NN_setpo] = 2; // Set Byte if Parity Odd (PF=0) -OptCategory[NN_sets] = 2; // Set Byte if Sign (SF=1) -OptCategory[NN_setz] = 2; // Set Byte if Zero (ZF=1) -OptCategory[NN_sgdt] = 0; // Store Global Descriptor Table Register -OptCategory[NN_sidt] = 0; // Store Interrupt Descriptor Table Register -OptCategory[NN_shld] = 2; // Double Precision Shift Left -OptCategory[NN_shrd] = 2; // Double Precision Shift Right -OptCategory[NN_sldt] = 6; // Store Local Descriptor Table Register -OptCategory[NN_smsw] = 2; // Store Machine Status Word -OptCategory[NN_stc] = 1; // Set Carry Flag -OptCategory[NN_std] = 1; // Set Direction Flag -OptCategory[NN_sti] = 1; // Set Interrupt Flag -OptCategory[NN_stos] = 0; // Store String -OptCategory[NN_str] = 6; // Store Task Register -OptCategory[NN_sub] = 5; // Integer Subtraction -OptCategory[NN_test] = 1; // Logical Compare -OptCategory[NN_verr] = 1; // Verify a Segment for Reading -OptCategory[NN_verw] = 1; // Verify a Segment for Writing -OptCategory[NN_wait] = 1; // Wait until BUSY# Pin is Inactive (HIGH) -OptCategory[NN_xchg] = 0; // Exchange Register/Memory with Register -OptCategory[NN_xlat] = 0; // Table Lookup Translation -OptCategory[NN_xor] = 2; // Logical Exclusive OR - -// -// 486 instructions -// - -OptCategory[NN_cmpxchg] = 0; // Compare and Exchange -OptCategory[NN_bswap] = 2; // Swap bytes in register -OptCategory[NN_xadd] = 0; // t<-dest; dest<-src+dest; src<-t -OptCategory[NN_invd] = 1; // Invalidate Data Cache -OptCategory[NN_wbinvd] = 1; // Invalidate Data Cache (write changes) -OptCategory[NN_invlpg] = 1; // Invalidate TLB entry - -// -// Pentium instructions -// - -OptCategory[NN_rdmsr] = 8; // Read Machine Status Register -OptCategory[NN_wrmsr] = 1; // Write Machine Status Register -OptCategory[NN_cpuid] = 8; // Get CPU ID -OptCategory[NN_cmpxchg8b] = 0; // Compare and Exchange Eight Bytes -OptCategory[NN_rdtsc] = 8; // Read Time Stamp Counter -OptCategory[NN_rsm] = 1; // Resume from System Management Mode - -// -// Pentium Pro instructions -// - -OptCategory[NN_cmova] = 0; // Move if Above (CF=0 & ZF=0) -OptCategory[NN_cmovb] = 0; // Move if Below (CF=1) -OptCategory[NN_cmovbe] = 0; // Move if Below or Equal (CF=1 | ZF=1) -OptCategory[NN_cmovg] = 0; // Move if Greater (ZF=0 & SF=OF) -OptCategory[NN_cmovge] = 0; // Move if Greater or Equal (SF=OF) -OptCategory[NN_cmovl] = 0; // Move if Less (SF!=OF) -OptCategory[NN_cmovle] = 0; // Move if Less or Equal (ZF=1 | SF!=OF) -OptCategory[NN_cmovnb] = 0; // Move if Not Below (CF=0) -OptCategory[NN_cmovno] = 0; // Move if Not Overflow (OF=0) -OptCategory[NN_cmovnp] = 0; // Move if Not Parity (PF=0) -OptCategory[NN_cmovns] = 0; // Move if Not Sign (SF=0) -OptCategory[NN_cmovnz] = 0; // Move if Not Zero (ZF=0) -OptCategory[NN_cmovo] = 0; // Move if Overflow (OF=1) -OptCategory[NN_cmovp] = 0; // Move if Parity (PF=1) -OptCategory[NN_cmovs] = 0; // Move if Sign (SF=1) -OptCategory[NN_cmovz] = 0; // Move if Zero (ZF=1) -OptCategory[NN_fcmovb] = 1; // Floating Move if Below -OptCategory[NN_fcmove] = 1; // Floating Move if Equal -OptCategory[NN_fcmovbe] = 1; // Floating Move if Below or Equal -OptCategory[NN_fcmovu] = 1; // Floating Move if Unordered -OptCategory[NN_fcmovnb] = 1; // Floating Move if Not Below -OptCategory[NN_fcmovne] = 1; // Floating Move if Not Equal -OptCategory[NN_fcmovnbe] = 1; // Floating Move if Not Below or Equal -OptCategory[NN_fcmovnu] = 1; // Floating Move if Not Unordered -OptCategory[NN_fcomi] = 1; // FP Compare, result in EFLAGS -OptCategory[NN_fucomi] = 1; // FP Unordered Compare, result in EFLAGS -OptCategory[NN_fcomip] = 1; // FP Compare, result in EFLAGS, pop stack -OptCategory[NN_fucomip] = 1; // FP Unordered Compare, result in EFLAGS, pop stack -OptCategory[NN_rdpmc] = 8; // Read Performance Monitor Counter - -// -// FPP instructions -// - -OptCategory[NN_fld] = 1; // Load Real ** Infer src is 'n' -OptCategory[NN_fst] = 9; // Store Real -OptCategory[NN_fstp] = 9; // Store Real and Pop -OptCategory[NN_fxch] = 1; // Exchange Registers -OptCategory[NN_fild] = 1; // Load Integer ** Infer src is 'n' -OptCategory[NN_fist] = 0; // Store Integer -OptCategory[NN_fistp] = 0; // Store Integer and Pop -OptCategory[NN_fbld] = 1; // Load BCD -OptCategory[NN_fbstp] = 0; // Store BCD and Pop -OptCategory[NN_fadd] = 1; // Add Real -OptCategory[NN_faddp] = 1; // Add Real and Pop -OptCategory[NN_fiadd] = 1; // Add Integer -OptCategory[NN_fsub] = 1; // Subtract Real -OptCategory[NN_fsubp] = 1; // Subtract Real and Pop -OptCategory[NN_fisub] = 1; // Subtract Integer -OptCategory[NN_fsubr] = 1; // Subtract Real Reversed -OptCategory[NN_fsubrp] = 1; // Subtract Real Reversed and Pop -OptCategory[NN_fisubr] = 1; // Subtract Integer Reversed -OptCategory[NN_fmul] = 1; // Multiply Real -OptCategory[NN_fmulp] = 1; // Multiply Real and Pop -OptCategory[NN_fimul] = 1; // Multiply Integer -OptCategory[NN_fdiv] = 1; // Divide Real -OptCategory[NN_fdivp] = 1; // Divide Real and Pop -OptCategory[NN_fidiv] = 1; // Divide Integer -OptCategory[NN_fdivr] = 1; // Divide Real Reversed -OptCategory[NN_fdivrp] = 1; // Divide Real Reversed and Pop -OptCategory[NN_fidivr] = 1; // Divide Integer Reversed -OptCategory[NN_fsqrt] = 1; // Square Root -OptCategory[NN_fscale] = 1; // Scale: st(0) <- st(0) * 2^st(1) -OptCategory[NN_fprem] = 1; // Partial Remainder -OptCategory[NN_frndint] = 1; // Round to Integer -OptCategory[NN_fxtract] = 1; // Extract exponent and significand -OptCategory[NN_fabs] = 1; // Absolute value -OptCategory[NN_fchs] = 1; // Change Sign -OptCategory[NN_fcom] = 1; // Compare Real -OptCategory[NN_fcomp] = 1; // Compare Real and Pop -OptCategory[NN_fcompp] = 1; // Compare Real and Pop Twice -OptCategory[NN_ficom] = 1; // Compare Integer -OptCategory[NN_ficomp] = 1; // Compare Integer and Pop -OptCategory[NN_ftst] = 1; // Test -OptCategory[NN_fxam] = 1; // Examine -OptCategory[NN_fptan] = 1; // Partial tangent -OptCategory[NN_fpatan] = 1; // Partial arctangent -OptCategory[NN_f2xm1] = 1; // 2^x - 1 -OptCategory[NN_fyl2x] = 1; // Y * lg2(X) -OptCategory[NN_fyl2xp1] = 1; // Y * lg2(X+1) -OptCategory[NN_fldz] = 1; // Load +0.0 -OptCategory[NN_fld1] = 1; // Load +1.0 -OptCategory[NN_fldpi] = 1; // Load PI=3.14... -OptCategory[NN_fldl2t] = 1; // Load lg2(10) -OptCategory[NN_fldl2e] = 1; // Load lg2(e) -OptCategory[NN_fldlg2] = 1; // Load lg10(2) -OptCategory[NN_fldln2] = 1; // Load ln(2) -OptCategory[NN_finit] = 1; // Initialize Processor -OptCategory[NN_fninit] = 1; // Initialize Processor (no wait) -OptCategory[NN_fsetpm] = 1; // Set Protected Mode -OptCategory[NN_fldcw] = 1; // Load Control Word -OptCategory[NN_fstcw] = 0; // Store Control Word -OptCategory[NN_fnstcw] = 0; // Store Control Word (no wait) -OptCategory[NN_fstsw] = 2; // Store Status Word to memory or AX -OptCategory[NN_fnstsw] = 2; // Store Status Word (no wait) to memory or AX -OptCategory[NN_fclex] = 1; // Clear Exceptions -OptCategory[NN_fnclex] = 1; // Clear Exceptions (no wait) -OptCategory[NN_fstenv] = 0; // Store Environment -OptCategory[NN_fnstenv] = 0; // Store Environment (no wait) -OptCategory[NN_fldenv] = 1; // Load Environment -OptCategory[NN_fsave] = 0; // Save State -OptCategory[NN_fnsave] = 0; // Save State (no wait) -OptCategory[NN_frstor] = 1; // Restore State ** infer src is 'n' -OptCategory[NN_fincstp] = 1; // Increment Stack Pointer -OptCategory[NN_fdecstp] = 1; // Decrement Stack Pointer -OptCategory[NN_ffree] = 1; // Free Register -OptCategory[NN_fnop] = 1; // No Operation -OptCategory[NN_feni] = 1; // (8087 only) -OptCategory[NN_fneni] = 1; // (no wait) (8087 only) -OptCategory[NN_fdisi] = 1; // (8087 only) -OptCategory[NN_fndisi] = 1; // (no wait) (8087 only) - -// -// 80387 instructions -// - -OptCategory[NN_fprem1] = 1; // Partial Remainder ( < half ) -OptCategory[NN_fsincos] = 1; // t<-cos(st); st<-sin(st); push t -OptCategory[NN_fsin] = 1; // Sine -OptCategory[NN_fcos] = 1; // Cosine -OptCategory[NN_fucom] = 1; // Compare Unordered Real -OptCategory[NN_fucomp] = 1; // Compare Unordered Real and Pop -OptCategory[NN_fucompp] = 1; // Compare Unordered Real and Pop Twice - -// -// Instructions added 28.02.96 -// - -OptCategory[NN_setalc] = 2; // Set AL to Carry Flag ** -OptCategory[NN_svdc] = 0; // Save Register and Descriptor -OptCategory[NN_rsdc] = 0; // Restore Register and Descriptor -OptCategory[NN_svldt] = 0; // Save LDTR and Descriptor -OptCategory[NN_rsldt] = 0; // Restore LDTR and Descriptor -OptCategory[NN_svts] = 1; // Save TR and Descriptor -OptCategory[NN_rsts] = 1; // Restore TR and Descriptor -OptCategory[NN_icebp] = 1; // ICE Break Point -OptCategory[NN_loadall] = 0; // Load the entire CPU state from ES:EDI - -// -// MMX instructions -// - -OptCategory[NN_emms] = 1; // Empty MMX state -OptCategory[NN_movd] = 9; // Move 32 bits -OptCategory[NN_movq] = 9; // Move 64 bits -OptCategory[NN_packsswb] = 1; // Pack with Signed Saturation (Word->Byte) -OptCategory[NN_packssdw] = 1; // Pack with Signed Saturation (Dword->Word) -OptCategory[NN_packuswb] = 1; // Pack with Unsigned Saturation (Word->Byte) -OptCategory[NN_paddb] = 1; // Packed Add Byte -OptCategory[NN_paddw] = 1; // Packed Add Word -OptCategory[NN_paddd] = 1; // Packed Add Dword -OptCategory[NN_paddsb] = 1; // Packed Add with Saturation (Byte) -OptCategory[NN_paddsw] = 1; // Packed Add with Saturation (Word) -OptCategory[NN_paddusb] = 1; // Packed Add Unsigned with Saturation (Byte) -OptCategory[NN_paddusw] = 1; // Packed Add Unsigned with Saturation (Word) -OptCategory[NN_pand] = 1; // Bitwise Logical And -OptCategory[NN_pandn] = 1; // Bitwise Logical And Not -OptCategory[NN_pcmpeqb] = 1; // Packed Compare for Equal (Byte) -OptCategory[NN_pcmpeqw] = 1; // Packed Compare for Equal (Word) -OptCategory[NN_pcmpeqd] = 1; // Packed Compare for Equal (Dword) -OptCategory[NN_pcmpgtb] = 1; // Packed Compare for Greater Than (Byte) -OptCategory[NN_pcmpgtw] = 1; // Packed Compare for Greater Than (Word) -OptCategory[NN_pcmpgtd] = 1; // Packed Compare for Greater Than (Dword) -OptCategory[NN_pmaddwd] = 1; // Packed Multiply and Add -OptCategory[NN_pmulhw] = 1; // Packed Multiply High -OptCategory[NN_pmullw] = 1; // Packed Multiply Low -OptCategory[NN_por] = 1; // Bitwise Logical Or -OptCategory[NN_psllw] = 1; // Packed Shift Left Logical (Word) -OptCategory[NN_pslld] = 1; // Packed Shift Left Logical (Dword) -OptCategory[NN_psllq] = 1; // Packed Shift Left Logical (Qword) -OptCategory[NN_psraw] = 1; // Packed Shift Right Arithmetic (Word) -OptCategory[NN_psrad] = 1; // Packed Shift Right Arithmetic (Dword) -OptCategory[NN_psrlw] = 1; // Packed Shift Right Logical (Word) -OptCategory[NN_psrld] = 1; // Packed Shift Right Logical (Dword) -OptCategory[NN_psrlq] = 1; // Packed Shift Right Logical (Qword) -OptCategory[NN_psubb] = 1; // Packed Subtract Byte -OptCategory[NN_psubw] = 1; // Packed Subtract Word -OptCategory[NN_psubd] = 1; // Packed Subtract Dword -OptCategory[NN_psubsb] = 1; // Packed Subtract with Saturation (Byte) -OptCategory[NN_psubsw] = 1; // Packed Subtract with Saturation (Word) -OptCategory[NN_psubusb] = 1; // Packed Subtract Unsigned with Saturation (Byte) -OptCategory[NN_psubusw] = 1; // Packed Subtract Unsigned with Saturation (Word) -OptCategory[NN_punpckhbw] = 1; // Unpack High Packed Data (Byte->Word) -OptCategory[NN_punpckhwd] = 1; // Unpack High Packed Data (Word->Dword) -OptCategory[NN_punpckhdq] = 1; // Unpack High Packed Data (Dword->Qword) -OptCategory[NN_punpcklbw] = 1; // Unpack Low Packed Data (Byte->Word) -OptCategory[NN_punpcklwd] = 1; // Unpack Low Packed Data (Word->Dword) -OptCategory[NN_punpckldq] = 1; // Unpack Low Packed Data (Dword->Qword) -OptCategory[NN_pxor] = 1; // Bitwise Logical Exclusive Or - -// -// Undocumented Deschutes processor instructions -// - -OptCategory[NN_fxsave] = 1; // Fast save FP context ** to where? -OptCategory[NN_fxrstor] = 1; // Fast restore FP context ** from where? - -// Pentium II instructions - -OptCategory[NN_sysenter] = 1; // Fast Transition to System Call Entry Point -OptCategory[NN_sysexit] = 1; // Fast Transition from System Call Entry Point - -// 3DNow! instructions - -OptCategory[NN_pavgusb] = 1; // Packed 8-bit Unsigned Integer Averaging -OptCategory[NN_pfadd] = 1; // Packed Floating-Point Addition -OptCategory[NN_pfsub] = 1; // Packed Floating-Point Subtraction -OptCategory[NN_pfsubr] = 1; // Packed Floating-Point Reverse Subtraction -OptCategory[NN_pfacc] = 1; // Packed Floating-Point Accumulate -OptCategory[NN_pfcmpge] = 1; // Packed Floating-Point Comparison, Greater or Equal -OptCategory[NN_pfcmpgt] = 1; // Packed Floating-Point Comparison, Greater -OptCategory[NN_pfcmpeq] = 1; // Packed Floating-Point Comparison, Equal -OptCategory[NN_pfmin] = 1; // Packed Floating-Point Minimum -OptCategory[NN_pfmax] = 1; // Packed Floating-Point Maximum -OptCategory[NN_pi2fd] = 1; // Packed 32-bit Integer to Floating-Point -OptCategory[NN_pf2id] = 1; // Packed Floating-Point to 32-bit Integer -OptCategory[NN_pfrcp] = 1; // Packed Floating-Point Reciprocal Approximation -OptCategory[NN_pfrsqrt] = 1; // Packed Floating-Point Reciprocal Square Root Approximation -OptCategory[NN_pfmul] = 1; // Packed Floating-Point Multiplication -OptCategory[NN_pfrcpit1] = 1; // Packed Floating-Point Reciprocal First Iteration Step -OptCategory[NN_pfrsqit1] = 1; // Packed Floating-Point Reciprocal Square Root First Iteration Step -OptCategory[NN_pfrcpit2] = 1; // Packed Floating-Point Reciprocal Second Iteration Step -OptCategory[NN_pmulhrw] = 1; // Packed Floating-Point 16-bit Integer Multiply with rounding -OptCategory[NN_femms] = 1; // Faster entry/exit of the MMX or floating-point state -OptCategory[NN_prefetch] = 1; // Prefetch at least a 32-byte line into L1 data cache -OptCategory[NN_prefetchw] = 1; // Prefetch processor cache line into L1 data cache (mark as modified) - - -// Pentium III instructions - -OptCategory[NN_addps] = 1; // Packed Single-FP Add -OptCategory[NN_addss] = 1; // Scalar Single-FP Add -OptCategory[NN_andnps] = 1; // Bitwise Logical And Not for Single-FP -OptCategory[NN_andps] = 1; // Bitwise Logical And for Single-FP -OptCategory[NN_cmpps] = 1; // Packed Single-FP Compare -OptCategory[NN_cmpss] = 1; // Scalar Single-FP Compare -OptCategory[NN_comiss] = 1; // Scalar Ordered Single-FP Compare and Set EFLAGS -OptCategory[NN_cvtpi2ps] = 1; // Packed signed INT32 to Packed Single-FP conversion -OptCategory[NN_cvtps2pi] = 1; // Packed Single-FP to Packed INT32 conversion -OptCategory[NN_cvtsi2ss] = 1; // Scalar signed INT32 to Single-FP conversion -OptCategory[NN_cvtss2si] = 2; // Scalar Single-FP to signed INT32 conversion -OptCategory[NN_cvttps2pi] = 1; // Packed Single-FP to Packed INT32 conversion (truncate) -OptCategory[NN_cvttss2si] = 2; // Scalar Single-FP to signed INT32 conversion (truncate) -OptCategory[NN_divps] = 1; // Packed Single-FP Divide -OptCategory[NN_divss] = 1; // Scalar Single-FP Divide -OptCategory[NN_ldmxcsr] = 1; // Load Streaming SIMD Extensions Technology Control/Status Register -OptCategory[NN_maxps] = 1; // Packed Single-FP Maximum -OptCategory[NN_maxss] = 1; // Scalar Single-FP Maximum -OptCategory[NN_minps] = 1; // Packed Single-FP Minimum -OptCategory[NN_minss] = 1; // Scalar Single-FP Minimum -OptCategory[NN_movaps] = 9; // Move Aligned Four Packed Single-FP ** infer memsrc 'n'? -OptCategory[NN_movhlps] = 1; // Move High to Low Packed Single-FP -OptCategory[NN_movhps] = 1; // Move High Packed Single-FP -OptCategory[NN_movlhps] = 1; // Move Low to High Packed Single-FP -OptCategory[NN_movlps] = 1; // Move Low Packed Single-FP -OptCategory[NN_movmskps] = 1; // Move Mask to Register -OptCategory[NN_movss] = 9; // Move Scalar Single-FP -OptCategory[NN_movups] = 9; // Move Unaligned Four Packed Single-FP -OptCategory[NN_mulps] = 1; // Packed Single-FP Multiply -OptCategory[NN_mulss] = 1; // Scalar Single-FP Multiply -OptCategory[NN_orps] = 1; // Bitwise Logical OR for Single-FP Data -OptCategory[NN_rcpps] = 1; // Packed Single-FP Reciprocal -OptCategory[NN_rcpss] = 1; // Scalar Single-FP Reciprocal -OptCategory[NN_rsqrtps] = 1; // Packed Single-FP Square Root Reciprocal -OptCategory[NN_rsqrtss] = 1; // Scalar Single-FP Square Root Reciprocal -OptCategory[NN_shufps] = 1; // Shuffle Single-FP -OptCategory[NN_sqrtps] = 1; // Packed Single-FP Square Root -OptCategory[NN_sqrtss] = 1; // Scalar Single-FP Square Root -OptCategory[NN_stmxcsr] = 0; // Store Streaming SIMD Extensions Technology Control/Status Register ** Infer dest is 'n' -OptCategory[NN_subps] = 1; // Packed Single-FP Subtract -OptCategory[NN_subss] = 1; // Scalar Single-FP Subtract -OptCategory[NN_ucomiss] = 1; // Scalar Unordered Single-FP Compare and Set EFLAGS -OptCategory[NN_unpckhps] = 1; // Unpack High Packed Single-FP Data -OptCategory[NN_unpcklps] = 1; // Unpack Low Packed Single-FP Data -OptCategory[NN_xorps] = 1; // Bitwise Logical XOR for Single-FP Data -OptCategory[NN_pavgb] = 1; // Packed Average (Byte) -OptCategory[NN_pavgw] = 1; // Packed Average (Word) -OptCategory[NN_pextrw] = 2; // Extract Word -OptCategory[NN_pinsrw] = 1; // Insert Word -OptCategory[NN_pmaxsw] = 1; // Packed Signed Integer Word Maximum -OptCategory[NN_pmaxub] = 1; // Packed Unsigned Integer Byte Maximum -OptCategory[NN_pminsw] = 1; // Packed Signed Integer Word Minimum -OptCategory[NN_pminub] = 1; // Packed Unsigned Integer Byte Minimum -OptCategory[NN_pmovmskb] = 1; // Move Byte Mask to Integer -OptCategory[NN_pmulhuw] = 1; // Packed Multiply High Unsigned -OptCategory[NN_psadbw] = 1; // Packed Sum of Absolute Differences -OptCategory[NN_pshufw] = 1; // Packed Shuffle Word -OptCategory[NN_maskmovq] = 0; // Byte Mask write ** Infer dest is 'n' -OptCategory[NN_movntps] = 0; // Move Aligned Four Packed Single-FP Non Temporal * infer dest is 'n' -OptCategory[NN_movntq] = 0; // Move 64 Bits Non Temporal ** Infer dest is 'n' -OptCategory[NN_prefetcht0] = 1; // Prefetch to all cache levels -OptCategory[NN_prefetcht1] = 1; // Prefetch to all cache levels -OptCategory[NN_prefetcht2] = 1; // Prefetch to L2 cache -OptCategory[NN_prefetchnta] = 1; // Prefetch to L1 cache -OptCategory[NN_sfence] = 1; // Store Fence - -// Pentium III Pseudo instructions - -OptCategory[NN_cmpeqps] = 1; // Packed Single-FP Compare EQ -OptCategory[NN_cmpltps] = 1; // Packed Single-FP Compare LT -OptCategory[NN_cmpleps] = 1; // Packed Single-FP Compare LE -OptCategory[NN_cmpunordps] = 1; // Packed Single-FP Compare UNORD -OptCategory[NN_cmpneqps] = 1; // Packed Single-FP Compare NOT EQ -OptCategory[NN_cmpnltps] = 1; // Packed Single-FP Compare NOT LT -OptCategory[NN_cmpnleps] = 1; // Packed Single-FP Compare NOT LE -OptCategory[NN_cmpordps] = 1; // Packed Single-FP Compare ORDERED -OptCategory[NN_cmpeqss] = 1; // Scalar Single-FP Compare EQ -OptCategory[NN_cmpltss] = 1; // Scalar Single-FP Compare LT -OptCategory[NN_cmpless] = 1; // Scalar Single-FP Compare LE -OptCategory[NN_cmpunordss] = 1; // Scalar Single-FP Compare UNORD -OptCategory[NN_cmpneqss] = 1; // Scalar Single-FP Compare NOT EQ -OptCategory[NN_cmpnltss] = 1; // Scalar Single-FP Compare NOT LT -OptCategory[NN_cmpnless] = 1; // Scalar Single-FP Compare NOT LE -OptCategory[NN_cmpordss] = 1; // Scalar Single-FP Compare ORDERED - -// AMD K7 instructions - -// Revisit AMD if we port to it. -OptCategory[NN_pf2iw] = 0; // Packed Floating-Point to Integer with Sign Extend -OptCategory[NN_pfnacc] = 0; // Packed Floating-Point Negative Accumulate -OptCategory[NN_pfpnacc] = 0; // Packed Floating-Point Mixed Positive-Negative Accumulate -OptCategory[NN_pi2fw] = 0; // Packed 16-bit Integer to Floating-Point -OptCategory[NN_pswapd] = 0; // Packed Swap Double Word - -// Undocumented FP instructions (thanks to norbert.juffa@adm.com) - -OptCategory[NN_fstp1] = 9; // Alias of Store Real and Pop -OptCategory[NN_fcom2] = 1; // Alias of Compare Real -OptCategory[NN_fcomp3] = 1; // Alias of Compare Real and Pop -OptCategory[NN_fxch4] = 1; // Alias of Exchange Registers -OptCategory[NN_fcomp5] = 1; // Alias of Compare Real and Pop -OptCategory[NN_ffreep] = 1; // Free Register and Pop -OptCategory[NN_fxch7] = 1; // Alias of Exchange Registers -OptCategory[NN_fstp8] = 9; // Alias of Store Real and Pop -OptCategory[NN_fstp9] = 9; // Alias of Store Real and Pop - -// Pentium 4 instructions - -OptCategory[NN_addpd] = 1; // Add Packed Double-Precision Floating-Point Values -OptCategory[NN_addsd] = 1; // Add Scalar Double-Precision Floating-Point Values -OptCategory[NN_andnpd] = 1; // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values -OptCategory[NN_andpd] = 1; // Bitwise Logical AND of Packed Double-Precision Floating-Point Values -OptCategory[NN_clflush] = 1; // Flush Cache Line -OptCategory[NN_cmppd] = 1; // Compare Packed Double-Precision Floating-Point Values -OptCategory[NN_cmpsd] = 1; // Compare Scalar Double-Precision Floating-Point Values -OptCategory[NN_comisd] = 1; // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS -OptCategory[NN_cvtdq2pd] = 1; // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values -OptCategory[NN_cvtdq2ps] = 1; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values -OptCategory[NN_cvtpd2dq] = 1; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -OptCategory[NN_cvtpd2pi] = 1; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -OptCategory[NN_cvtpd2ps] = 1; // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values -OptCategory[NN_cvtpi2pd] = 1; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values -OptCategory[NN_cvtps2dq] = 1; // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers -OptCategory[NN_cvtps2pd] = 1; // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values -OptCategory[NN_cvtsd2si] = 2; // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer -OptCategory[NN_cvtsd2ss] = 1; // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value -OptCategory[NN_cvtsi2sd] = 1; // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value -OptCategory[NN_cvtss2sd] = 1; // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value -OptCategory[NN_cvttpd2dq] = 1; // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -OptCategory[NN_cvttpd2pi] = 1; // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -OptCategory[NN_cvttps2dq] = 1; // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers -OptCategory[NN_cvttsd2si] = 2; // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer -OptCategory[NN_divpd] = 1; // Divide Packed Double-Precision Floating-Point Values -OptCategory[NN_divsd] = 1; // Divide Scalar Double-Precision Floating-Point Values -OptCategory[NN_lfence] = 1; // Load Fence -OptCategory[NN_maskmovdqu] = 0; // Store Selected Bytes of Double Quadword ** Infer dest is 'n' -OptCategory[NN_maxpd] = 1; // Return Maximum Packed Double-Precision Floating-Point Values -OptCategory[NN_maxsd] = 1; // Return Maximum Scalar Double-Precision Floating-Point Value -OptCategory[NN_mfence] = 1; // Memory Fence -OptCategory[NN_minpd] = 1; // Return Minimum Packed Double-Precision Floating-Point Values -OptCategory[NN_minsd] = 1; // Return Minimum Scalar Double-Precision Floating-Point Value -OptCategory[NN_movapd] = 9; // Move Aligned Packed Double-Precision Floating-Point Values ** Infer dest is 'n' -OptCategory[NN_movdq2q] = 1; // Move Quadword from XMM to MMX Register -OptCategory[NN_movdqa] = 9; // Move Aligned Double Quadword ** Infer dest is 'n' -OptCategory[NN_movdqu] = 9; // Move Unaligned Double Quadword ** Infer dest is 'n' -OptCategory[NN_movhpd] = 9; // Move High Packed Double-Precision Floating-Point Values ** Infer dest is 'n' -OptCategory[NN_movlpd] = 9; // Move Low Packed Double-Precision Floating-Point Values ** Infer dest is 'n' -OptCategory[NN_movmskpd] = 2; // Extract Packed Double-Precision Floating-Point Sign Mask -OptCategory[NN_movntdq] = 0; // Store Double Quadword Using Non-Temporal Hint -OptCategory[NN_movnti] = 0; // Store Doubleword Using Non-Temporal Hint -OptCategory[NN_movntpd] = 0; // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint -OptCategory[NN_movq2dq] = 1; // Move Quadword from MMX to XMM Register -OptCategory[NN_movsd] = 9; // Move Scalar Double-Precision Floating-Point Values -OptCategory[NN_movupd] = 9; // Move Unaligned Packed Double-Precision Floating-Point Values -OptCategory[NN_mulpd] = 1; // Multiply Packed Double-Precision Floating-Point Values -OptCategory[NN_mulsd] = 1; // Multiply Scalar Double-Precision Floating-Point Values -OptCategory[NN_orpd] = 1; // Bitwise Logical OR of Double-Precision Floating-Point Values -OptCategory[NN_paddq] = 1; // Add Packed Quadword Integers -OptCategory[NN_pause] = 1; // Spin Loop Hint -OptCategory[NN_pmuludq] = 1; // Multiply Packed Unsigned Doubleword Integers -OptCategory[NN_pshufd] = 1; // Shuffle Packed Doublewords -OptCategory[NN_pshufhw] = 1; // Shuffle Packed High Words -OptCategory[NN_pshuflw] = 1; // Shuffle Packed Low Words -OptCategory[NN_pslldq] = 1; // Shift Double Quadword Left Logical -OptCategory[NN_psrldq] = 1; // Shift Double Quadword Right Logical -OptCategory[NN_psubq] = 1; // Subtract Packed Quadword Integers -OptCategory[NN_punpckhqdq] = 1; // Unpack High Data -OptCategory[NN_punpcklqdq] = 1; // Unpack Low Data -OptCategory[NN_shufpd] = 1; // Shuffle Packed Double-Precision Floating-Point Values -OptCategory[NN_sqrtpd] = 1; // Compute Square Roots of Packed Double-Precision Floating-Point Values -OptCategory[NN_sqrtsd] = 1; // Compute Square Rootof Scalar Double-Precision Floating-Point Value -OptCategory[NN_subpd] = 1; // Subtract Packed Double-Precision Floating-Point Values -OptCategory[NN_subsd] = 1; // Subtract Scalar Double-Precision Floating-Point Values -OptCategory[NN_ucomisd] = 1; // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS -OptCategory[NN_unpckhpd] = 1; // Unpack and Interleave High Packed Double-Precision Floating-Point Values -OptCategory[NN_unpcklpd] = 1; // Unpack and Interleave Low Packed Double-Precision Floating-Point Values -OptCategory[NN_xorpd] = 1; // Bitwise Logical OR of Double-Precision Floating-Point Values - - -// AMD syscall/sysret instructions NOTE: not AMD, found in Intel manual - -OptCategory[NN_syscall] = 1; // Low latency system call -OptCategory[NN_sysret] = 1; // Return from system call - -// AMD64 instructions NOTE: not AMD, found in Intel manual - -OptCategory[NN_swapgs] = 1; // Exchange GS base with KernelGSBase MSR - -// New Pentium instructions (SSE3) - -OptCategory[NN_movddup] = 9; // Move One Double-FP and Duplicate -OptCategory[NN_movshdup] = 9; // Move Packed Single-FP High and Duplicate -OptCategory[NN_movsldup] = 9; // Move Packed Single-FP Low and Duplicate - -// Missing AMD64 instructions NOTE: also found in Intel manual - -OptCategory[NN_movsxd] = 2; // Move with Sign-Extend Doubleword -OptCategory[NN_cmpxchg16b] = 0; // Compare and Exchange 16 Bytes - -// SSE3 instructions - -OptCategory[NN_addsubpd] = 1; // Add /Sub packed DP FP numbers -OptCategory[NN_addsubps] = 1; // Add /Sub packed SP FP numbers -OptCategory[NN_haddpd] = 1; // Add horizontally packed DP FP numbers -OptCategory[NN_haddps] = 1; // Add horizontally packed SP FP numbers -OptCategory[NN_hsubpd] = 1; // Sub horizontally packed DP FP numbers -OptCategory[NN_hsubps] = 1; // Sub horizontally packed SP FP numbers -OptCategory[NN_monitor] = 1; // Set up a linear address range to be monitored by hardware -OptCategory[NN_mwait] = 1; // Wait until write-back store performed within the range specified by the MONITOR instruction -OptCategory[NN_fisttp] = 0; // Store ST in intXX (chop) and pop -OptCategory[NN_lddqu] = 1; // Load unaligned integer 128-bit - -// SSSE3 instructions - -OptCategory[NN_psignb] = 1; // Packed SIGN Byte -OptCategory[NN_psignw] = 1; // Packed SIGN Word -OptCategory[NN_psignd] = 1; // Packed SIGN Doubleword -OptCategory[NN_pshufb] = 1; // Packed Shuffle Bytes -OptCategory[NN_pmulhrsw] = 1; // Packed Multiply High with Round and Scale -OptCategory[NN_pmaddubsw] = 1; // Multiply and Add Packed Signed and Unsigned Bytes -OptCategory[NN_phsubsw] = 1; // Packed Horizontal Subtract and Saturate -OptCategory[NN_phaddsw] = 1; // Packed Horizontal Add and Saturate -OptCategory[NN_phaddw] = 1; // Packed Horizontal Add Word -OptCategory[NN_phaddd] = 1; // Packed Horizontal Add Doubleword -OptCategory[NN_phsubw] = 1; // Packed Horizontal Subtract Word -OptCategory[NN_phsubd] = 1; // Packed Horizontal Subtract Doubleword -OptCategory[NN_palignr] = 1; // Packed Align Right -OptCategory[NN_pabsb] = 1; // Packed Absolute Value Byte -OptCategory[NN_pabsw] = 1; // Packed Absolute Value Word -OptCategory[NN_pabsd] = 1; // Packed Absolute Value Doubleword - -// VMX instructions - -OptCategory[NN_vmcall] = 1; // Call to VM Monitor -OptCategory[NN_vmclear] = 0; // Clear Virtual Machine Control Structure -OptCategory[NN_vmlaunch] = 1; // Launch Virtual Machine -OptCategory[NN_vmresume] = 1; // Resume Virtual Machine -OptCategory[NN_vmptrld] = 6; // Load Pointer to Virtual Machine Control Structure -OptCategory[NN_vmptrst] = 0; // Store Pointer to Virtual Machine Control Structure -OptCategory[NN_vmread] = 0; // Read Field from Virtual Machine Control Structure -OptCategory[NN_vmwrite] = 0; // Write Field from Virtual Machine Control Structure -OptCategory[NN_vmxoff] = 1; // Leave VMX Operation -OptCategory[NN_vmxon] = 1; // Enter VMX Operation - -#if 599 < IDA_SDK_VERSION - -OptCategory[NN_ud2] = 1; // Undefined Instruction - -// Added with x86-64 - -OptCategory[NN_rdtscp] = 10; // Read Time-Stamp Counter and Processor ID - -// Geode LX 3DNow! extensions - -OptCategory[NN_pfrcpv] = 1; // Reciprocal Approximation for a Pair of 32-bit Floats -OptCategory[NN_pfrsqrtv] = 1; // Reciprocal Square Root Approximation for a Pair of 32-bit Floats - -// SSE2 pseudoinstructions - -OptCategory[NN_cmpeqpd] = 1; // Packed Double-FP Compare EQ -OptCategory[NN_cmpltpd] = 1; // Packed Double-FP Compare LT -OptCategory[NN_cmplepd] = 1; // Packed Double-FP Compare LE -OptCategory[NN_cmpunordpd] = 1; // Packed Double-FP Compare UNORD -OptCategory[NN_cmpneqpd] = 1; // Packed Double-FP Compare NOT EQ -OptCategory[NN_cmpnltpd] = 1; // Packed Double-FP Compare NOT LT -OptCategory[NN_cmpnlepd] = 1; // Packed Double-FP Compare NOT LE -OptCategory[NN_cmpordpd] = 1; // Packed Double-FP Compare ORDERED -OptCategory[NN_cmpeqsd] = 1; // Scalar Double-FP Compare EQ -OptCategory[NN_cmpltsd] = 1; // Scalar Double-FP Compare LT -OptCategory[NN_cmplesd] = 1; // Scalar Double-FP Compare LE -OptCategory[NN_cmpunordsd] = 1; // Scalar Double-FP Compare UNORD -OptCategory[NN_cmpneqsd] = 1; // Scalar Double-FP Compare NOT EQ -OptCategory[NN_cmpnltsd] = 1; // Scalar Double-FP Compare NOT LT -OptCategory[NN_cmpnlesd] = 1; // Scalar Double-FP Compare NOT LE -OptCategory[NN_cmpordsd] = 1; // Scalar Double-FP Compare ORDERED - -// SSSE4.1 instructions - -OptCategory[NN_blendpd] = 1; // Blend Packed Double Precision Floating-Point Values -OptCategory[NN_blendps] = 1; // Blend Packed Single Precision Floating-Point Values -OptCategory[NN_blendvpd] = 1; // Variable Blend Packed Double Precision Floating-Point Values -OptCategory[NN_blendvps] = 1; // Variable Blend Packed Single Precision Floating-Point Values -OptCategory[NN_dppd] = 1; // Dot Product of Packed Double Precision Floating-Point Values -OptCategory[NN_dpps] = 1; // Dot Product of Packed Single Precision Floating-Point Values -OptCategory[NN_extractps] = 2; // Extract Packed Single Precision Floating-Point Value -OptCategory[NN_insertps] = 1; // Insert Packed Single Precision Floating-Point Value -OptCategory[NN_movntdqa] = 0; // Load Double Quadword Non-Temporal Aligned Hint -OptCategory[NN_mpsadbw] = 1; // Compute Multiple Packed Sums of Absolute Difference -OptCategory[NN_packusdw] = 1; // Pack with Unsigned Saturation -OptCategory[NN_pblendvb] = 1; // Variable Blend Packed Bytes -OptCategory[NN_pblendw] = 1; // Blend Packed Words -OptCategory[NN_pcmpeqq] = 1; // Compare Packed Qword Data for Equal -OptCategory[NN_pextrb] = 1; // Extract Byte -OptCategory[NN_pextrd] = 1; // Extract Dword -OptCategory[NN_pextrq] = 1; // Extract Qword -OptCategory[NN_phminposuw] = 1; // Packed Horizontal Word Minimum -OptCategory[NN_pinsrb] = 1; // Insert Byte -OptCategory[NN_pinsrd] = 1; // Insert Dword -OptCategory[NN_pinsrq] = 1; // Insert Qword -OptCategory[NN_pmaxsb] = 1; // Maximum of Packed Signed Byte Integers -OptCategory[NN_pmaxsd] = 1; // Maximum of Packed Signed Dword Integers -OptCategory[NN_pmaxud] = 1; // Maximum of Packed Unsigned Dword Integers -OptCategory[NN_pmaxuw] = 1; // Maximum of Packed Word Integers -OptCategory[NN_pminsb] = 1; // Minimum of Packed Signed Byte Integers -OptCategory[NN_pminsd] = 1; // Minimum of Packed Signed Dword Integers -OptCategory[NN_pminud] = 1; // Minimum of Packed Unsigned Dword Integers -OptCategory[NN_pminuw] = 1; // Minimum of Packed Word Integers -OptCategory[NN_pmovsxbw] = 1; // Packed Move with Sign Extend -OptCategory[NN_pmovsxbd] = 1; // Packed Move with Sign Extend -OptCategory[NN_pmovsxbq] = 1; // Packed Move with Sign Extend -OptCategory[NN_pmovsxwd] = 1; // Packed Move with Sign Extend -OptCategory[NN_pmovsxwq] = 1; // Packed Move with Sign Extend -OptCategory[NN_pmovsxdq] = 1; // Packed Move with Sign Extend -OptCategory[NN_pmovzxbw] = 1; // Packed Move with Zero Extend -OptCategory[NN_pmovzxbd] = 1; // Packed Move with Zero Extend -OptCategory[NN_pmovzxbq] = 1; // Packed Move with Zero Extend -OptCategory[NN_pmovzxwd] = 1; // Packed Move with Zero Extend -OptCategory[NN_pmovzxwq] = 1; // Packed Move with Zero Extend -OptCategory[NN_pmovzxdq] = 1; // Packed Move with Zero Extend -OptCategory[NN_pmuldq] = 1; // Multiply Packed Signed Dword Integers -OptCategory[NN_pmulld] = 1; // Multiply Packed Signed Dword Integers and Store Low Result -OptCategory[NN_ptest] = 1; // Logical Compare -OptCategory[NN_roundpd] = 1; // Round Packed Double Precision Floating-Point Values -OptCategory[NN_roundps] = 1; // Round Packed Single Precision Floating-Point Values -OptCategory[NN_roundsd] = 1; // Round Scalar Double Precision Floating-Point Values -OptCategory[NN_roundss] = 1; // Round Scalar Single Precision Floating-Point Values - -// SSSE4.2 instructions -OptCategory[NN_crc32] = 2; // Accumulate CRC32 Value -OptCategory[NN_pcmpestri] = 2; // Packed Compare Explicit Length Strings, Return Index -OptCategory[NN_pcmpestrm] = 2; // Packed Compare Explicit Length Strings, Return Mask -OptCategory[NN_pcmpistri] = 2; // Packed Compare Implicit Length Strings, Return Index -OptCategory[NN_pcmpistrm] = 2; // Packed Compare Implicit Length Strings, Return Mask -OptCategory[NN_pcmpgtq] = 1; // Compare Packed Data for Greater Than -OptCategory[NN_popcnt] = 2; // Return the Count of Number of Bits Set to 1 - -// AMD SSE4a instructions - -OptCategory[NN_extrq] = 1; // Extract Field From Register -OptCategory[NN_insertq] = 1; // Insert Field -OptCategory[NN_movntsd] = 0; // Move Non-Temporal Scalar Double-Precision Floating-Point -OptCategory[NN_movntss] = 0; // Move Non-Temporal Scalar Single-Precision Floating-Point -OptCategory[NN_lzcnt] = 2; // Leading Zero Count - -// xsave/xrstor instructions - -OptCategory[NN_xgetbv] = 8; // Get Value of Extended Control Register -OptCategory[NN_xrstor] = 0; // Restore Processor Extended States -OptCategory[NN_xsave] = 1; // Save Processor Extended States -OptCategory[NN_xsetbv] = 1; // Set Value of Extended Control Register - -// Intel Safer Mode Extensions (SMX) - -OptCategory[NN_getsec] = 1; // Safer Mode Extensions (SMX) Instruction - -// AMD-V Virtualization ISA Extension - -OptCategory[NN_clgi] = 0; // Clear Global Interrupt Flag -OptCategory[NN_invlpga] = 1; // Invalidate TLB Entry in a Specified ASID -OptCategory[NN_skinit] = 1; // Secure Init and Jump with Attestation -OptCategory[NN_stgi] = 0; // Set Global Interrupt Flag -OptCategory[NN_vmexit] = 1; // Stop Executing Guest, Begin Executing Host -OptCategory[NN_vmload] = 0; // Load State from VMCB -OptCategory[NN_vmmcall] = 1; // Call VMM -OptCategory[NN_vmrun] = 1; // Run Virtual Machine -OptCategory[NN_vmsave] = 0; // Save State to VMCB - -// VMX+ instructions - -OptCategory[NN_invept] = 1; // Invalidate Translations Derived from EPT -OptCategory[NN_invvpid] = 1; // Invalidate Translations Based on VPID - -// Intel Atom instructions - -OptCategory[NN_movbe] = 3; // Move Data After Swapping Bytes - -// Intel AES instructions - -OptCategory[NN_aesenc] = 1; // Perform One Round of an AES Encryption Flow -OptCategory[NN_aesenclast] = 1; // Perform the Last Round of an AES Encryption Flow -OptCategory[NN_aesdec] = 1; // Perform One Round of an AES Decryption Flow -OptCategory[NN_aesdeclast] = 1; // Perform the Last Round of an AES Decryption Flow -OptCategory[NN_aesimc] = 1; // Perform the AES InvMixColumn Transformation -OptCategory[NN_aeskeygenassist] = 1; // AES Round Key Generation Assist - -// Carryless multiplication - -OptCategory[NN_pclmulqdq] = 1; // Carry-Less Multiplication Quadword - -// Returns modified by operand size prefixes - -OptCategory[NN_retnw] = 0; // Return Near from Procedure (use16) -OptCategory[NN_retnd] = 0; // Return Near from Procedure (use32) -OptCategory[NN_retnq] = 0; // Return Near from Procedure (use64) -OptCategory[NN_retfw] = 0; // Return Far from Procedure (use16) -OptCategory[NN_retfd] = 0; // Return Far from Procedure (use32) -OptCategory[NN_retfq] = 0; // Return Far from Procedure (use64) - -// RDRAND support - -OptCategory[NN_rdrand] = 2; // Read Random Number - -// new GPR instructions - -OptCategory[NN_adcx] = 5; // Unsigned Integer Addition of Two Operands with Carry Flag -OptCategory[NN_adox] = 5; // Unsigned Integer Addition of Two Operands with Overflow Flag -OptCategory[NN_andn] = 0; // Logical AND NOT -OptCategory[NN_bextr] = 2; // Bit Field Extract -OptCategory[NN_blsi] = 2; // Extract Lowest Set Isolated Bit -OptCategory[NN_blsmsk] = 2; // Get Mask Up to Lowest Set Bit -OptCategory[NN_blsr] = 2; // Reset Lowest Set Bit -OptCategory[NN_bzhi] = 2; // Zero High Bits Starting with Specified Bit Position -OptCategory[NN_clac] = 1; // Clear AC Flag in EFLAGS Register -OptCategory[NN_mulx] = 2; // Unsigned Multiply Without Affecting Flags -OptCategory[NN_pdep] = 2; // Parallel Bits Deposit -OptCategory[NN_pext] = 2; // Parallel Bits Extract -OptCategory[NN_rorx] = 2; // Rotate Right Logical Without Affecting Flags -OptCategory[NN_sarx] = 2; // Shift Arithmetically Right Without Affecting Flags -OptCategory[NN_shlx] = 2; // Shift Logically Left Without Affecting Flags -OptCategory[NN_shrx] = 2; // Shift Logically Right Without Affecting Flags -OptCategory[NN_stac] = 1; // Set AC Flag in EFLAGS Register -OptCategory[NN_tzcnt] = 2; // Count the Number of Trailing Zero Bits -OptCategory[NN_xsaveopt] = 1; // Save Processor Extended States Optimized -OptCategory[NN_invpcid] = 1; // Invalidate Processor Context ID -OptCategory[NN_rdseed] = 2; // Read Random Seed -OptCategory[NN_rdfsbase] = 6; // Read FS Segment Base -OptCategory[NN_rdgsbase] = 6; // Read GS Segment Base -OptCategory[NN_wrfsbase] = 6; // Write FS Segment Base -OptCategory[NN_wrgsbase] = 6; // Write GS Segment Base - -// new AVX instructions - -OptCategory[NN_vaddpd] = 1; // Add Packed Double-Precision Floating-Point Values -OptCategory[NN_vaddps] = 1; // Packed Single-FP Add -OptCategory[NN_vaddsd] = 1; // Add Scalar Double-Precision Floating-Point Values -OptCategory[NN_vaddss] = 1; // Scalar Single-FP Add -OptCategory[NN_vaddsubpd] = 1; // Add /Sub packed DP FP numbers -OptCategory[NN_vaddsubps] = 1; // Add /Sub packed SP FP numbers -OptCategory[NN_vaesdec] = 1; // Perform One Round of an AES Decryption Flow -OptCategory[NN_vaesdeclast] = 1; // Perform the Last Round of an AES Decryption Flow -OptCategory[NN_vaesenc] = 1; // Perform One Round of an AES Encryption Flow -OptCategory[NN_vaesenclast] = 1; // Perform the Last Round of an AES Encryption Flow -OptCategory[NN_vaesimc] = 1; // Perform the AES InvMixColumn Transformation -OptCategory[NN_vaeskeygenassist] = 1; // AES Round Key Generation Assist -OptCategory[NN_vandnpd] = 1; // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values -OptCategory[NN_vandnps] = 1; // Bitwise Logical And Not for Single-FP -OptCategory[NN_vandpd] = 1; // Bitwise Logical AND of Packed Double-Precision Floating-Point Values -OptCategory[NN_vandps] = 1; // Bitwise Logical And for Single-FP -OptCategory[NN_vblendpd] = 1; // Blend Packed Double Precision Floating-Point Values -OptCategory[NN_vblendps] = 1; // Blend Packed Single Precision Floating-Point Values -OptCategory[NN_vblendvpd] = 1; // Variable Blend Packed Double Precision Floating-Point Values -OptCategory[NN_vblendvps] = 1; // Variable Blend Packed Single Precision Floating-Point Values -OptCategory[NN_vbroadcastf128] = 1; // Broadcast 128 Bits of Floating-Point Data -OptCategory[NN_vbroadcasti128] = 1; // Broadcast 128 Bits of Integer Data -OptCategory[NN_vbroadcastsd] = 1; // Broadcast Double-Precision Floating-Point Element -OptCategory[NN_vbroadcastss] = 1; // Broadcast Single-Precision Floating-Point Element -OptCategory[NN_vcmppd] = 1; // Compare Packed Double-Precision Floating-Point Values -OptCategory[NN_vcmpps] = 1; // Packed Single-FP Compare -OptCategory[NN_vcmpsd] = 1; // Compare Scalar Double-Precision Floating-Point Values -OptCategory[NN_vcmpss] = 1; // Scalar Single-FP Compare -OptCategory[NN_vcomisd] = 1; // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS -OptCategory[NN_vcomiss] = 1; // Scalar Ordered Single-FP Compare and Set EFLAGS -OptCategory[NN_vcvtdq2pd] = 1; // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values -OptCategory[NN_vcvtdq2ps] = 1; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values -OptCategory[NN_vcvtpd2dq] = 1; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -OptCategory[NN_vcvtpd2ps] = 1; // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values -OptCategory[NN_vcvtph2ps] = 1; // Convert 16-bit FP Values to Single-Precision FP Values -OptCategory[NN_vcvtps2dq] = 1; // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers -OptCategory[NN_vcvtps2pd] = 1; // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values -OptCategory[NN_vcvtps2ph] = 1; // Convert Single-Precision FP value to 16-bit FP value -OptCategory[NN_vcvtsd2si] = 1; // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer -OptCategory[NN_vcvtsd2ss] = 1; // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value -OptCategory[NN_vcvtsi2sd] = 1; // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value -OptCategory[NN_vcvtsi2ss] = 1; // Scalar signed INT32 to Single-FP conversion -OptCategory[NN_vcvtss2sd] = 1; // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value -OptCategory[NN_vcvtss2si] = 1; // Scalar Single-FP to signed INT32 conversion -OptCategory[NN_vcvttpd2dq] = 1; // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers -OptCategory[NN_vcvttps2dq] = 1; // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers -OptCategory[NN_vcvttsd2si] = 1; // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer -OptCategory[NN_vcvttss2si] = 1; // Scalar Single-FP to signed INT32 conversion (truncate) -OptCategory[NN_vdivpd] = 1; // Divide Packed Double-Precision Floating-Point Values -OptCategory[NN_vdivps] = 1; // Packed Single-FP Divide -OptCategory[NN_vdivsd] = 1; // Divide Scalar Double-Precision Floating-Point Values -OptCategory[NN_vdivss] = 1; // Scalar Single-FP Divide -OptCategory[NN_vdppd] = 1; // Dot Product of Packed Double Precision Floating-Point Values -OptCategory[NN_vdpps] = 1; // Dot Product of Packed Single Precision Floating-Point Values -OptCategory[NN_vextractf128] = 1; // Extract Packed Floating-Point Values -OptCategory[NN_vextracti128] = 1; // Extract Packed Integer Values -OptCategory[NN_vextractps] = 1; // Extract Packed Floating-Point Values -OptCategory[NN_vfmadd132pd] = 1; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfmadd132ps] = 1; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfmadd132sd] = 1; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values -OptCategory[NN_vfmadd132ss] = 1; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values -OptCategory[NN_vfmadd213pd] = 1; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfmadd213ps] = 1; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfmadd213sd] = 1; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values -OptCategory[NN_vfmadd213ss] = 1; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values -OptCategory[NN_vfmadd231pd] = 1; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfmadd231ps] = 1; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfmadd231sd] = 1; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values -OptCategory[NN_vfmadd231ss] = 1; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values -OptCategory[NN_vfmaddsub132pd] = 1; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfmaddsub132ps] = 1; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfmaddsub213pd] = 1; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfmaddsub213ps] = 1; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfmaddsub231pd] = 1; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfmaddsub231ps] = 1; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfmsub132pd] = 1; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfmsub132ps] = 1; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfmsub132sd] = 1; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values -OptCategory[NN_vfmsub132ss] = 1; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values -OptCategory[NN_vfmsub213pd] = 1; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfmsub213ps] = 1; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfmsub213sd] = 1; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values -OptCategory[NN_vfmsub213ss] = 1; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values -OptCategory[NN_vfmsub231pd] = 1; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfmsub231ps] = 1; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfmsub231sd] = 1; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values -OptCategory[NN_vfmsub231ss] = 1; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values -OptCategory[NN_vfmsubadd132pd] = 1; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfmsubadd132ps] = 1; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfmsubadd213pd] = 1; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfmsubadd213ps] = 1; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfmsubadd231pd] = 1; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfmsubadd231ps] = 1; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfnmadd132pd] = 1; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfnmadd132ps] = 1; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfnmadd132sd] = 1; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values -OptCategory[NN_vfnmadd132ss] = 1; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values -OptCategory[NN_vfnmadd213pd] = 1; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfnmadd213ps] = 1; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfnmadd213sd] = 1; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values -OptCategory[NN_vfnmadd213ss] = 1; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values -OptCategory[NN_vfnmadd231pd] = 1; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfnmadd231ps] = 1; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfnmadd231sd] = 1; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values -OptCategory[NN_vfnmadd231ss] = 1; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values -OptCategory[NN_vfnmsub132pd] = 1; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfnmsub132ps] = 1; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfnmsub132sd] = 1; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values -OptCategory[NN_vfnmsub132ss] = 1; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values -OptCategory[NN_vfnmsub213pd] = 1; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfnmsub213ps] = 1; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfnmsub213sd] = 1; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values -OptCategory[NN_vfnmsub213ss] = 1; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values -OptCategory[NN_vfnmsub231pd] = 1; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values -OptCategory[NN_vfnmsub231ps] = 1; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values -OptCategory[NN_vfnmsub231sd] = 1; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values -OptCategory[NN_vfnmsub231ss] = 1; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values -OptCategory[NN_vgatherdps] = 1; // Gather Packed SP FP Values Using Signed Dword Indices -OptCategory[NN_vgatherdpd] = 1; // Gather Packed DP FP Values Using Signed Dword Indices -OptCategory[NN_vgatherqps] = 1; // Gather Packed SP FP Values Using Signed Qword Indices -OptCategory[NN_vgatherqpd] = 1; // Gather Packed DP FP Values Using Signed Qword Indices -OptCategory[NN_vhaddpd] = 1; // Add horizontally packed DP FP numbers -OptCategory[NN_vhaddps] = 1; // Add horizontally packed SP FP numbers -OptCategory[NN_vhsubpd] = 1; // Sub horizontally packed DP FP numbers -OptCategory[NN_vhsubps] = 1; // Sub horizontally packed SP FP numbers -OptCategory[NN_vinsertf128] = 1; // Insert Packed Floating-Point Values -OptCategory[NN_vinserti128] = 1; // Insert Packed Integer Values -OptCategory[NN_vinsertps] = 1; // Insert Packed Single Precision Floating-Point Value -OptCategory[NN_vlddqu] = 1; // Load Unaligned Packed Integer Values -OptCategory[NN_vldmxcsr] = 1; // Load Streaming SIMD Extensions Technology Control/Status Register -OptCategory[NN_vmaskmovdqu] = 9; // Store Selected Bytes of Double Quadword with NT Hint -OptCategory[NN_vmaskmovpd] = 9; // Conditionally Load Packed Double-Precision Floating-Point Values -OptCategory[NN_vmaskmovps] = 9; // Conditionally Load Packed Single-Precision Floating-Point Values -OptCategory[NN_vmaxpd] = 1; // Return Maximum Packed Double-Precision Floating-Point Values -OptCategory[NN_vmaxps] = 1; // Packed Single-FP Maximum -OptCategory[NN_vmaxsd] = 1; // Return Maximum Scalar Double-Precision Floating-Point Value -OptCategory[NN_vmaxss] = 1; // Scalar Single-FP Maximum -OptCategory[NN_vminpd] = 1; // Return Minimum Packed Double-Precision Floating-Point Values -OptCategory[NN_vminps] = 1; // Packed Single-FP Minimum -OptCategory[NN_vminsd] = 1; // Return Minimum Scalar Double-Precision Floating-Point Value -OptCategory[NN_vminss] = 1; // Scalar Single-FP Minimum -OptCategory[NN_vmovapd] = 9; // Move Aligned Packed Double-Precision Floating-Point Values -OptCategory[NN_vmovaps] = 9; // Move Aligned Four Packed Single-FP -OptCategory[NN_vmovd] = 9; // Move 32 bits -OptCategory[NN_vmovddup] = 1; // Move One Double-FP and Duplicate -OptCategory[NN_vmovdqa] = 1; // Move Aligned Double Quadword -OptCategory[NN_vmovdqu] = 1; // Move Unaligned Double Quadword -OptCategory[NN_vmovhlps] = 1; // Move High to Low Packed Single-FP -OptCategory[NN_vmovhpd] = 1; // Move High Packed Double-Precision Floating-Point Values -OptCategory[NN_vmovhps] = 1; // Move High Packed Single-FP -OptCategory[NN_vmovlhps] = 1; // Move Low to High Packed Single-FP -OptCategory[NN_vmovlpd] = 1; // Move Low Packed Double-Precision Floating-Point Values -OptCategory[NN_vmovlps] = 1; // Move Low Packed Single-FP -OptCategory[NN_vmovmskpd] = 1; // Extract Packed Double-Precision Floating-Point Sign Mask -OptCategory[NN_vmovmskps] = 1; // Move Mask to Register -OptCategory[NN_vmovntdq] = 1; // Store Double Quadword Using Non-Temporal Hint -OptCategory[NN_vmovntdqa] = 1; // Load Double Quadword Non-Temporal Aligned Hint -OptCategory[NN_vmovntpd] = 1; // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint -OptCategory[NN_vmovntps] = 1; // Move Aligned Four Packed Single-FP Non Temporal -OptCategory[NN_vmovntsd] = 1; // Move Non-Temporal Scalar Double-Precision Floating-Point -OptCategory[NN_vmovntss] = 1; // Move Non-Temporal Scalar Single-Precision Floating-Point -OptCategory[NN_vmovq] = 1; // Move 64 bits -OptCategory[NN_vmovsd] = 1; // Move Scalar Double-Precision Floating-Point Values -OptCategory[NN_vmovshdup] = 1; // Move Packed Single-FP High and Duplicate -OptCategory[NN_vmovsldup] = 1; // Move Packed Single-FP Low and Duplicate -OptCategory[NN_vmovss] = 1; // Move Scalar Single-FP -OptCategory[NN_vmovupd] = 1; // Move Unaligned Packed Double-Precision Floating-Point Values -OptCategory[NN_vmovups] = 1; // Move Unaligned Four Packed Single-FP -OptCategory[NN_vmpsadbw] = 1; // Compute Multiple Packed Sums of Absolute Difference -OptCategory[NN_vmulpd] = 1; // Multiply Packed Double-Precision Floating-Point Values -OptCategory[NN_vmulps] = 1; // Packed Single-FP Multiply -OptCategory[NN_vmulsd] = 1; // Multiply Scalar Double-Precision Floating-Point Values -OptCategory[NN_vmulss] = 1; // Scalar Single-FP Multiply -OptCategory[NN_vorpd] = 1; // Bitwise Logical OR of Double-Precision Floating-Point Values -OptCategory[NN_vorps] = 1; // Bitwise Logical OR for Single-FP Data -OptCategory[NN_vpabsb] = 1; // Packed Absolute Value Byte -OptCategory[NN_vpabsd] = 1; // Packed Absolute Value Doubleword -OptCategory[NN_vpabsw] = 1; // Packed Absolute Value Word -OptCategory[NN_vpackssdw] = 1; // Pack with Signed Saturation (Dword->Word) -OptCategory[NN_vpacksswb] = 1; // Pack with Signed Saturation (Word->Byte) -OptCategory[NN_vpackusdw] = 1; // Pack with Unsigned Saturation -OptCategory[NN_vpackuswb] = 1; // Pack with Unsigned Saturation (Word->Byte) -OptCategory[NN_vpaddb] = 1; // Packed Add Byte -OptCategory[NN_vpaddd] = 1; // Packed Add Dword -OptCategory[NN_vpaddq] = 1; // Add Packed Quadword Integers -OptCategory[NN_vpaddsb] = 1; // Packed Add with Saturation (Byte) -OptCategory[NN_vpaddsw] = 1; // Packed Add with Saturation (Word) -OptCategory[NN_vpaddusb] = 1; // Packed Add Unsigned with Saturation (Byte) -OptCategory[NN_vpaddusw] = 1; // Packed Add Unsigned with Saturation (Word) -OptCategory[NN_vpaddw] = 1; // Packed Add Word -OptCategory[NN_vpalignr] = 1; // Packed Align Right -OptCategory[NN_vpand] = 1; // Bitwise Logical And -OptCategory[NN_vpandn] = 1; // Bitwise Logical And Not -OptCategory[NN_vpavgb] = 1; // Packed Average (Byte) -OptCategory[NN_vpavgw] = 1; // Packed Average (Word) -OptCategory[NN_vpblendd] = 1; // Blend Packed Dwords -OptCategory[NN_vpblendvb] = 1; // Variable Blend Packed Bytes -OptCategory[NN_vpblendw] = 1; // Blend Packed Words -OptCategory[NN_vpbroadcastb] = 1; // Broadcast a Byte Integer -OptCategory[NN_vpbroadcastd] = 1; // Broadcast a Dword Integer -OptCategory[NN_vpbroadcastq] = 1; // Broadcast a Qword Integer -OptCategory[NN_vpbroadcastw] = 1; // Broadcast a Word Integer -OptCategory[NN_vpclmulqdq] = 1; // Carry-Less Multiplication Quadword -OptCategory[NN_vpcmpeqb] = 1; // Packed Compare for Equal (Byte) -OptCategory[NN_vpcmpeqd] = 1; // Packed Compare for Equal (Dword) -OptCategory[NN_vpcmpeqq] = 1; // Compare Packed Qword Data for Equal -OptCategory[NN_vpcmpeqw] = 1; // Packed Compare for Equal (Word) -OptCategory[NN_vpcmpestri] = 1; // Packed Compare Explicit Length Strings, Return Index -OptCategory[NN_vpcmpestrm] = 1; // Packed Compare Explicit Length Strings, Return Mask -OptCategory[NN_vpcmpgtb] = 1; // Packed Compare for Greater Than (Byte) -OptCategory[NN_vpcmpgtd] = 1; // Packed Compare for Greater Than (Dword) -OptCategory[NN_vpcmpgtq] = 1; // Compare Packed Data for Greater Than -OptCategory[NN_vpcmpgtw] = 1; // Packed Compare for Greater Than (Word) -OptCategory[NN_vpcmpistri] = 1; // Packed Compare Implicit Length Strings, Return Index -OptCategory[NN_vpcmpistrm] = 1; // Packed Compare Implicit Length Strings, Return Mask -OptCategory[NN_vperm2f128] = 1; // Permute Floating-Point Values -OptCategory[NN_vperm2i128] = 1; // Permute Integer Values -OptCategory[NN_vpermd] = 1; // Full Doublewords Element Permutation -OptCategory[NN_vpermilpd] = 1; // Permute Double-Precision Floating-Point Values -OptCategory[NN_vpermilps] = 1; // Permute Single-Precision Floating-Point Values -OptCategory[NN_vpermpd] = 1; // Permute Double-Precision Floating-Point Elements -OptCategory[NN_vpermps] = 1; // Permute Single-Precision Floating-Point Elements -OptCategory[NN_vpermq] = 1; // Qwords Element Permutation -OptCategory[NN_vpextrb] = 1; // Extract Byte -OptCategory[NN_vpextrd] = 1; // Extract Dword -OptCategory[NN_vpextrq] = 1; // Extract Qword -OptCategory[NN_vpextrw] = 1; // Extract Word -OptCategory[NN_vpgatherdd] = 1; // Gather Packed Dword Values Using Signed Dword Indices -OptCategory[NN_vpgatherdq] = 1; // Gather Packed Qword Values Using Signed Dword Indices -OptCategory[NN_vpgatherqd] = 1; // Gather Packed Dword Values Using Signed Qword Indices -OptCategory[NN_vpgatherqq] = 1; // Gather Packed Qword Values Using Signed Qword Indices -OptCategory[NN_vphaddd] = 1; // Packed Horizontal Add Doubleword -OptCategory[NN_vphaddsw] = 1; // Packed Horizontal Add and Saturate -OptCategory[NN_vphaddw] = 1; // Packed Horizontal Add Word -OptCategory[NN_vphminposuw] = 1; // Packed Horizontal Word Minimum -OptCategory[NN_vphsubd] = 1; // Packed Horizontal Subtract Doubleword -OptCategory[NN_vphsubsw] = 1; // Packed Horizontal Subtract and Saturate -OptCategory[NN_vphsubw] = 1; // Packed Horizontal Subtract Word -OptCategory[NN_vpinsrb] = 1; // Insert Byte -OptCategory[NN_vpinsrd] = 1; // Insert Dword -OptCategory[NN_vpinsrq] = 1; // Insert Qword -OptCategory[NN_vpinsrw] = 1; // Insert Word -OptCategory[NN_vpmaddubsw] = 1; // Multiply and Add Packed Signed and Unsigned Bytes -OptCategory[NN_vpmaddwd] = 1; // Packed Multiply and Add -OptCategory[NN_vpmaskmovd] = 1; // Conditionally Store Dword Values Using Mask -OptCategory[NN_vpmaskmovq] = 1; // Conditionally Store Qword Values Using Mask -OptCategory[NN_vpmaxsb] = 1; // Maximum of Packed Signed Byte Integers -OptCategory[NN_vpmaxsd] = 1; // Maximum of Packed Signed Dword Integers -OptCategory[NN_vpmaxsw] = 1; // Packed Signed Integer Word Maximum -OptCategory[NN_vpmaxub] = 1; // Packed Unsigned Integer Byte Maximum -OptCategory[NN_vpmaxud] = 1; // Maximum of Packed Unsigned Dword Integers -OptCategory[NN_vpmaxuw] = 1; // Maximum of Packed Word Integers -OptCategory[NN_vpminsb] = 1; // Minimum of Packed Signed Byte Integers -OptCategory[NN_vpminsd] = 1; // Minimum of Packed Signed Dword Integers -OptCategory[NN_vpminsw] = 1; // Packed Signed Integer Word Minimum -OptCategory[NN_vpminub] = 1; // Packed Unsigned Integer Byte Minimum -OptCategory[NN_vpminud] = 1; // Minimum of Packed Unsigned Dword Integers -OptCategory[NN_vpminuw] = 1; // Minimum of Packed Word Integers -OptCategory[NN_vpmovmskb] = 1; // Move Byte Mask to Integer -OptCategory[NN_vpmovsxbd] = 1; // Packed Move with Sign Extend -OptCategory[NN_vpmovsxbq] = 1; // Packed Move with Sign Extend -OptCategory[NN_vpmovsxbw] = 1; // Packed Move with Sign Extend -OptCategory[NN_vpmovsxdq] = 1; // Packed Move with Sign Extend -OptCategory[NN_vpmovsxwd] = 1; // Packed Move with Sign Extend -OptCategory[NN_vpmovsxwq] = 1; // Packed Move with Sign Extend -OptCategory[NN_vpmovzxbd] = 1; // Packed Move with Zero Extend -OptCategory[NN_vpmovzxbq] = 1; // Packed Move with Zero Extend -OptCategory[NN_vpmovzxbw] = 1; // Packed Move with Zero Extend -OptCategory[NN_vpmovzxdq] = 1; // Packed Move with Zero Extend -OptCategory[NN_vpmovzxwd] = 1; // Packed Move with Zero Extend -OptCategory[NN_vpmovzxwq] = 1; // Packed Move with Zero Extend -OptCategory[NN_vpmuldq] = 1; // Multiply Packed Signed Dword Integers -OptCategory[NN_vpmulhrsw] = 1; // Packed Multiply High with Round and Scale -OptCategory[NN_vpmulhuw] = 1; // Packed Multiply High Unsigned -OptCategory[NN_vpmulhw] = 1; // Packed Multiply High -OptCategory[NN_vpmulld] = 1; // Multiply Packed Signed Dword Integers and Store Low Result -OptCategory[NN_vpmullw] = 1; // Packed Multiply Low -OptCategory[NN_vpmuludq] = 1; // Multiply Packed Unsigned Doubleword Integers -OptCategory[NN_vpor] = 1; // Bitwise Logical Or -OptCategory[NN_vpsadbw] = 1; // Packed Sum of Absolute Differences -OptCategory[NN_vpshufb] = 1; // Packed Shuffle Bytes -OptCategory[NN_vpshufd] = 1; // Shuffle Packed Doublewords -OptCategory[NN_vpshufhw] = 1; // Shuffle Packed High Words -OptCategory[NN_vpshuflw] = 1; // Shuffle Packed Low Words -OptCategory[NN_vpsignb] = 1; // Packed SIGN Byte -OptCategory[NN_vpsignd] = 1; // Packed SIGN Doubleword -OptCategory[NN_vpsignw] = 1; // Packed SIGN Word -OptCategory[NN_vpslld] = 1; // Packed Shift Left Logical (Dword) -OptCategory[NN_vpslldq] = 1; // Shift Double Quadword Left Logical -OptCategory[NN_vpsllq] = 1; // Packed Shift Left Logical (Qword) -OptCategory[NN_vpsllvd] = 1; // Variable Bit Shift Left Logical (Dword) -OptCategory[NN_vpsllvq] = 1; // Variable Bit Shift Left Logical (Qword) -OptCategory[NN_vpsllw] = 1; // Packed Shift Left Logical (Word) -OptCategory[NN_vpsrad] = 1; // Packed Shift Right Arithmetic (Dword) -OptCategory[NN_vpsravd] = 1; // Variable Bit Shift Right Arithmetic -OptCategory[NN_vpsraw] = 1; // Packed Shift Right Arithmetic (Word) -OptCategory[NN_vpsrld] = 1; // Packed Shift Right Logical (Dword) -OptCategory[NN_vpsrldq] = 1; // Shift Double Quadword Right Logical (Qword) -OptCategory[NN_vpsrlq] = 1; // Packed Shift Right Logical (Qword) -OptCategory[NN_vpsrlvd] = 1; // Variable Bit Shift Right Logical (Dword) -OptCategory[NN_vpsrlvq] = 1; // Variable Bit Shift Right Logical (Qword) -OptCategory[NN_vpsrlw] = 1; // Packed Shift Right Logical (Word) -OptCategory[NN_vpsubb] = 1; // Packed Subtract Byte -OptCategory[NN_vpsubd] = 1; // Packed Subtract Dword -OptCategory[NN_vpsubq] = 1; // Subtract Packed Quadword Integers -OptCategory[NN_vpsubsb] = 1; // Packed Subtract with Saturation (Byte) -OptCategory[NN_vpsubsw] = 1; // Packed Subtract with Saturation (Word) -OptCategory[NN_vpsubusb] = 1; // Packed Subtract Unsigned with Saturation (Byte) -OptCategory[NN_vpsubusw] = 1; // Packed Subtract Unsigned with Saturation (Word) -OptCategory[NN_vpsubw] = 1; // Packed Subtract Word -OptCategory[NN_vptest] = 1; // Logical Compare -OptCategory[NN_vpunpckhbw] = 1; // Unpack High Packed Data (Byte->Word) -OptCategory[NN_vpunpckhdq] = 1; // Unpack High Packed Data (Dword->Qword) -OptCategory[NN_vpunpckhqdq] = 1; // Unpack High Packed Data (Qword->Xmmword) -OptCategory[NN_vpunpckhwd] = 1; // Unpack High Packed Data (Word->Dword) -OptCategory[NN_vpunpcklbw] = 1; // Unpack Low Packed Data (Byte->Word) -OptCategory[NN_vpunpckldq] = 1; // Unpack Low Packed Data (Dword->Qword) -OptCategory[NN_vpunpcklqdq] = 1; // Unpack Low Packed Data (Qword->Xmmword) -OptCategory[NN_vpunpcklwd] = 1; // Unpack Low Packed Data (Word->Dword) -OptCategory[NN_vpxor] = 1; // Bitwise Logical Exclusive Or -OptCategory[NN_vrcpps] = 1; // Packed Single-FP Reciprocal -OptCategory[NN_vrcpss] = 1; // Scalar Single-FP Reciprocal -OptCategory[NN_vroundpd] = 1; // Round Packed Double Precision Floating-Point Values -OptCategory[NN_vroundps] = 1; // Round Packed Single Precision Floating-Point Values -OptCategory[NN_vroundsd] = 1; // Round Scalar Double Precision Floating-Point Values -OptCategory[NN_vroundss] = 1; // Round Scalar Single Precision Floating-Point Values -OptCategory[NN_vrsqrtps] = 1; // Packed Single-FP Square Root Reciprocal -OptCategory[NN_vrsqrtss] = 1; // Scalar Single-FP Square Root Reciprocal -OptCategory[NN_vshufpd] = 1; // Shuffle Packed Double-Precision Floating-Point Values -OptCategory[NN_vshufps] = 1; // Shuffle Single-FP -OptCategory[NN_vsqrtpd] = 1; // Compute Square Roots of Packed Double-Precision Floating-Point Values -OptCategory[NN_vsqrtps] = 1; // Packed Single-FP Square Root -OptCategory[NN_vsqrtsd] = 1; // Compute Square Rootof Scalar Double-Precision Floating-Point Value -OptCategory[NN_vsqrtss] = 1; // Scalar Single-FP Square Root -OptCategory[NN_vstmxcsr] = 1; // Store Streaming SIMD Extensions Technology Control/Status Register -OptCategory[NN_vsubpd] = 1; // Subtract Packed Double-Precision Floating-Point Values -OptCategory[NN_vsubps] = 1; // Packed Single-FP Subtract -OptCategory[NN_vsubsd] = 1; // Subtract Scalar Double-Precision Floating-Point Values -OptCategory[NN_vsubss] = 1; // Scalar Single-FP Subtract -OptCategory[NN_vtestpd] = 1; // Packed Double-Precision Floating-Point Bit Test -OptCategory[NN_vtestps] = 1; // Packed Single-Precision Floating-Point Bit Test -OptCategory[NN_vucomisd] = 1; // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS -OptCategory[NN_vucomiss] = 1; // Scalar Unordered Single-FP Compare and Set EFLAGS -OptCategory[NN_vunpckhpd] = 1; // Unpack and Interleave High Packed Double-Precision Floating-Point Values -OptCategory[NN_vunpckhps] = 1; // Unpack High Packed Single-FP Data -OptCategory[NN_vunpcklpd] = 1; // Unpack and Interleave Low Packed Double-Precision Floating-Point Values -OptCategory[NN_vunpcklps] = 1; // Unpack Low Packed Single-FP Data -OptCategory[NN_vxorpd] = 1; // Bitwise Logical OR of Double-Precision Floating-Point Values -OptCategory[NN_vxorps] = 1; // Bitwise Logical XOR for Single-FP Data -OptCategory[NN_vzeroall] = 1; // Zero All YMM Registers -OptCategory[NN_vzeroupper] = 1; // Zero Upper Bits of YMM Registers - -// Transactional Synchronization Extensions - -OptCategory[NN_xabort] = 1; // Transaction Abort -OptCategory[NN_xbegin] = 1; // Transaction Begin -OptCategory[NN_xend] = 1; // Transaction End -OptCategory[NN_xtest] = 1; // Test If In Transactional Execution - -// Virtual PC synthetic instructions - -OptCategory[NN_vmgetinfo] = 1; // Virtual PC - Get VM Information -OptCategory[NN_vmsetinfo] = 1; // Virtual PC - Set VM Information -OptCategory[NN_vmdxdsbl] = 1; // Virtual PC - Disable Direct Execution -OptCategory[NN_vmdxenbl] = 1; // Virtual PC - Enable Direct Execution -OptCategory[NN_vmcpuid] = 1; // Virtual PC - Virtualized CPU Information -OptCategory[NN_vmhlt] = 1; // Virtual PC - Halt -OptCategory[NN_vmsplaf] = 1; // Virtual PC - Spin Lock Acquisition Failed -OptCategory[NN_vmpushfd] = 1; // Virtual PC - Push virtualized flags register -OptCategory[NN_vmpopfd] = 1; // Virtual PC - Pop virtualized flags register -OptCategory[NN_vmcli] = 1; // Virtual PC - Clear Interrupt Flag -OptCategory[NN_vmsti] = 1; // Virtual PC - Set Interrupt Flag -OptCategory[NN_vmiretd] = 1; // Virtual PC - Return From Interrupt -OptCategory[NN_vmsgdt] = 1; // Virtual PC - Store Global Descriptor Table -OptCategory[NN_vmsidt] = 1; // Virtual PC - Store Interrupt Descriptor Table -OptCategory[NN_vmsldt] = 1; // Virtual PC - Store Local Descriptor Table -OptCategory[NN_vmstr] = 1; // Virtual PC - Store Task Register -OptCategory[NN_vmsdte] = 1; // Virtual PC - Store to Descriptor Table Entry -OptCategory[NN_vpcext] = 1; // Virtual PC - ISA extension - -#endif // 599 < IDA_SDK_VERSION - -OptCategory[NN_last] = 1; - - return; - -} // end InitOptCategory() - -// Initialize the StackAlteration[] array to define how opcodes -// adjust the stack pointer. -void InitStackAlteration(void) { - // Default category is 0; most instructions do not alter the stack pointer. - (void) memset(StackAlteration, 0, sizeof(StackAlteration)); - - // Many arithmetic instructions could alter the stack pointer. We will have to - // examine each instruction that performs addition, subtraction, logical AND, etc., - // to determine if the stack pointer was the DEF operand. We cannot use a purely - // table driven approach to compute stack pointer alteration. The table is used for - // the deterministic cases, e.g. push, pop, call, return. Because of variability on - // a few of these instructions, a value of 1 in the table below is a trigger to investigate RTLs - // that might or might not alter the stack pointer, e.g. add, subtract, etc., or that might - // have operand-dependent effects on the stack pointer. - -StackAlteration[NN_add] = 1; // Addition; check operands for stack pointer -StackAlteration[NN_adc] = 1; // Addition; check operands for stack pointer ; RARE for stack pointer -StackAlteration[NN_and] = 1; // Logical AND; check operands for stack pointer -StackAlteration[NN_call] = -((sval_t) STARS_ISA_Bytewidth); // Call Procedure; -4, but return cancels it to zero -StackAlteration[NN_callfi] = -2 * ((sval_t) STARS_ISA_Bytewidth); // Indirect Call Far Procedure; -8, but far return cancels it to zero -StackAlteration[NN_callni] = -((sval_t) STARS_ISA_Bytewidth); // Indirect Call Near Procedure; -4, but return cancels it to zero -StackAlteration[NN_enterw] = 1; // Make Stack Frame for Procedure Parameters ** -StackAlteration[NN_enter] = 1; // Make Stack Frame for Procedure Parameters ** -StackAlteration[NN_enterd] = 1; // Make Stack Frame for Procedure Parameters ** -StackAlteration[NN_enterq] = 1; // Make Stack Frame for Procedure Parameters ** -StackAlteration[NN_int] = 0; // Call to Interrupt Procedure -StackAlteration[NN_into] = 0; // Call to Interrupt Procedure if Overflow Flag = 1 -StackAlteration[NN_int3] = 0; // Trap to Debugger -StackAlteration[NN_iretw] = 6; // Interrupt Return -StackAlteration[NN_iret] = 12; // Interrupt Return -StackAlteration[NN_iretd] = 12; // Interrupt Return (use32) -StackAlteration[NN_iretq] = 40; // Interrupt Return (use64) -StackAlteration[NN_lea] = 1; // Load Effective Address (can be used for basic arithmetic assignments) -StackAlteration[NN_leavew] = 1; // High Level Procedure Exit ** -StackAlteration[NN_leave] = 1; // High Level Procedure Exit ** -StackAlteration[NN_leaved] = 1; // High Level Procedure Exit ** -StackAlteration[NN_leaveq] = 1; // High Level Procedure Exit ** -StackAlteration[NN_mov] = 1; // Move Data ; could be esp := ebp (deallocate stack frame) or esp := ebx (unknown) -StackAlteration[NN_pop] = 1; // Pop a word from the Stack ; could be 16-bit or 32-bit operand, etc. -StackAlteration[NN_popaw] = 14; // Pop all General Registers -StackAlteration[NN_popa] = 28; // Pop all General Registers -StackAlteration[NN_popad] = 28; // Pop all General Registers (use32) -StackAlteration[NN_popaq] = 56; // Pop all General Registers (use64) -StackAlteration[NN_popfw] = 2; // Pop Stack into Flags Register ** -StackAlteration[NN_popf] = 4; // Pop Stack into Flags Register ** -StackAlteration[NN_popfd] = 4; // Pop Stack into Eflags Register ** -StackAlteration[NN_popfq] = 8; // Pop Stack into Rflags Register ** -StackAlteration[NN_push] = 1; // Push Operand onto the Stack ; could be 16-bit or 32-bit operand, etc. -StackAlteration[NN_pushaw] = -14; // Push all General Registers -StackAlteration[NN_pusha] = -28; // Push all General Registers -StackAlteration[NN_pushad] = -28; // Push all General Registers (use32) -StackAlteration[NN_pushaq] = -56; // Push all General Registers (use64) -StackAlteration[NN_pushfw] = -2; // Push Flags Register onto the Stack -StackAlteration[NN_pushf] = -4; // Push Flags Register onto the Stack -StackAlteration[NN_pushfd] = -4; // Push Flags Register onto the Stack (use32) -StackAlteration[NN_pushfq] = -8; // Push Flags Register onto the Stack (use64) -StackAlteration[NN_retn] = 1; // Return Near from Procedure (usually 4 bytes) -StackAlteration[NN_retf] = 1; // Return Far from Procedure (usually 8 bytes) -StackAlteration[NN_sub] = 1; // Subtraction; check operands for stack pointer -StackAlteration[NN_sbb] = 1; // Subtraction; check operands for stack pointer ; RARE for stack pointer - -// -// 486 instructions -// - - -// -// Pentium instructions -// - - -// -// Pentium Pro instructions -// - - -// -// FPP instructions -// - - -// -// 80387 instructions -// - -// -// Instructions added 28.02.96 -// - -StackAlteration[NN_loadall] = 0; // Load the entire CPU state from ES:EDI ?? Cannot find in Intel manuals - -// -// MMX instructions -// - - -// -// Undocumented Deschutes processor instructions -// - -// Pentium II instructions - -StackAlteration[NN_sysenter] = 0; // Fast Transition to System Call Entry Point -StackAlteration[NN_sysexit] = 0; // Fast Transition from System Call Entry Point - -// 3DNow! instructions - - -// Pentium III instructions - - -// Pentium III Pseudo instructions - -// AMD K7 instructions - -// Revisit AMD if we port to it. - -// Undocumented FP instructions (thanks to norbert.juffa@adm.com) - -// Pentium 4 instructions - - -// AMD syscall/sysret instructions NOTE: not AMD, found in Intel manual - -StackAlteration[NN_syscall] = 0; // Low latency system call -StackAlteration[NN_sysret] = 0; // Return from system call - -// AMD64 instructions NOTE: not AMD, found in Intel manual - -// New Pentium instructions (SSE3) - - -// Missing AMD64 instructions NOTE: also found in Intel manual - -// SSE3 instructions - -// SSSE3 instructions - - -// VMX instructions - -#if 599 < IDA_SDK_VERSION - -// Added with x86-64 - -// Geode LX 3DNow! extensions - -// SSE2 pseudoinstructions - - -// SSSE4.1 instructions - - -// SSSE4.2 instructions - -// AMD SSE4a instructions - -// xsave/xrstor instructions - -// Intel Safer Mode Extensions (SMX) - -// AMD-V Virtualization ISA Extension - -// VMX+ instructions - -// Intel Atom instructions - -// Intel AES instructions - -// Carryless multiplication - -// Returns modified by operand size prefixes - -StackAlteration[NN_retnw] = 1; // Return Near from Procedure (use16) -StackAlteration[NN_retnd] = 1; // Return Near from Procedure (use32) -StackAlteration[NN_retnq] = 1; // Return Near from Procedure (use64) -StackAlteration[NN_retfw] = 1; // Return Far from Procedure (use16) -StackAlteration[NN_retfd] = 1; // Return Far from Procedure (use32) -StackAlteration[NN_retfq] = 1; // Return Far from Procedure (use64) - -// RDRAND support - -// new GPR instructions - -// new AVX instructions - -// Transactional Synchronization Extensions - -// Virtual PC synthetic instructions - -#endif // 599 < IDA_SDK_VERSION - -StackAlteration[NN_last] = 0; - - return; - -} // end InitStackAlteration() - diff --git a/src/interfaces/abstract/Makefile.in b/src/interfaces/abstract/Makefile.in index ab34b722..8bc9624e 100644 --- a/src/interfaces/abstract/Makefile.in +++ b/src/interfaces/abstract/Makefile.in @@ -1,5 +1,5 @@ -OBJS=STARSInstruction.o +OBJS=STARSProgram.o STARSInstruction.o CXX=@CXX@ LD=@LD@ EXTRA_CXXFLAGS=@EXTRA_CXXFLAGS@ diff --git a/src/interfaces/abstract/STARSProgram.cpp b/src/interfaces/abstract/STARSProgram.cpp new file mode 100644 index 00000000..9c3711d5 --- /dev/null +++ b/src/interfaces/abstract/STARSProgram.cpp @@ -0,0 +1,5276 @@ +/* STARSProgram.cpp: Base class + * Copyright 2015 by Zephyr Software LLC + */ + +#include "interfaces/STARSTypes.h" +#include "interfaces/SMPDBInterface.h" +// #include "interfaces/abstract/all.h" +#include "base/SMPDataFlowAnalysis.h" + +using namespace std; + +// Data initialization +bool STARS_Program_t::OpenFiles(void) { + string ZSTAlarmFileName(this->GetRootFileName()); + string AlarmFileSuffix(".alarms"); + ZSTAlarmFileName += AlarmFileSuffix; + string XrefsFileName(this->GetRootFileName()); + string XrefsFileSuffix(".STARSxrefs"); + XrefsFileName += XrefsFileSuffix; + string CallRetFileName(this->GetRootFileName()); + string CallRetFileSuffix(".STARScallreturn"); + CallRetFileName += CallRetFileSuffix; +#if ZST_EMIT_SPARK_ADA_TRANSLATION + string SPARKSourceFileName(this->GetRootFileName()); + string SPARKSourceFileSuffix(".ZSTSPARK.adb"); + SPARKSourceFileName += SPARKSourceFileSuffix; + string SPARKHeaderFileName(this->GetRootFileName()); + string SPARKHeaderFileSuffix(".ZSTSPARK.ads"); + SPARKHeaderFileName += SPARKHeaderFileSuffix; +#endif + + this->STARS_XrefsFile = SMP_fopen(XrefsFileName.c_str(), "w"); + if (NULL == this->STARS_XrefsFile) { + error("FATAL ERROR: Cannot open STARS code xrefs file %s\n", XrefsFileName.c_str()); + return false; + } + + this->STARS_CallReturnFile = SMP_fopen(CallRetFileName.c_str(), "w"); + if (NULL == this->STARS_CallReturnFile) { + error("FATAL ERROR: Cannot open STARS calls and returns info file %s\n", CallRetFileName.c_str()); + (void)SMP_fclose(this->STARS_XrefsFile); + return false; + } + + this->ZST_AlarmFile = SMP_fopen(ZSTAlarmFileName.c_str(), "w"); + if (NULL == this->ZST_AlarmFile) { + error("FATAL ERROR: Cannot open security alarms file %s\n", ZSTAlarmFileName.c_str()); + SMP_fclose(this->STARS_XrefsFile); + SMP_fclose(this->STARS_CallReturnFile); + return false; + } + +#if ZST_EMIT_SPARK_ADA_TRANSLATION + this->ZST_SPARKSourceFile = SMP_fopen(SPARKSourceFileName.c_str(), "w"); + if (NULL == this->ZST_SPARKSourceFile) { + error("FATAL ERROR: Cannot open SPARK-Ada source output file %s\n", SPARKSourceFileName.c_str()); + SMP_fclose(this->STARS_XrefsFile); + SMP_fclose(this->STARS_CallReturnFile); + SMP_fclose(this->ZST_AlarmFile); + return false; + } + this->ZST_SPARKHeaderFile = SMP_fopen(SPARKHeaderFileName.c_str(), "w"); + if (NULL == this->ZST_SPARKHeaderFile) { + error("FATAL ERROR: Cannot open SPARK-Ada header output file %s\n", SPARKHeaderFileName.c_str()); + SMP_fclose(this->STARS_XrefsFile); + SMP_fclose(this->STARS_CallReturnFile); + SMP_fclose(this->ZST_AlarmFile); + SMP_fclose(this->ZST_SPARKSourceFile); + return false; + } +#endif + return true; +} // end of STARS_Program_t::OpenFiles() + +void STARS_Program_t::CloseFiles(void) { +#if ZST_EMIT_SPARK_ADA_TRANSLATION + (void) SMP_fclose(this->ZST_SPARKSourceFile); + (void) SMP_fclose(this->ZST_SPARKHeaderFile); +#endif + (void) SMP_fclose(this->ZST_AlarmFile); + (void) SMP_fclose(this->STARS_CallReturnFile); + (void) SMP_fclose(this->STARS_XrefsFile); + return; +} // end of STARS_Program_t::CloseFiles() + +void STARS_Program_t::InitData(void) { + this->ZST_AlarmFile = NULL; + this->STARS_CallReturnFile = NULL; + this->STARS_XrefsFile = NULL; + + // Initialize global counters for statistics-gathering purposes. + STARS_SPARK_IndentCount = 1; + UnusedStructCount = 0; + UnusedIntCount = 0; + DeadMetadataCount = 0; + LiveMetadataCount = 0; + ResolvedIndirectJumpCount = 0; + UnresolvedIndirectJumpCount = 0; + ConstantDEFCount = 0; + AlwaysTakenBranchCount = 0; + NeverTakenBranchCount = 0; + SubwordRegCount = 0; + SubwordMemCount = 0; + SubwordAddressRegCount = 0; + SPARKOperandCount = 0; +#if SMP_COUNT_MEMORY_ALLOCATIONS + SMPInstCount = 0; + SMPBlockCount = 0; + SMPDefUseChainCount = 0; + SMPFuncCount = 0; + SMPGlobalVarCount = 0; + SMPLocalVarCount = 0; + SMPInstBytes = 0; + SMPDefUseChainBytes = 0; +#endif +#if SMP_MEASURE_NUMERIC_ANNOTATIONS + NumericAnnotationsCount12 = 0; + NumericAnnotationsCount3 = 0; + TruncationAnnotationsCount = 0; + SignednessWithoutTruncationCount = 0; + LeaInstOverflowCount = 0; + WidthDoublingTruncationCount = 0; + BenignOverflowInstCount = 0; + BenignOverflowDefCount = 0; + SuppressStackPtrOverflowCount = 0; + SuppressLiveFlagsOverflowCount = 0; + LiveMultiplyBitsCount = 0; + BenignTruncationCount = 0; + SuppressTruncationRegPiecesAllUsed = 0; + SuppressSignednessOnTruncation = 0; +#endif +#if STARS_SCCP_GATHER_STATISTICS + SCCPFuncsWithArgWriteCount = 0; + SCCPFuncsWithConstantArgWriteCount = 0; + SCCPOutgoingArgWriteCount = 0; + SCCPConstantOutgoingArgWriteCount = 0; +#endif + STARS_MaxBlockCount = 0; + + (void) memset(this->OptCount, 0, sizeof(this->OptCount)); + (void) memset(this->AnnotationCount, 0, sizeof(this->AnnotationCount)); + this->STARS_PerformReducedAnalysis = false; + this->DataReferentID = 1; + this->STARS_TotalCodeSize = 0; + + this->InitOptCategory(); + this->InitStackAlteration(); + this->InitDFACategory(); + this->InitTypeCategory(); + this->InitSMPDefsFlags(); + this->InitSMPUsesFlags(); + this->InitLibFuncFGInfoMaps(); + InitIntegerErrorCallSinkMap(); + InitUnsignedArgPositionMap(); + InitTaintWarningArgPositionMap(); + InitPointerArgPositionMap(); + + return; +} // end of STARS_Program_t::InitData() + +// These two constants should agree with their counterparts in ZST-policy.c. +#define ZST_MAX_FILE_NAME_LEN 1024 +#define ZST_MAX_CALL_NAME_LEN 64 + +// Convert a call type string from the policy file, such as "FILECALLS", to the +// corresponding ZST_SysCallType, such as ZST_FILE_CALL. +ZST_SysCallType STARS_Program_t::ConvertStringToCallType(char *Str2) { + ZST_SysCallType ReturnVal; + if (0 == strcmp("PRIVILEGECALLS", Str2)) { + ReturnVal = ZST_HIGHPRIVILEGE_CALL; + } + else if (0 == strcmp("FILECALLS", Str2)) { + ReturnVal = ZST_FILE_CALL; + } + else if (0 == strcmp("NETWORKCALLS", Str2)) { + ReturnVal = ZST_NETWORK_CALL; + } + else { + ReturnVal = ZST_UNMONITORED_CALL; + } + return ReturnVal; +} // end of STARS_Program_t::ConvertStringToCallType() + +// Convert a policy string from the policy file, such as "DISALLOW", to +// the corresponding ZST_Policy value, such as ZST_DISALLOW. +ZST_Policy STARS_Program_t::ConvertStringToPolicy(char *Str3) { + ZST_Policy ReturnVal; + if (0 == strcmp("DISALLOW", Str3)) { + ReturnVal = ZST_DISALLOW; + } + else if (0 == strcmp("WHITELIST", Str3)) { + ReturnVal = ZST_WHITELIST; + } + else if (0 == strcmp("BLACKLIST", Str3)) { + ReturnVal = ZST_BLACKLIST; + } + else { // error handling precedes calls to this function + ReturnVal = ZST_ALLOWALL; + } + return ReturnVal; +} // end of STARS_Program_t::ConvertStringToPolicy() + +// Given a function name, return its Zephyr Security Toolkit call type. +ZST_SysCallType STARS_Program_t::GetCallTypeFromFuncName(string SysCallName) const { + ZST_SysCallType ReturnVal; + map<string, ZST_SysCallType>::const_iterator FindIter = this->ZST_FuncTypeMap.find(SysCallName); + if (FindIter == this->ZST_FuncTypeMap.end()) { // not found; might not even be system call + ReturnVal = ZST_UNMONITORED_CALL; + } + else { + ReturnVal = FindIter->second; + } + return ReturnVal; +} // end of GetCallTypeFromFuncName() + +// Get the user-specified security policy for the given call type. +ZST_Policy STARS_Program_t::GetPolicyFromCallType(ZST_SysCallType CallType) const { + ZST_Policy ReturnVal; + map<ZST_SysCallType, ZST_Policy>::const_iterator FindIter = ZST_TypePolicyMap.find(CallType); + if (FindIter == ZST_TypePolicyMap.end()) { + // Policy not found; default to ALLOW_ALL + ReturnVal = ZST_ALLOWALL; + } + else { + ReturnVal = FindIter->second; + } + return ReturnVal; +} // end of STARS_Program_t::GetPolicyFromCallType() + +// Given a call type and called function name, is it on the location whitelist +// for that call type? +// NOTE: HANDLE CASE IN WHICH WHITELISTED LOCATION IS A PREFIX, TERMINATING in a slash. +bool STARS_Program_t::IsLocationWhitelisted(ZST_SysCallType CallType, string LocationName) const { + set<string>::const_iterator FindIter; + bool ReturnVal; + + if (CallType == ZST_FILE_CALL) { + FindIter = ZST_FileLocWhitelist.find(LocationName); + ReturnVal = (FindIter != ZST_FileLocWhitelist.end()); + } + else if (CallType == ZST_NETWORK_CALL) { + FindIter = ZST_NetworkLocWhitelist.find(LocationName); + ReturnVal = (FindIter != ZST_NetworkLocWhitelist.end()); + } + else { // should not be here + ReturnVal = false; + } + return ReturnVal; +} // end of STARS_Program_t::IsLocationWhitelisted() + +// Given a call type and called function name, is it on the location blacklist +// for that call type? +// NOTE: HANDLE CASE IN WHICH BLACKLISTED LOCATION IS A PREFIX, TERMINATING in a slash. +bool STARS_Program_t::IsLocationBlacklisted(ZST_SysCallType CallType, string LocationName) const { + set<string>::const_iterator FindIter; + bool ReturnVal; + + if (CallType == ZST_FILE_CALL) { + FindIter = ZST_FileLocBlacklist.find(LocationName); + ReturnVal = (FindIter != ZST_FileLocBlacklist.end()); + } + else if (CallType == ZST_NETWORK_CALL) { + FindIter = ZST_NetworkLocBlacklist.find(LocationName); + ReturnVal = (FindIter != ZST_NetworkLocBlacklist.end()); + } + else { // should not be here + ReturnVal = false; + } + return ReturnVal; +} // end of STARS_Program_t::IsLocationBlacklisted() + +// Given a called function name, does it produce only benign numeric errors when +// its returned values are used in arithmetic? (i.e. it is a trusted input) +bool STARS_Program_t::IsNumericSafeSystemCall(string CallName) const { + set<string>::const_iterator FindIter = ZST_SystemCallNumericWhitelist.find(CallName); + bool ReturnVal = (FindIter != ZST_SystemCallNumericWhitelist.end()); + return ReturnVal; +} + +// Utility functions to print code xrefs to STARS_XrefsFile +void STARS_Program_t::PrintCodeToCodeXref(STARS_ea_t FromAddr, STARS_ea_t ToAddr, std::size_t InstrSize) { + SMP_fprintf(this->GetXrefsFile(), "%10lx %6zu INSTR XREF IBT FROMIB %10lx \n", + (unsigned long) ToAddr, InstrSize, (unsigned long) FromAddr); + return; +} + +void STARS_Program_t::PrintDataToCodeXref(STARS_ea_t FromDataAddr, STARS_ea_t ToCodeAddr, std::size_t InstrSize) { + SMP_fprintf(this->GetXrefsFile(), "%10lx %6zu INSTR XREF IBT FROMDATA %10lx \n", + (unsigned long) ToCodeAddr, InstrSize, (unsigned long) FromDataAddr); + return; +} + +// Read the foo.exe.policy file to initialize our security policies for system calls. +void STARS_Program_t::ZST_InitPolicies(void) { + string ZSTPolicyFileName(this->GetRootFileName()); + string PolicyFileSuffix(".policy"); + ZSTPolicyFileName += PolicyFileSuffix; + FILE *PolicyFile = SMP_fopen(ZSTPolicyFileName.c_str(), "r"); + char Str1[ZST_MAX_CALL_NAME_LEN], Str2[ZST_MAX_CALL_NAME_LEN], Str3[ZST_MAX_FILE_NAME_LEN]; + + string SafeSystemCall1("gettimeofday"); + this->ZST_SystemCallNumericWhitelist.insert(SafeSystemCall1); + + if (NULL != PolicyFile) { + while (!SMP_feof(PolicyFile)) { + int ItemsRead = qfscanf(PolicyFile, "%63s %63s %1023s", Str1, Str2, Str3); + if (3 != ItemsRead) { + SMP_msg("ERROR: Line in %s had %d items instead of the required 3; line ignored.\n", ZSTPolicyFileName.c_str(), ItemsRead); + } + else { + string ThirdStr(Str3); + pair<set<string>::iterator, bool> SetInsertResult; + if (0 == strcmp(Str1, "SECURITYPOLICY")) { + ZST_SysCallType TempCallType = ConvertStringToCallType(Str2); + ZST_Policy TempPolicy = ConvertStringToPolicy(Str3); + pair<map<ZST_SysCallType, ZST_Policy>::iterator, bool> InsertResult; + pair<ZST_SysCallType, ZST_Policy> TempPair(TempCallType, TempPolicy); + InsertResult = this->ZST_TypePolicyMap.insert(TempPair); + if (!(InsertResult.second)) { + SMP_msg("ERROR: Could not insert security policy %s for %s. Possible duplicate or conflicting policies.\n", + Str3, Str2); + } + } + else if (0 == strcmp(Str1, "FILELOCATION")) { + if (0 == strcmp(Str2, "WHITELIST")) { + SetInsertResult = this->ZST_FileLocWhitelist.insert(ThirdStr); + if (!(SetInsertResult.second)) { + SMP_msg("WARNING: Duplicate file whitelist location %s ignored.\n", Str3); + } + } + else if (0 == strcmp(Str2, "BLACKLIST")) { + SetInsertResult = this->ZST_FileLocBlacklist.insert(ThirdStr); + if (!(SetInsertResult.second)) { + SMP_msg("WARNING: Duplicate file blacklist location %s ignored.\n", Str3); + } + } + else { + SMP_msg("ERROR: Unknown second field value in policy line: %s %s %s ; ignored\n", Str1, Str2, Str3); + } + } + else if (0 == strcmp(Str1, "NETWORKLOCATION")) { + if (0 == strcmp(Str2, "WHITELIST")) { + SetInsertResult = this->ZST_NetworkLocWhitelist.insert(ThirdStr); + if (!(SetInsertResult.second)) { + SMP_msg("WARNING: Duplicate network whitelist location %s ignored.\n", Str3); + } + } + else if (0 == strcmp(Str2, "BLACKLIST")) { + SetInsertResult = this->ZST_NetworkLocBlacklist.insert(ThirdStr); + if (!(SetInsertResult.second)) { + SMP_msg("WARNING: Duplicate network blacklist location %s ignored.\n", Str3); + } + } + else { + SMP_msg("ERROR: Unknown second field value in policy line: %s %s %s ; ignored\n", Str1, Str2, Str3); + } + } + else { + SMP_msg("ERROR: Unknown first field value in policy line: %s %s %s ; ignored\n", Str1, Str2, Str3); + } + } + } + if (0 == SMP_fclose(PolicyFile)) { + SMP_msg("Policy file %s successfully closed; all policies recorded.\n", ZSTPolicyFileName.c_str()); + } + else { + SMP_msg("ERROR: fclose failed on policy file %s. However, policies should be in effect.\n", ZSTPolicyFileName.c_str()); + } + // Now, initialize the system call name maps. + pair<map<string, ZST_SysCallType>::iterator, bool> FuncInsertResult; + // Do all the high privilege calls first. + string SysFuncName("putenv"); + pair<string, ZST_SysCallType> FuncNamePolicyPair(SysFuncName, ZST_HIGHPRIVILEGE_CALL); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("setenv"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("setegid"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("seteuid"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("setgid"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("setpgid"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("setregid"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("setreuid"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("setuid"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("execl"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("execv"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("execle"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("execve"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("execlp"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("execvp"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("system"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + + // Now do all the file operation calls. + FuncNamePolicyPair.second = ZST_FILE_CALL; + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("chdir"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("chmod"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("chown"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("creat"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("creat64"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("fopen"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("freopen"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("open"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("open64"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("mknod"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("remove"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("rmdir"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("unlink"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + + // Finally, handle all the network connection calls. + FuncNamePolicyPair.second = ZST_NETWORK_CALL; + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("socket"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("socketpair"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("pipe"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("bind"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("listen"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("accept"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + FuncNamePolicyPair.first.clear(); + FuncNamePolicyPair.first.append("connect"); + FuncInsertResult = this->ZST_FuncTypeMap.insert(FuncNamePolicyPair); + assert(FuncInsertResult.second); + } + else { + SMP_msg("WARNING: No policy file %s found. System call policies not in effect.\n", ZSTPolicyFileName.c_str()); + } + return; +} // end of STARS_Program_t::ZST_InitPolicies() + +// Initialize the OptCategory[] array to define how we emit optimizing annotations. +void STARS_Program_t::InitOptCategory(void) { + // Default category is 0, no optimization without knowing context. + (void)memset(OptCategory, 0, sizeof(OptCategory)); + // Category 1 instructions never need updating of their memory + // metadata by the Memory Monitor SDT. Currently, this is because + // these instructions only have effects on registers we do not maintain + // metadata for, such as the EIP and the FLAGS, e.g. jumps, compares, + // or because they are no-ops, including machine-dependent no-op idioms. + // Effects on floating-point regs are always NUMERIC and can be put into + // categury 1 because mmStrata knows these registers are NUMERIC and does + // not keep a metadata map for them. + // Category 2 instructions always have a result type of 'n' (number). + // Category 3 instructions have a result type of 'n' (number) + // whenever the second source operand is an operand of type 'n'. + // NOTE: MOV is only current example, and this will take some thought if + // other examples arise. + // Category 4 instructions have a result type identical to the 1st source operand type. + // NOTE: This is currently set for single-operand instructions such as + // INC, DEC. As a result, these are treated pretty much as if + // they were category 1 instructions, as there is no metadata update, + // unless the operand is a memory operand (i.e. mem or [reg]). + // If new instructions are added to this category that are not single + // operand and do require some updating, the category should be split. + // Category 5 instructions have a result type identical to the 1st source operand + // type whenever the 2nd source operand is an operand of type 'n'. + // If the destination is memory, metadata still needs to be checked; if + // not, no metadata check is needed, so it becomes category 1. + // Category 6 instructions always have a result type of 'p' (pointer). + // Category 7 instructions are category 2 instructions with two destinations, + // such as multiply and divide instructions that affect EDX:EAX. There are + // forms of these instructions that only have one destination, so they have + // to be distinguished via the operand info. + // Category 8 instructions implicitly write a numeric value to EDX:EAX, but + // EDX and EAX are not listed as operands. RDTSC, RDPMC, RDMSR, and other + // instructions that copy machine registers into EDX:EAX are category 8. + // Category 9 instructions are floating point instructions that either + // have a memory destination (treat as category 0) or a FP reg destination + // (treat as category 1). + // Category 10 instructions are the same as category 8, but also write + // to register ECX in addition to EDX:EAX. + + // NOTE: The Memory Monitor SDT needs just three categories, corresponding + // to categories 0, 1, and all others. For all categories > 1, the + // annotation should tell the SDT exactly how to update its metadata. + // For example, a division instruction will write type 'n' (NUM) as + // the metadata for result registers EDX:EAX. So, the annotation should + // list 'n', EDX, EAX, and a terminator of ZZ. CWD (convert word to + // doubleword) should have a list of 'n', EAX, ZZ. + + OptCategory[STARS_NN_null] = 0; // Unknown Operation + OptCategory[STARS_NN_aaa] = 2; // ASCII Adjust after Addition + OptCategory[STARS_NN_aad] = 2; // ASCII Adjust AX before Division + OptCategory[STARS_NN_aam] = 2; // ASCII Adjust AX after Multiply + OptCategory[STARS_NN_aas] = 2; // ASCII Adjust AL after Subtraction + OptCategory[STARS_NN_adc] = 5; // Add with Carry + OptCategory[STARS_NN_add] = 5; // Add + OptCategory[STARS_NN_and] = 0; // Logical AND + OptCategory[STARS_NN_arpl] = 1; // Adjust RPL Field of Selector + OptCategory[STARS_NN_bound] = 1; // Check Array Index Against Bounds + OptCategory[STARS_NN_bsf] = 2; // Bit Scan Forward + OptCategory[STARS_NN_bsr] = 2; // Bit Scan Reverse + OptCategory[STARS_NN_bt] = 0; // Bit Test + OptCategory[STARS_NN_btc] = 0; // Bit Test and Complement + OptCategory[STARS_NN_btr] = 0; // Bit Test and Reset + OptCategory[STARS_NN_bts] = 0; // Bit Test and Set + OptCategory[STARS_NN_call] = 1; // Call Procedure + OptCategory[STARS_NN_callfi] = 1; // Indirect Call Far Procedure + OptCategory[STARS_NN_callni] = 1; // Indirect Call Near Procedure + OptCategory[STARS_NN_cbw] = 2; // AL -> AX (with sign) ** No ops? + OptCategory[STARS_NN_cwde] = 2; // AX -> EAX (with sign) ** + OptCategory[STARS_NN_cdqe] = 2; // EAX -> RAX (with sign) ** + OptCategory[STARS_NN_clc] = 1; // Clear Carry Flag + OptCategory[STARS_NN_cld] = 1; // Clear Direction Flag + OptCategory[STARS_NN_cli] = 1; // Clear Interrupt Flag + OptCategory[STARS_NN_clts] = 1; // Clear Task-Switched Flag in CR0 + OptCategory[STARS_NN_cmc] = 1; // Complement Carry Flag + OptCategory[STARS_NN_cmp] = 1; // Compare Two Operands + OptCategory[STARS_NN_cmps] = 1; // Compare Strings + OptCategory[STARS_NN_cwd] = 2; // AX -> DX:AX (with sign) + OptCategory[STARS_NN_cdq] = 2; // EAX -> EDX:EAX (with sign) + OptCategory[STARS_NN_cqo] = 2; // RAX -> RDX:RAX (with sign) + OptCategory[STARS_NN_daa] = 2; // Decimal Adjust AL after Addition + OptCategory[STARS_NN_das] = 2; // Decimal Adjust AL after Subtraction + OptCategory[STARS_NN_dec] = 4; // Decrement by 1 + OptCategory[STARS_NN_div] = 7; // Unsigned Divide + OptCategory[STARS_NN_enterw] = 0; // Make Stack Frame for Procedure Parameters ** + OptCategory[STARS_NN_enter] = 0; // Make Stack Frame for Procedure Parameters ** + OptCategory[STARS_NN_enterd] = 0; // Make Stack Frame for Procedure Parameters ** + OptCategory[STARS_NN_enterq] = 0; // Make Stack Frame for Procedure Parameters ** + OptCategory[STARS_NN_hlt] = 0; // Halt + OptCategory[STARS_NN_idiv] = 7; // Signed Divide + OptCategory[STARS_NN_imul] = 7; // Signed Multiply + OptCategory[STARS_NN_in] = 0; // Input from Port ** + OptCategory[STARS_NN_inc] = 4; // Increment by 1 + OptCategory[STARS_NN_ins] = 2; // Input Byte(s) from Port to String ** + OptCategory[STARS_NN_int] = 0; // Call to Interrupt Procedure + OptCategory[STARS_NN_into] = 0; // Call to Interrupt Procedure if Overflow Flag = 1 + OptCategory[STARS_NN_int3] = 0; // Trap to Debugger + OptCategory[STARS_NN_iretw] = 0; // Interrupt Return + OptCategory[STARS_NN_iret] = 0; // Interrupt Return + OptCategory[STARS_NN_iretd] = 0; // Interrupt Return (use32) + OptCategory[STARS_NN_iretq] = 0; // Interrupt Return (use64) + OptCategory[STARS_NN_ja] = 1; // Jump if Above (CF=0 & ZF=0) + OptCategory[STARS_NN_jae] = 1; // Jump if Above or Equal (CF=0) + OptCategory[STARS_NN_jb] = 1; // Jump if Below (CF=1) + OptCategory[STARS_NN_jbe] = 1; // Jump if Below or Equal (CF=1 | ZF=1) + OptCategory[STARS_NN_jc] = 1; // Jump if Carry (CF=1) + OptCategory[STARS_NN_jcxz] = 1; // Jump if CX is 0 + OptCategory[STARS_NN_jecxz] = 1; // Jump if ECX is 0 + OptCategory[STARS_NN_jrcxz] = 1; // Jump if RCX is 0 + OptCategory[STARS_NN_je] = 1; // Jump if Equal (ZF=1) + OptCategory[STARS_NN_jg] = 1; // Jump if Greater (ZF=0 & SF=OF) + OptCategory[STARS_NN_jge] = 1; // Jump if Greater or Equal (SF=OF) + OptCategory[STARS_NN_jl] = 1; // Jump if Less (SF!=OF) + OptCategory[STARS_NN_jle] = 1; // Jump if Less or Equal (ZF=1 | SF!=OF) + OptCategory[STARS_NN_jna] = 1; // Jump if Not Above (CF=1 | ZF=1) + OptCategory[STARS_NN_jnae] = 1; // Jump if Not Above or Equal (CF=1) + OptCategory[STARS_NN_jnb] = 1; // Jump if Not Below (CF=0) + OptCategory[STARS_NN_jnbe] = 1; // Jump if Not Below or Equal (CF=0 & ZF=0) + OptCategory[STARS_NN_jnc] = 1; // Jump if Not Carry (CF=0) + OptCategory[STARS_NN_jne] = 1; // Jump if Not Equal (ZF=0) + OptCategory[STARS_NN_jng] = 1; // Jump if Not Greater (ZF=1 | SF!=OF) + OptCategory[STARS_NN_jnge] = 1; // Jump if Not Greater or Equal (SF!=OF) + OptCategory[STARS_NN_jnl] = 1; // Jump if Not Less (SF=OF) + OptCategory[STARS_NN_jnle] = 1; // Jump if Not Less or Equal (ZF=0 & SF=OF) + OptCategory[STARS_NN_jno] = 1; // Jump if Not Overflow (OF=0) + OptCategory[STARS_NN_jnp] = 1; // Jump if Not Parity (PF=0) + OptCategory[STARS_NN_jns] = 1; // Jump if Not Sign (SF=0) + OptCategory[STARS_NN_jnz] = 1; // Jump if Not Zero (ZF=0) + OptCategory[STARS_NN_jo] = 1; // Jump if Overflow (OF=1) + OptCategory[STARS_NN_jp] = 1; // Jump if Parity (PF=1) + OptCategory[STARS_NN_jpe] = 1; // Jump if Parity Even (PF=1) + OptCategory[STARS_NN_jpo] = 1; // Jump if Parity Odd (PF=0) + OptCategory[STARS_NN_js] = 1; // Jump if Sign (SF=1) + OptCategory[STARS_NN_jz] = 1; // Jump if Zero (ZF=1) + OptCategory[STARS_NN_jmp] = 1; // Jump + OptCategory[STARS_NN_jmpfi] = 1; // Indirect Far Jump + OptCategory[STARS_NN_jmpni] = 1; // Indirect Near Jump + OptCategory[STARS_NN_jmpshort] = 1; // Jump Short (not used) + OptCategory[STARS_NN_lahf] = 2; // Load Flags into AH Register + OptCategory[STARS_NN_lar] = 2; // Load Access Rights Byte + OptCategory[STARS_NN_lea] = 0; // Load Effective Address ** + OptCategory[STARS_NN_leavew] = 0; // High Level Procedure Exit ** + OptCategory[STARS_NN_leave] = 0; // High Level Procedure Exit ** + OptCategory[STARS_NN_leaved] = 0; // High Level Procedure Exit ** + OptCategory[STARS_NN_leaveq] = 0; // High Level Procedure Exit ** + OptCategory[STARS_NN_lgdt] = 0; // Load Global Descriptor Table Register + OptCategory[STARS_NN_lidt] = 0; // Load Interrupt Descriptor Table Register + OptCategory[STARS_NN_lgs] = 6; // Load Full Pointer to GS:xx + OptCategory[STARS_NN_lss] = 6; // Load Full Pointer to SS:xx + OptCategory[STARS_NN_lds] = 6; // Load Full Pointer to DS:xx + OptCategory[STARS_NN_les] = 6; // Load Full Pointer to ES:xx + OptCategory[STARS_NN_lfs] = 6; // Load Full Pointer to FS:xx + OptCategory[STARS_NN_lldt] = 0; // Load Local Descriptor Table Register + OptCategory[STARS_NN_lmsw] = 1; // Load Machine Status Word + OptCategory[STARS_NN_lock] = 1; // Assert LOCK# Signal Prefix + OptCategory[STARS_NN_lods] = 0; // Load String + OptCategory[STARS_NN_loopw] = 1; // Loop while ECX != 0 + OptCategory[STARS_NN_loop] = 1; // Loop while CX != 0 + OptCategory[STARS_NN_loopd] = 1; // Loop while ECX != 0 + OptCategory[STARS_NN_loopq] = 1; // Loop while RCX != 0 + OptCategory[STARS_NN_loopwe] = 1; // Loop while CX != 0 and ZF=1 + OptCategory[STARS_NN_loope] = 1; // Loop while rCX != 0 and ZF=1 + OptCategory[STARS_NN_loopde] = 1; // Loop while ECX != 0 and ZF=1 + OptCategory[STARS_NN_loopqe] = 1; // Loop while RCX != 0 and ZF=1 + OptCategory[STARS_NN_loopwne] = 1; // Loop while CX != 0 and ZF=0 + OptCategory[STARS_NN_loopne] = 1; // Loop while rCX != 0 and ZF=0 + OptCategory[STARS_NN_loopdne] = 1; // Loop while ECX != 0 and ZF=0 + OptCategory[STARS_NN_loopqne] = 1; // Loop while RCX != 0 and ZF=0 + OptCategory[STARS_NN_lsl] = 6; // Load Segment Limit + OptCategory[STARS_NN_ltr] = 1; // Load Task Register + OptCategory[STARS_NN_mov] = 3; // Move Data + OptCategory[STARS_NN_movsp] = 3; // Move to/from Special Registers + OptCategory[STARS_NN_movs] = 0; // Move Byte(s) from String to String + OptCategory[STARS_NN_movsx] = 3; // Move with Sign-Extend + OptCategory[STARS_NN_movzx] = 3; // Move with Zero-Extend + OptCategory[STARS_NN_mul] = 7; // Unsigned Multiplication of AL or AX + OptCategory[STARS_NN_neg] = 2; // Two's Complement Negation !!!!****!!!! Change this when mmStrata handles NEGATEDPTR type. + OptCategory[STARS_NN_nop] = 1; // No Operation + OptCategory[STARS_NN_not] = 2; // One's Complement Negation + OptCategory[STARS_NN_or] = 0; // Logical Inclusive OR + OptCategory[STARS_NN_out] = 0; // Output to Port + OptCategory[STARS_NN_outs] = 0; // Output Byte(s) to Port + OptCategory[STARS_NN_pop] = 0; // Pop a word from the Stack + OptCategory[STARS_NN_popaw] = 0; // Pop all General Registers + OptCategory[STARS_NN_popa] = 0; // Pop all General Registers + OptCategory[STARS_NN_popad] = 0; // Pop all General Registers (use32) + OptCategory[STARS_NN_popaq] = 0; // Pop all General Registers (use64) + OptCategory[STARS_NN_popfw] = 1; // Pop Stack into Flags Register ** + OptCategory[STARS_NN_popf] = 1; // Pop Stack into Flags Register ** + OptCategory[STARS_NN_popfd] = 1; // Pop Stack into Eflags Register ** + OptCategory[STARS_NN_popfq] = 1; // Pop Stack into Rflags Register ** + OptCategory[STARS_NN_push] = 0; // Push Operand onto the Stack + OptCategory[STARS_NN_pushaw] = 0; // Push all General Registers + OptCategory[STARS_NN_pusha] = 0; // Push all General Registers + OptCategory[STARS_NN_pushad] = 0; // Push all General Registers (use32) + OptCategory[STARS_NN_pushaq] = 0; // Push all General Registers (use64) + OptCategory[STARS_NN_pushfw] = 0; // Push Flags Register onto the Stack + OptCategory[STARS_NN_pushf] = 0; // Push Flags Register onto the Stack + OptCategory[STARS_NN_pushfd] = 0; // Push Flags Register onto the Stack (use32) + OptCategory[STARS_NN_pushfq] = 0; // Push Flags Register onto the Stack (use64) + OptCategory[STARS_NN_rcl] = 2; // Rotate Through Carry Left + OptCategory[STARS_NN_rcr] = 2; // Rotate Through Carry Right + OptCategory[STARS_NN_rol] = 2; // Rotate Left + OptCategory[STARS_NN_ror] = 2; // Rotate Right + OptCategory[STARS_NN_rep] = 0; // Repeat String Operation + OptCategory[STARS_NN_repe] = 0; // Repeat String Operation while ZF=1 + OptCategory[STARS_NN_repne] = 0; // Repeat String Operation while ZF=0 + OptCategory[STARS_NN_retn] = 0; // Return Near from Procedure + OptCategory[STARS_NN_retf] = 0; // Return Far from Procedure + OptCategory[STARS_NN_sahf] = 1; // Store AH into Flags Register + OptCategory[STARS_NN_sal] = 2; // Shift Arithmetic Left + OptCategory[STARS_NN_sar] = 2; // Shift Arithmetic Right + OptCategory[STARS_NN_shl] = 2; // Shift Logical Left + OptCategory[STARS_NN_shr] = 2; // Shift Logical Right + OptCategory[STARS_NN_sbb] = 5; // Integer Subtraction with Borrow + OptCategory[STARS_NN_scas] = 1; // Compare String + OptCategory[STARS_NN_seta] = 2; // Set Byte if Above (CF=0 & ZF=0) + OptCategory[STARS_NN_setae] = 2; // Set Byte if Above or Equal (CF=0) + OptCategory[STARS_NN_setb] = 2; // Set Byte if Below (CF=1) + OptCategory[STARS_NN_setbe] = 2; // Set Byte if Below or Equal (CF=1 | ZF=1) + OptCategory[STARS_NN_setc] = 2; // Set Byte if Carry (CF=1) + OptCategory[STARS_NN_sete] = 2; // Set Byte if Equal (ZF=1) + OptCategory[STARS_NN_setg] = 2; // Set Byte if Greater (ZF=0 & SF=OF) + OptCategory[STARS_NN_setge] = 2; // Set Byte if Greater or Equal (SF=OF) + OptCategory[STARS_NN_setl] = 2; // Set Byte if Less (SF!=OF) + OptCategory[STARS_NN_setle] = 2; // Set Byte if Less or Equal (ZF=1 | SF!=OF) + OptCategory[STARS_NN_setna] = 2; // Set Byte if Not Above (CF=1 | ZF=1) + OptCategory[STARS_NN_setnae] = 2; // Set Byte if Not Above or Equal (CF=1) + OptCategory[STARS_NN_setnb] = 2; // Set Byte if Not Below (CF=0) + OptCategory[STARS_NN_setnbe] = 2; // Set Byte if Not Below or Equal (CF=0 & ZF=0) + OptCategory[STARS_NN_setnc] = 2; // Set Byte if Not Carry (CF=0) + OptCategory[STARS_NN_setne] = 2; // Set Byte if Not Equal (ZF=0) + OptCategory[STARS_NN_setng] = 2; // Set Byte if Not Greater (ZF=1 | SF!=OF) + OptCategory[STARS_NN_setnge] = 2; // Set Byte if Not Greater or Equal (SF!=OF) + OptCategory[STARS_NN_setnl] = 2; // Set Byte if Not Less (SF=OF) + OptCategory[STARS_NN_setnle] = 2; // Set Byte if Not Less or Equal (ZF=0 & SF=OF) + OptCategory[STARS_NN_setno] = 2; // Set Byte if Not Overflow (OF=0) + OptCategory[STARS_NN_setnp] = 2; // Set Byte if Not Parity (PF=0) + OptCategory[STARS_NN_setns] = 2; // Set Byte if Not Sign (SF=0) + OptCategory[STARS_NN_setnz] = 2; // Set Byte if Not Zero (ZF=0) + OptCategory[STARS_NN_seto] = 2; // Set Byte if Overflow (OF=1) + OptCategory[STARS_NN_setp] = 2; // Set Byte if Parity (PF=1) + OptCategory[STARS_NN_setpe] = 2; // Set Byte if Parity Even (PF=1) + OptCategory[STARS_NN_setpo] = 2; // Set Byte if Parity Odd (PF=0) + OptCategory[STARS_NN_sets] = 2; // Set Byte if Sign (SF=1) + OptCategory[STARS_NN_setz] = 2; // Set Byte if Zero (ZF=1) + OptCategory[STARS_NN_sgdt] = 0; // Store Global Descriptor Table Register + OptCategory[STARS_NN_sidt] = 0; // Store Interrupt Descriptor Table Register + OptCategory[STARS_NN_shld] = 2; // Double Precision Shift Left + OptCategory[STARS_NN_shrd] = 2; // Double Precision Shift Right + OptCategory[STARS_NN_sldt] = 6; // Store Local Descriptor Table Register + OptCategory[STARS_NN_smsw] = 2; // Store Machine Status Word + OptCategory[STARS_NN_stc] = 1; // Set Carry Flag + OptCategory[STARS_NN_std] = 1; // Set Direction Flag + OptCategory[STARS_NN_sti] = 1; // Set Interrupt Flag + OptCategory[STARS_NN_stos] = 0; // Store String + OptCategory[STARS_NN_str] = 6; // Store Task Register + OptCategory[STARS_NN_sub] = 5; // Integer Subtraction + OptCategory[STARS_NN_test] = 1; // Logical Compare + OptCategory[STARS_NN_verr] = 1; // Verify a Segment for Reading + OptCategory[STARS_NN_verw] = 1; // Verify a Segment for Writing + OptCategory[STARS_NN_wait] = 1; // Wait until BUSY# Pin is Inactive (HIGH) + OptCategory[STARS_NN_xchg] = 0; // Exchange Register/Memory with Register + OptCategory[STARS_NN_xlat] = 0; // Table Lookup Translation + OptCategory[STARS_NN_xor] = 2; // Logical Exclusive OR + + // + // 486 instructions + // + + OptCategory[STARS_NN_cmpxchg] = 0; // Compare and Exchange + OptCategory[STARS_NN_bswap] = 2; // Swap bytes in register + OptCategory[STARS_NN_xadd] = 0; // t<-dest; dest<-src+dest; src<-t + OptCategory[STARS_NN_invd] = 1; // Invalidate Data Cache + OptCategory[STARS_NN_wbinvd] = 1; // Invalidate Data Cache (write changes) + OptCategory[STARS_NN_invlpg] = 1; // Invalidate TLB entry + + // + // Pentium instructions + // + + OptCategory[STARS_NN_rdmsr] = 8; // Read Machine Status Register + OptCategory[STARS_NN_wrmsr] = 1; // Write Machine Status Register + OptCategory[STARS_NN_cpuid] = 8; // Get CPU ID + OptCategory[STARS_NN_cmpxchg8b] = 0; // Compare and Exchange Eight Bytes + OptCategory[STARS_NN_rdtsc] = 8; // Read Time Stamp Counter + OptCategory[STARS_NN_rsm] = 1; // Resume from System Management Mode + + // + // Pentium Pro instructions + // + + OptCategory[STARS_NN_cmova] = 0; // Move if Above (CF=0 & ZF=0) + OptCategory[STARS_NN_cmovb] = 0; // Move if Below (CF=1) + OptCategory[STARS_NN_cmovbe] = 0; // Move if Below or Equal (CF=1 | ZF=1) + OptCategory[STARS_NN_cmovg] = 0; // Move if Greater (ZF=0 & SF=OF) + OptCategory[STARS_NN_cmovge] = 0; // Move if Greater or Equal (SF=OF) + OptCategory[STARS_NN_cmovl] = 0; // Move if Less (SF!=OF) + OptCategory[STARS_NN_cmovle] = 0; // Move if Less or Equal (ZF=1 | SF!=OF) + OptCategory[STARS_NN_cmovnb] = 0; // Move if Not Below (CF=0) + OptCategory[STARS_NN_cmovno] = 0; // Move if Not Overflow (OF=0) + OptCategory[STARS_NN_cmovnp] = 0; // Move if Not Parity (PF=0) + OptCategory[STARS_NN_cmovns] = 0; // Move if Not Sign (SF=0) + OptCategory[STARS_NN_cmovnz] = 0; // Move if Not Zero (ZF=0) + OptCategory[STARS_NN_cmovo] = 0; // Move if Overflow (OF=1) + OptCategory[STARS_NN_cmovp] = 0; // Move if Parity (PF=1) + OptCategory[STARS_NN_cmovs] = 0; // Move if Sign (SF=1) + OptCategory[STARS_NN_cmovz] = 0; // Move if Zero (ZF=1) + OptCategory[STARS_NN_fcmovb] = 1; // Floating Move if Below + OptCategory[STARS_NN_fcmove] = 1; // Floating Move if Equal + OptCategory[STARS_NN_fcmovbe] = 1; // Floating Move if Below or Equal + OptCategory[STARS_NN_fcmovu] = 1; // Floating Move if Unordered + OptCategory[STARS_NN_fcmovnb] = 1; // Floating Move if Not Below + OptCategory[STARS_NN_fcmovne] = 1; // Floating Move if Not Equal + OptCategory[STARS_NN_fcmovnbe] = 1; // Floating Move if Not Below or Equal + OptCategory[STARS_NN_fcmovnu] = 1; // Floating Move if Not Unordered + OptCategory[STARS_NN_fcomi] = 1; // FP Compare, result in EFLAGS + OptCategory[STARS_NN_fucomi] = 1; // FP Unordered Compare, result in EFLAGS + OptCategory[STARS_NN_fcomip] = 1; // FP Compare, result in EFLAGS, pop stack + OptCategory[STARS_NN_fucomip] = 1; // FP Unordered Compare, result in EFLAGS, pop stack + OptCategory[STARS_NN_rdpmc] = 8; // Read Performance Monitor Counter + + // + // FPP instructions + // + + OptCategory[STARS_NN_fld] = 1; // Load Real ** Infer src is 'n' + OptCategory[STARS_NN_fst] = 9; // Store Real + OptCategory[STARS_NN_fstp] = 9; // Store Real and Pop + OptCategory[STARS_NN_fxch] = 1; // Exchange Registers + OptCategory[STARS_NN_fild] = 1; // Load Integer ** Infer src is 'n' + OptCategory[STARS_NN_fist] = 0; // Store Integer + OptCategory[STARS_NN_fistp] = 0; // Store Integer and Pop + OptCategory[STARS_NN_fbld] = 1; // Load BCD + OptCategory[STARS_NN_fbstp] = 0; // Store BCD and Pop + OptCategory[STARS_NN_fadd] = 1; // Add Real + OptCategory[STARS_NN_faddp] = 1; // Add Real and Pop + OptCategory[STARS_NN_fiadd] = 1; // Add Integer + OptCategory[STARS_NN_fsub] = 1; // Subtract Real + OptCategory[STARS_NN_fsubp] = 1; // Subtract Real and Pop + OptCategory[STARS_NN_fisub] = 1; // Subtract Integer + OptCategory[STARS_NN_fsubr] = 1; // Subtract Real Reversed + OptCategory[STARS_NN_fsubrp] = 1; // Subtract Real Reversed and Pop + OptCategory[STARS_NN_fisubr] = 1; // Subtract Integer Reversed + OptCategory[STARS_NN_fmul] = 1; // Multiply Real + OptCategory[STARS_NN_fmulp] = 1; // Multiply Real and Pop + OptCategory[STARS_NN_fimul] = 1; // Multiply Integer + OptCategory[STARS_NN_fdiv] = 1; // Divide Real + OptCategory[STARS_NN_fdivp] = 1; // Divide Real and Pop + OptCategory[STARS_NN_fidiv] = 1; // Divide Integer + OptCategory[STARS_NN_fdivr] = 1; // Divide Real Reversed + OptCategory[STARS_NN_fdivrp] = 1; // Divide Real Reversed and Pop + OptCategory[STARS_NN_fidivr] = 1; // Divide Integer Reversed + OptCategory[STARS_NN_fsqrt] = 1; // Square Root + OptCategory[STARS_NN_fscale] = 1; // Scale: st(0) <- st(0) * 2^st(1) + OptCategory[STARS_NN_fprem] = 1; // Partial Remainder + OptCategory[STARS_NN_frndint] = 1; // Round to Integer + OptCategory[STARS_NN_fxtract] = 1; // Extract exponent and significand + OptCategory[STARS_NN_fabs] = 1; // Absolute value + OptCategory[STARS_NN_fchs] = 1; // Change Sign + OptCategory[STARS_NN_fcom] = 1; // Compare Real + OptCategory[STARS_NN_fcomp] = 1; // Compare Real and Pop + OptCategory[STARS_NN_fcompp] = 1; // Compare Real and Pop Twice + OptCategory[STARS_NN_ficom] = 1; // Compare Integer + OptCategory[STARS_NN_ficomp] = 1; // Compare Integer and Pop + OptCategory[STARS_NN_ftst] = 1; // Test + OptCategory[STARS_NN_fxam] = 1; // Examine + OptCategory[STARS_NN_fptan] = 1; // Partial tangent + OptCategory[STARS_NN_fpatan] = 1; // Partial arctangent + OptCategory[STARS_NN_f2xm1] = 1; // 2^x - 1 + OptCategory[STARS_NN_fyl2x] = 1; // Y * lg2(X) + OptCategory[STARS_NN_fyl2xp1] = 1; // Y * lg2(X+1) + OptCategory[STARS_NN_fldz] = 1; // Load +0.0 + OptCategory[STARS_NN_fld1] = 1; // Load +1.0 + OptCategory[STARS_NN_fldpi] = 1; // Load PI=3.14... + OptCategory[STARS_NN_fldl2t] = 1; // Load lg2(10) + OptCategory[STARS_NN_fldl2e] = 1; // Load lg2(e) + OptCategory[STARS_NN_fldlg2] = 1; // Load lg10(2) + OptCategory[STARS_NN_fldln2] = 1; // Load ln(2) + OptCategory[STARS_NN_finit] = 1; // Initialize Processor + OptCategory[STARS_NN_fninit] = 1; // Initialize Processor (no wait) + OptCategory[STARS_NN_fsetpm] = 1; // Set Protected Mode + OptCategory[STARS_NN_fldcw] = 1; // Load Control Word + OptCategory[STARS_NN_fstcw] = 0; // Store Control Word + OptCategory[STARS_NN_fnstcw] = 0; // Store Control Word (no wait) + OptCategory[STARS_NN_fstsw] = 2; // Store Status Word to memory or AX + OptCategory[STARS_NN_fnstsw] = 2; // Store Status Word (no wait) to memory or AX + OptCategory[STARS_NN_fclex] = 1; // Clear Exceptions + OptCategory[STARS_NN_fnclex] = 1; // Clear Exceptions (no wait) + OptCategory[STARS_NN_fstenv] = 0; // Store Environment + OptCategory[STARS_NN_fnstenv] = 0; // Store Environment (no wait) + OptCategory[STARS_NN_fldenv] = 1; // Load Environment + OptCategory[STARS_NN_fsave] = 0; // Save State + OptCategory[STARS_NN_fnsave] = 0; // Save State (no wait) + OptCategory[STARS_NN_frstor] = 1; // Restore State ** infer src is 'n' + OptCategory[STARS_NN_fincstp] = 1; // Increment Stack Pointer + OptCategory[STARS_NN_fdecstp] = 1; // Decrement Stack Pointer + OptCategory[STARS_NN_ffree] = 1; // Free Register + OptCategory[STARS_NN_fnop] = 1; // No Operation + OptCategory[STARS_NN_feni] = 1; // (8087 only) + OptCategory[STARS_NN_fneni] = 1; // (no wait) (8087 only) + OptCategory[STARS_NN_fdisi] = 1; // (8087 only) + OptCategory[STARS_NN_fndisi] = 1; // (no wait) (8087 only) + + // + // 80387 instructions + // + + OptCategory[STARS_NN_fprem1] = 1; // Partial Remainder ( < half ) + OptCategory[STARS_NN_fsincos] = 1; // t<-cos(st); st<-sin(st); push t + OptCategory[STARS_NN_fsin] = 1; // Sine + OptCategory[STARS_NN_fcos] = 1; // Cosine + OptCategory[STARS_NN_fucom] = 1; // Compare Unordered Real + OptCategory[STARS_NN_fucomp] = 1; // Compare Unordered Real and Pop + OptCategory[STARS_NN_fucompp] = 1; // Compare Unordered Real and Pop Twice + + // + // Instructions added 28.02.96 + // + + OptCategory[STARS_NN_setalc] = 2; // Set AL to Carry Flag ** + OptCategory[STARS_NN_svdc] = 0; // Save Register and Descriptor + OptCategory[STARS_NN_rsdc] = 0; // Restore Register and Descriptor + OptCategory[STARS_NN_svldt] = 0; // Save LDTR and Descriptor + OptCategory[STARS_NN_rsldt] = 0; // Restore LDTR and Descriptor + OptCategory[STARS_NN_svts] = 1; // Save TR and Descriptor + OptCategory[STARS_NN_rsts] = 1; // Restore TR and Descriptor + OptCategory[STARS_NN_icebp] = 1; // ICE Break Point + OptCategory[STARS_NN_loadall] = 0; // Load the entire CPU state from ES:EDI + + // + // MMX instructions + // + + OptCategory[STARS_NN_emms] = 1; // Empty MMX state + OptCategory[STARS_NN_movd] = 9; // Move 32 bits + OptCategory[STARS_NN_movq] = 9; // Move 64 bits + OptCategory[STARS_NN_packsswb] = 1; // Pack with Signed Saturation (Word->Byte) + OptCategory[STARS_NN_packssdw] = 1; // Pack with Signed Saturation (Dword->Word) + OptCategory[STARS_NN_packuswb] = 1; // Pack with Unsigned Saturation (Word->Byte) + OptCategory[STARS_NN_paddb] = 1; // Packed Add Byte + OptCategory[STARS_NN_paddw] = 1; // Packed Add Word + OptCategory[STARS_NN_paddd] = 1; // Packed Add Dword + OptCategory[STARS_NN_paddsb] = 1; // Packed Add with Saturation (Byte) + OptCategory[STARS_NN_paddsw] = 1; // Packed Add with Saturation (Word) + OptCategory[STARS_NN_paddusb] = 1; // Packed Add Unsigned with Saturation (Byte) + OptCategory[STARS_NN_paddusw] = 1; // Packed Add Unsigned with Saturation (Word) + OptCategory[STARS_NN_pand] = 1; // Bitwise Logical And + OptCategory[STARS_NN_pandn] = 1; // Bitwise Logical And Not + OptCategory[STARS_NN_pcmpeqb] = 1; // Packed Compare for Equal (Byte) + OptCategory[STARS_NN_pcmpeqw] = 1; // Packed Compare for Equal (Word) + OptCategory[STARS_NN_pcmpeqd] = 1; // Packed Compare for Equal (Dword) + OptCategory[STARS_NN_pcmpgtb] = 1; // Packed Compare for Greater Than (Byte) + OptCategory[STARS_NN_pcmpgtw] = 1; // Packed Compare for Greater Than (Word) + OptCategory[STARS_NN_pcmpgtd] = 1; // Packed Compare for Greater Than (Dword) + OptCategory[STARS_NN_pmaddwd] = 1; // Packed Multiply and Add + OptCategory[STARS_NN_pmulhw] = 1; // Packed Multiply High + OptCategory[STARS_NN_pmullw] = 1; // Packed Multiply Low + OptCategory[STARS_NN_por] = 1; // Bitwise Logical Or + OptCategory[STARS_NN_psllw] = 1; // Packed Shift Left Logical (Word) + OptCategory[STARS_NN_pslld] = 1; // Packed Shift Left Logical (Dword) + OptCategory[STARS_NN_psllq] = 1; // Packed Shift Left Logical (Qword) + OptCategory[STARS_NN_psraw] = 1; // Packed Shift Right Arithmetic (Word) + OptCategory[STARS_NN_psrad] = 1; // Packed Shift Right Arithmetic (Dword) + OptCategory[STARS_NN_psrlw] = 1; // Packed Shift Right Logical (Word) + OptCategory[STARS_NN_psrld] = 1; // Packed Shift Right Logical (Dword) + OptCategory[STARS_NN_psrlq] = 1; // Packed Shift Right Logical (Qword) + OptCategory[STARS_NN_psubb] = 1; // Packed Subtract Byte + OptCategory[STARS_NN_psubw] = 1; // Packed Subtract Word + OptCategory[STARS_NN_psubd] = 1; // Packed Subtract Dword + OptCategory[STARS_NN_psubsb] = 1; // Packed Subtract with Saturation (Byte) + OptCategory[STARS_NN_psubsw] = 1; // Packed Subtract with Saturation (Word) + OptCategory[STARS_NN_psubusb] = 1; // Packed Subtract Unsigned with Saturation (Byte) + OptCategory[STARS_NN_psubusw] = 1; // Packed Subtract Unsigned with Saturation (Word) + OptCategory[STARS_NN_punpckhbw] = 1; // Unpack High Packed Data (Byte->Word) + OptCategory[STARS_NN_punpckhwd] = 1; // Unpack High Packed Data (Word->Dword) + OptCategory[STARS_NN_punpckhdq] = 1; // Unpack High Packed Data (Dword->Qword) + OptCategory[STARS_NN_punpcklbw] = 1; // Unpack Low Packed Data (Byte->Word) + OptCategory[STARS_NN_punpcklwd] = 1; // Unpack Low Packed Data (Word->Dword) + OptCategory[STARS_NN_punpckldq] = 1; // Unpack Low Packed Data (Dword->Qword) + OptCategory[STARS_NN_pxor] = 1; // Bitwise Logical Exclusive Or + + // + // Undocumented Deschutes processor instructions + // + + OptCategory[STARS_NN_fxsave] = 1; // Fast save FP context ** to where? + OptCategory[STARS_NN_fxrstor] = 1; // Fast restore FP context ** from where? + + // Pentium II instructions + + OptCategory[STARS_NN_sysenter] = 1; // Fast Transition to System Call Entry Point + OptCategory[STARS_NN_sysexit] = 1; // Fast Transition from System Call Entry Point + + // 3DNow! instructions + + OptCategory[STARS_NN_pavgusb] = 1; // Packed 8-bit Unsigned Integer Averaging + OptCategory[STARS_NN_pfadd] = 1; // Packed Floating-Point Addition + OptCategory[STARS_NN_pfsub] = 1; // Packed Floating-Point Subtraction + OptCategory[STARS_NN_pfsubr] = 1; // Packed Floating-Point Reverse Subtraction + OptCategory[STARS_NN_pfacc] = 1; // Packed Floating-Point Accumulate + OptCategory[STARS_NN_pfcmpge] = 1; // Packed Floating-Point Comparison, Greater or Equal + OptCategory[STARS_NN_pfcmpgt] = 1; // Packed Floating-Point Comparison, Greater + OptCategory[STARS_NN_pfcmpeq] = 1; // Packed Floating-Point Comparison, Equal + OptCategory[STARS_NN_pfmin] = 1; // Packed Floating-Point Minimum + OptCategory[STARS_NN_pfmax] = 1; // Packed Floating-Point Maximum + OptCategory[STARS_NN_pi2fd] = 1; // Packed 32-bit Integer to Floating-Point + OptCategory[STARS_NN_pf2id] = 1; // Packed Floating-Point to 32-bit Integer + OptCategory[STARS_NN_pfrcp] = 1; // Packed Floating-Point Reciprocal Approximation + OptCategory[STARS_NN_pfrsqrt] = 1; // Packed Floating-Point Reciprocal Square Root Approximation + OptCategory[STARS_NN_pfmul] = 1; // Packed Floating-Point Multiplication + OptCategory[STARS_NN_pfrcpit1] = 1; // Packed Floating-Point Reciprocal First Iteration Step + OptCategory[STARS_NN_pfrsqit1] = 1; // Packed Floating-Point Reciprocal Square Root First Iteration Step + OptCategory[STARS_NN_pfrcpit2] = 1; // Packed Floating-Point Reciprocal Second Iteration Step + OptCategory[STARS_NN_pmulhrw] = 1; // Packed Floating-Point 16-bit Integer Multiply with rounding + OptCategory[STARS_NN_femms] = 1; // Faster entry/exit of the MMX or floating-point state + OptCategory[STARS_NN_prefetch] = 1; // Prefetch at least a 32-byte line into L1 data cache + OptCategory[STARS_NN_prefetchw] = 1; // Prefetch processor cache line into L1 data cache (mark as modified) + + + // Pentium III instructions + + OptCategory[STARS_NN_addps] = 1; // Packed Single-FP Add + OptCategory[STARS_NN_addss] = 1; // Scalar Single-FP Add + OptCategory[STARS_NN_andnps] = 1; // Bitwise Logical And Not for Single-FP + OptCategory[STARS_NN_andps] = 1; // Bitwise Logical And for Single-FP + OptCategory[STARS_NN_cmpps] = 1; // Packed Single-FP Compare + OptCategory[STARS_NN_cmpss] = 1; // Scalar Single-FP Compare + OptCategory[STARS_NN_comiss] = 1; // Scalar Ordered Single-FP Compare and Set EFLAGS + OptCategory[STARS_NN_cvtpi2ps] = 1; // Packed signed INT32 to Packed Single-FP conversion + OptCategory[STARS_NN_cvtps2pi] = 1; // Packed Single-FP to Packed INT32 conversion + OptCategory[STARS_NN_cvtsi2ss] = 1; // Scalar signed INT32 to Single-FP conversion + OptCategory[STARS_NN_cvtss2si] = 2; // Scalar Single-FP to signed INT32 conversion + OptCategory[STARS_NN_cvttps2pi] = 1; // Packed Single-FP to Packed INT32 conversion (truncate) + OptCategory[STARS_NN_cvttss2si] = 2; // Scalar Single-FP to signed INT32 conversion (truncate) + OptCategory[STARS_NN_divps] = 1; // Packed Single-FP Divide + OptCategory[STARS_NN_divss] = 1; // Scalar Single-FP Divide + OptCategory[STARS_NN_ldmxcsr] = 1; // Load Streaming SIMD Extensions Technology Control/Status Register + OptCategory[STARS_NN_maxps] = 1; // Packed Single-FP Maximum + OptCategory[STARS_NN_maxss] = 1; // Scalar Single-FP Maximum + OptCategory[STARS_NN_minps] = 1; // Packed Single-FP Minimum + OptCategory[STARS_NN_minss] = 1; // Scalar Single-FP Minimum + OptCategory[STARS_NN_movaps] = 9; // Move Aligned Four Packed Single-FP ** infer memsrc 'n'? + OptCategory[STARS_NN_movhlps] = 1; // Move High to Low Packed Single-FP + OptCategory[STARS_NN_movhps] = 1; // Move High Packed Single-FP + OptCategory[STARS_NN_movlhps] = 1; // Move Low to High Packed Single-FP + OptCategory[STARS_NN_movlps] = 1; // Move Low Packed Single-FP + OptCategory[STARS_NN_movmskps] = 1; // Move Mask to Register + OptCategory[STARS_NN_movss] = 9; // Move Scalar Single-FP + OptCategory[STARS_NN_movups] = 9; // Move Unaligned Four Packed Single-FP + OptCategory[STARS_NN_mulps] = 1; // Packed Single-FP Multiply + OptCategory[STARS_NN_mulss] = 1; // Scalar Single-FP Multiply + OptCategory[STARS_NN_orps] = 1; // Bitwise Logical OR for Single-FP Data + OptCategory[STARS_NN_rcpps] = 1; // Packed Single-FP Reciprocal + OptCategory[STARS_NN_rcpss] = 1; // Scalar Single-FP Reciprocal + OptCategory[STARS_NN_rsqrtps] = 1; // Packed Single-FP Square Root Reciprocal + OptCategory[STARS_NN_rsqrtss] = 1; // Scalar Single-FP Square Root Reciprocal + OptCategory[STARS_NN_shufps] = 1; // Shuffle Single-FP + OptCategory[STARS_NN_sqrtps] = 1; // Packed Single-FP Square Root + OptCategory[STARS_NN_sqrtss] = 1; // Scalar Single-FP Square Root + OptCategory[STARS_NN_stmxcsr] = 0; // Store Streaming SIMD Extensions Technology Control/Status Register ** Infer dest is 'n' + OptCategory[STARS_NN_subps] = 1; // Packed Single-FP Subtract + OptCategory[STARS_NN_subss] = 1; // Scalar Single-FP Subtract + OptCategory[STARS_NN_ucomiss] = 1; // Scalar Unordered Single-FP Compare and Set EFLAGS + OptCategory[STARS_NN_unpckhps] = 1; // Unpack High Packed Single-FP Data + OptCategory[STARS_NN_unpcklps] = 1; // Unpack Low Packed Single-FP Data + OptCategory[STARS_NN_xorps] = 1; // Bitwise Logical XOR for Single-FP Data + OptCategory[STARS_NN_pavgb] = 1; // Packed Average (Byte) + OptCategory[STARS_NN_pavgw] = 1; // Packed Average (Word) + OptCategory[STARS_NN_pextrw] = 2; // Extract Word + OptCategory[STARS_NN_pinsrw] = 1; // Insert Word + OptCategory[STARS_NN_pmaxsw] = 1; // Packed Signed Integer Word Maximum + OptCategory[STARS_NN_pmaxub] = 1; // Packed Unsigned Integer Byte Maximum + OptCategory[STARS_NN_pminsw] = 1; // Packed Signed Integer Word Minimum + OptCategory[STARS_NN_pminub] = 1; // Packed Unsigned Integer Byte Minimum + OptCategory[STARS_NN_pmovmskb] = 1; // Move Byte Mask to Integer + OptCategory[STARS_NN_pmulhuw] = 1; // Packed Multiply High Unsigned + OptCategory[STARS_NN_psadbw] = 1; // Packed Sum of Absolute Differences + OptCategory[STARS_NN_pshufw] = 1; // Packed Shuffle Word + OptCategory[STARS_NN_maskmovq] = 0; // Byte Mask write ** Infer dest is 'n' + OptCategory[STARS_NN_movntps] = 0; // Move Aligned Four Packed Single-FP Non Temporal * infer dest is 'n' + OptCategory[STARS_NN_movntq] = 0; // Move 64 Bits Non Temporal ** Infer dest is 'n' + OptCategory[STARS_NN_prefetcht0] = 1; // Prefetch to all cache levels + OptCategory[STARS_NN_prefetcht1] = 1; // Prefetch to all cache levels + OptCategory[STARS_NN_prefetcht2] = 1; // Prefetch to L2 cache + OptCategory[STARS_NN_prefetchnta] = 1; // Prefetch to L1 cache + OptCategory[STARS_NN_sfence] = 1; // Store Fence + + // Pentium III Pseudo instructions + + OptCategory[STARS_NN_cmpeqps] = 1; // Packed Single-FP Compare EQ + OptCategory[STARS_NN_cmpltps] = 1; // Packed Single-FP Compare LT + OptCategory[STARS_NN_cmpleps] = 1; // Packed Single-FP Compare LE + OptCategory[STARS_NN_cmpunordps] = 1; // Packed Single-FP Compare UNORD + OptCategory[STARS_NN_cmpneqps] = 1; // Packed Single-FP Compare NOT EQ + OptCategory[STARS_NN_cmpnltps] = 1; // Packed Single-FP Compare NOT LT + OptCategory[STARS_NN_cmpnleps] = 1; // Packed Single-FP Compare NOT LE + OptCategory[STARS_NN_cmpordps] = 1; // Packed Single-FP Compare ORDERED + OptCategory[STARS_NN_cmpeqss] = 1; // Scalar Single-FP Compare EQ + OptCategory[STARS_NN_cmpltss] = 1; // Scalar Single-FP Compare LT + OptCategory[STARS_NN_cmpless] = 1; // Scalar Single-FP Compare LE + OptCategory[STARS_NN_cmpunordss] = 1; // Scalar Single-FP Compare UNORD + OptCategory[STARS_NN_cmpneqss] = 1; // Scalar Single-FP Compare NOT EQ + OptCategory[STARS_NN_cmpnltss] = 1; // Scalar Single-FP Compare NOT LT + OptCategory[STARS_NN_cmpnless] = 1; // Scalar Single-FP Compare NOT LE + OptCategory[STARS_NN_cmpordss] = 1; // Scalar Single-FP Compare ORDERED + + // AMD K7 instructions + + // Revisit AMD if we port to it. + OptCategory[STARS_NN_pf2iw] = 0; // Packed Floating-Point to Integer with Sign Extend + OptCategory[STARS_NN_pfnacc] = 0; // Packed Floating-Point Negative Accumulate + OptCategory[STARS_NN_pfpnacc] = 0; // Packed Floating-Point Mixed Positive-Negative Accumulate + OptCategory[STARS_NN_pi2fw] = 0; // Packed 16-bit Integer to Floating-Point + OptCategory[STARS_NN_pswapd] = 0; // Packed Swap Double Word + + // Undocumented FP instructions (thanks to norbert.juffa@adm.com) + + OptCategory[STARS_NN_fstp1] = 9; // Alias of Store Real and Pop + OptCategory[STARS_NN_fcom2] = 1; // Alias of Compare Real + OptCategory[STARS_NN_fcomp3] = 1; // Alias of Compare Real and Pop + OptCategory[STARS_NN_fxch4] = 1; // Alias of Exchange Registers + OptCategory[STARS_NN_fcomp5] = 1; // Alias of Compare Real and Pop + OptCategory[STARS_NN_ffreep] = 1; // Free Register and Pop + OptCategory[STARS_NN_fxch7] = 1; // Alias of Exchange Registers + OptCategory[STARS_NN_fstp8] = 9; // Alias of Store Real and Pop + OptCategory[STARS_NN_fstp9] = 9; // Alias of Store Real and Pop + + // Pentium 4 instructions + + OptCategory[STARS_NN_addpd] = 1; // Add Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_addsd] = 1; // Add Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_andnpd] = 1; // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_andpd] = 1; // Bitwise Logical AND of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_clflush] = 1; // Flush Cache Line + OptCategory[STARS_NN_cmppd] = 1; // Compare Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_cmpsd] = 1; // Compare Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_comisd] = 1; // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + OptCategory[STARS_NN_cvtdq2pd] = 1; // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_cvtdq2ps] = 1; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_cvtpd2dq] = 1; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + OptCategory[STARS_NN_cvtpd2pi] = 1; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + OptCategory[STARS_NN_cvtpd2ps] = 1; // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_cvtpi2pd] = 1; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_cvtps2dq] = 1; // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + OptCategory[STARS_NN_cvtps2pd] = 1; // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_cvtsd2si] = 2; // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer + OptCategory[STARS_NN_cvtsd2ss] = 1; // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value + OptCategory[STARS_NN_cvtsi2sd] = 1; // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value + OptCategory[STARS_NN_cvtss2sd] = 1; // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value + OptCategory[STARS_NN_cvttpd2dq] = 1; // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + OptCategory[STARS_NN_cvttpd2pi] = 1; // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + OptCategory[STARS_NN_cvttps2dq] = 1; // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + OptCategory[STARS_NN_cvttsd2si] = 2; // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer + OptCategory[STARS_NN_divpd] = 1; // Divide Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_divsd] = 1; // Divide Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_lfence] = 1; // Load Fence + OptCategory[STARS_NN_maskmovdqu] = 0; // Store Selected Bytes of Double Quadword ** Infer dest is 'n' + OptCategory[STARS_NN_maxpd] = 1; // Return Maximum Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_maxsd] = 1; // Return Maximum Scalar Double-Precision Floating-Point Value + OptCategory[STARS_NN_mfence] = 1; // Memory Fence + OptCategory[STARS_NN_minpd] = 1; // Return Minimum Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_minsd] = 1; // Return Minimum Scalar Double-Precision Floating-Point Value + OptCategory[STARS_NN_movapd] = 9; // Move Aligned Packed Double-Precision Floating-Point Values ** Infer dest is 'n' + OptCategory[STARS_NN_movdq2q] = 1; // Move Quadword from XMM to MMX Register + OptCategory[STARS_NN_movdqa] = 9; // Move Aligned Double Quadword ** Infer dest is 'n' + OptCategory[STARS_NN_movdqu] = 9; // Move Unaligned Double Quadword ** Infer dest is 'n' + OptCategory[STARS_NN_movhpd] = 9; // Move High Packed Double-Precision Floating-Point Values ** Infer dest is 'n' + OptCategory[STARS_NN_movlpd] = 9; // Move Low Packed Double-Precision Floating-Point Values ** Infer dest is 'n' + OptCategory[STARS_NN_movmskpd] = 2; // Extract Packed Double-Precision Floating-Point Sign Mask + OptCategory[STARS_NN_movntdq] = 0; // Store Double Quadword Using Non-Temporal Hint + OptCategory[STARS_NN_movnti] = 0; // Store Doubleword Using Non-Temporal Hint + OptCategory[STARS_NN_movntpd] = 0; // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint + OptCategory[STARS_NN_movq2dq] = 1; // Move Quadword from MMX to XMM Register + OptCategory[STARS_NN_movsd] = 9; // Move Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_movupd] = 9; // Move Unaligned Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_mulpd] = 1; // Multiply Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_mulsd] = 1; // Multiply Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_orpd] = 1; // Bitwise Logical OR of Double-Precision Floating-Point Values + OptCategory[STARS_NN_paddq] = 1; // Add Packed Quadword Integers + OptCategory[STARS_NN_pause] = 1; // Spin Loop Hint + OptCategory[STARS_NN_pmuludq] = 1; // Multiply Packed Unsigned Doubleword Integers + OptCategory[STARS_NN_pshufd] = 1; // Shuffle Packed Doublewords + OptCategory[STARS_NN_pshufhw] = 1; // Shuffle Packed High Words + OptCategory[STARS_NN_pshuflw] = 1; // Shuffle Packed Low Words + OptCategory[STARS_NN_pslldq] = 1; // Shift Double Quadword Left Logical + OptCategory[STARS_NN_psrldq] = 1; // Shift Double Quadword Right Logical + OptCategory[STARS_NN_psubq] = 1; // Subtract Packed Quadword Integers + OptCategory[STARS_NN_punpckhqdq] = 1; // Unpack High Data + OptCategory[STARS_NN_punpcklqdq] = 1; // Unpack Low Data + OptCategory[STARS_NN_shufpd] = 1; // Shuffle Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_sqrtpd] = 1; // Compute Square Roots of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_sqrtsd] = 1; // Compute Square Rootof Scalar Double-Precision Floating-Point Value + OptCategory[STARS_NN_subpd] = 1; // Subtract Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_subsd] = 1; // Subtract Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_ucomisd] = 1; // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + OptCategory[STARS_NN_unpckhpd] = 1; // Unpack and Interleave High Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_unpcklpd] = 1; // Unpack and Interleave Low Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_xorpd] = 1; // Bitwise Logical OR of Double-Precision Floating-Point Values + + + // AMD syscall/sysret instructions NOTE: not AMD, found in Intel manual + + OptCategory[STARS_NN_syscall] = 1; // Low latency system call + OptCategory[STARS_NN_sysret] = 1; // Return from system call + + // AMD64 instructions NOTE: not AMD, found in Intel manual + + OptCategory[STARS_NN_swapgs] = 1; // Exchange GS base with KernelGSBase MSR + + // New Pentium instructions (SSE3) + + OptCategory[STARS_NN_movddup] = 9; // Move One Double-FP and Duplicate + OptCategory[STARS_NN_movshdup] = 9; // Move Packed Single-FP High and Duplicate + OptCategory[STARS_NN_movsldup] = 9; // Move Packed Single-FP Low and Duplicate + + // Missing AMD64 instructions NOTE: also found in Intel manual + + OptCategory[STARS_NN_movsxd] = 2; // Move with Sign-Extend Doubleword + OptCategory[STARS_NN_cmpxchg16b] = 0; // Compare and Exchange 16 Bytes + + // SSE3 instructions + + OptCategory[STARS_NN_addsubpd] = 1; // Add /Sub packed DP FP numbers + OptCategory[STARS_NN_addsubps] = 1; // Add /Sub packed SP FP numbers + OptCategory[STARS_NN_haddpd] = 1; // Add horizontally packed DP FP numbers + OptCategory[STARS_NN_haddps] = 1; // Add horizontally packed SP FP numbers + OptCategory[STARS_NN_hsubpd] = 1; // Sub horizontally packed DP FP numbers + OptCategory[STARS_NN_hsubps] = 1; // Sub horizontally packed SP FP numbers + OptCategory[STARS_NN_monitor] = 1; // Set up a linear address range to be monitored by hardware + OptCategory[STARS_NN_mwait] = 1; // Wait until write-back store performed within the range specified by the MONITOR instruction + OptCategory[STARS_NN_fisttp] = 0; // Store ST in intXX (chop) and pop + OptCategory[STARS_NN_lddqu] = 1; // Load unaligned integer 128-bit + + // SSSE3 instructions + + OptCategory[STARS_NN_psignb] = 1; // Packed SIGN Byte + OptCategory[STARS_NN_psignw] = 1; // Packed SIGN Word + OptCategory[STARS_NN_psignd] = 1; // Packed SIGN Doubleword + OptCategory[STARS_NN_pshufb] = 1; // Packed Shuffle Bytes + OptCategory[STARS_NN_pmulhrsw] = 1; // Packed Multiply High with Round and Scale + OptCategory[STARS_NN_pmaddubsw] = 1; // Multiply and Add Packed Signed and Unsigned Bytes + OptCategory[STARS_NN_phsubsw] = 1; // Packed Horizontal Subtract and Saturate + OptCategory[STARS_NN_phaddsw] = 1; // Packed Horizontal Add and Saturate + OptCategory[STARS_NN_phaddw] = 1; // Packed Horizontal Add Word + OptCategory[STARS_NN_phaddd] = 1; // Packed Horizontal Add Doubleword + OptCategory[STARS_NN_phsubw] = 1; // Packed Horizontal Subtract Word + OptCategory[STARS_NN_phsubd] = 1; // Packed Horizontal Subtract Doubleword + OptCategory[STARS_NN_palignr] = 1; // Packed Align Right + OptCategory[STARS_NN_pabsb] = 1; // Packed Absolute Value Byte + OptCategory[STARS_NN_pabsw] = 1; // Packed Absolute Value Word + OptCategory[STARS_NN_pabsd] = 1; // Packed Absolute Value Doubleword + + // VMX instructions + + OptCategory[STARS_NN_vmcall] = 1; // Call to VM Monitor + OptCategory[STARS_NN_vmclear] = 0; // Clear Virtual Machine Control Structure + OptCategory[STARS_NN_vmlaunch] = 1; // Launch Virtual Machine + OptCategory[STARS_NN_vmresume] = 1; // Resume Virtual Machine + OptCategory[STARS_NN_vmptrld] = 6; // Load Pointer to Virtual Machine Control Structure + OptCategory[STARS_NN_vmptrst] = 0; // Store Pointer to Virtual Machine Control Structure + OptCategory[STARS_NN_vmread] = 0; // Read Field from Virtual Machine Control Structure + OptCategory[STARS_NN_vmwrite] = 0; // Write Field from Virtual Machine Control Structure + OptCategory[STARS_NN_vmxoff] = 1; // Leave VMX Operation + OptCategory[STARS_NN_vmxon] = 1; // Enter VMX Operation + +#if 599 < IDA_SDK_VERSION + + OptCategory[STARS_NN_ud2] = 1; // Undefined Instruction + + // Added with x86-64 + + OptCategory[STARS_NN_rdtscp] = 10; // Read Time-Stamp Counter and Processor ID + + // Geode LX 3DNow! extensions + + OptCategory[STARS_NN_pfrcpv] = 1; // Reciprocal Approximation for a Pair of 32-bit Floats + OptCategory[STARS_NN_pfrsqrtv] = 1; // Reciprocal Square Root Approximation for a Pair of 32-bit Floats + + // SSE2 pseudoinstructions + + OptCategory[STARS_NN_cmpeqpd] = 1; // Packed Double-FP Compare EQ + OptCategory[STARS_NN_cmpltpd] = 1; // Packed Double-FP Compare LT + OptCategory[STARS_NN_cmplepd] = 1; // Packed Double-FP Compare LE + OptCategory[STARS_NN_cmpunordpd] = 1; // Packed Double-FP Compare UNORD + OptCategory[STARS_NN_cmpneqpd] = 1; // Packed Double-FP Compare NOT EQ + OptCategory[STARS_NN_cmpnltpd] = 1; // Packed Double-FP Compare NOT LT + OptCategory[STARS_NN_cmpnlepd] = 1; // Packed Double-FP Compare NOT LE + OptCategory[STARS_NN_cmpordpd] = 1; // Packed Double-FP Compare ORDERED + OptCategory[STARS_NN_cmpeqsd] = 1; // Scalar Double-FP Compare EQ + OptCategory[STARS_NN_cmpltsd] = 1; // Scalar Double-FP Compare LT + OptCategory[STARS_NN_cmplesd] = 1; // Scalar Double-FP Compare LE + OptCategory[STARS_NN_cmpunordsd] = 1; // Scalar Double-FP Compare UNORD + OptCategory[STARS_NN_cmpneqsd] = 1; // Scalar Double-FP Compare NOT EQ + OptCategory[STARS_NN_cmpnltsd] = 1; // Scalar Double-FP Compare NOT LT + OptCategory[STARS_NN_cmpnlesd] = 1; // Scalar Double-FP Compare NOT LE + OptCategory[STARS_NN_cmpordsd] = 1; // Scalar Double-FP Compare ORDERED + + // SSSE4.1 instructions + + OptCategory[STARS_NN_blendpd] = 1; // Blend Packed Double Precision Floating-Point Values + OptCategory[STARS_NN_blendps] = 1; // Blend Packed Single Precision Floating-Point Values + OptCategory[STARS_NN_blendvpd] = 1; // Variable Blend Packed Double Precision Floating-Point Values + OptCategory[STARS_NN_blendvps] = 1; // Variable Blend Packed Single Precision Floating-Point Values + OptCategory[STARS_NN_dppd] = 1; // Dot Product of Packed Double Precision Floating-Point Values + OptCategory[STARS_NN_dpps] = 1; // Dot Product of Packed Single Precision Floating-Point Values + OptCategory[STARS_NN_extractps] = 2; // Extract Packed Single Precision Floating-Point Value + OptCategory[STARS_NN_insertps] = 1; // Insert Packed Single Precision Floating-Point Value + OptCategory[STARS_NN_movntdqa] = 0; // Load Double Quadword Non-Temporal Aligned Hint + OptCategory[STARS_NN_mpsadbw] = 1; // Compute Multiple Packed Sums of Absolute Difference + OptCategory[STARS_NN_packusdw] = 1; // Pack with Unsigned Saturation + OptCategory[STARS_NN_pblendvb] = 1; // Variable Blend Packed Bytes + OptCategory[STARS_NN_pblendw] = 1; // Blend Packed Words + OptCategory[STARS_NN_pcmpeqq] = 1; // Compare Packed Qword Data for Equal + OptCategory[STARS_NN_pextrb] = 1; // Extract Byte + OptCategory[STARS_NN_pextrd] = 1; // Extract Dword + OptCategory[STARS_NN_pextrq] = 1; // Extract Qword + OptCategory[STARS_NN_phminposuw] = 1; // Packed Horizontal Word Minimum + OptCategory[STARS_NN_pinsrb] = 1; // Insert Byte + OptCategory[STARS_NN_pinsrd] = 1; // Insert Dword + OptCategory[STARS_NN_pinsrq] = 1; // Insert Qword + OptCategory[STARS_NN_pmaxsb] = 1; // Maximum of Packed Signed Byte Integers + OptCategory[STARS_NN_pmaxsd] = 1; // Maximum of Packed Signed Dword Integers + OptCategory[STARS_NN_pmaxud] = 1; // Maximum of Packed Unsigned Dword Integers + OptCategory[STARS_NN_pmaxuw] = 1; // Maximum of Packed Word Integers + OptCategory[STARS_NN_pminsb] = 1; // Minimum of Packed Signed Byte Integers + OptCategory[STARS_NN_pminsd] = 1; // Minimum of Packed Signed Dword Integers + OptCategory[STARS_NN_pminud] = 1; // Minimum of Packed Unsigned Dword Integers + OptCategory[STARS_NN_pminuw] = 1; // Minimum of Packed Word Integers + OptCategory[STARS_NN_pmovsxbw] = 1; // Packed Move with Sign Extend + OptCategory[STARS_NN_pmovsxbd] = 1; // Packed Move with Sign Extend + OptCategory[STARS_NN_pmovsxbq] = 1; // Packed Move with Sign Extend + OptCategory[STARS_NN_pmovsxwd] = 1; // Packed Move with Sign Extend + OptCategory[STARS_NN_pmovsxwq] = 1; // Packed Move with Sign Extend + OptCategory[STARS_NN_pmovsxdq] = 1; // Packed Move with Sign Extend + OptCategory[STARS_NN_pmovzxbw] = 1; // Packed Move with Zero Extend + OptCategory[STARS_NN_pmovzxbd] = 1; // Packed Move with Zero Extend + OptCategory[STARS_NN_pmovzxbq] = 1; // Packed Move with Zero Extend + OptCategory[STARS_NN_pmovzxwd] = 1; // Packed Move with Zero Extend + OptCategory[STARS_NN_pmovzxwq] = 1; // Packed Move with Zero Extend + OptCategory[STARS_NN_pmovzxdq] = 1; // Packed Move with Zero Extend + OptCategory[STARS_NN_pmuldq] = 1; // Multiply Packed Signed Dword Integers + OptCategory[STARS_NN_pmulld] = 1; // Multiply Packed Signed Dword Integers and Store Low Result + OptCategory[STARS_NN_ptest] = 1; // Logical Compare + OptCategory[STARS_NN_roundpd] = 1; // Round Packed Double Precision Floating-Point Values + OptCategory[STARS_NN_roundps] = 1; // Round Packed Single Precision Floating-Point Values + OptCategory[STARS_NN_roundsd] = 1; // Round Scalar Double Precision Floating-Point Values + OptCategory[STARS_NN_roundss] = 1; // Round Scalar Single Precision Floating-Point Values + + // SSSE4.2 instructions + OptCategory[STARS_NN_crc32] = 2; // Accumulate CRC32 Value + OptCategory[STARS_NN_pcmpestri] = 2; // Packed Compare Explicit Length Strings, Return Index + OptCategory[STARS_NN_pcmpestrm] = 2; // Packed Compare Explicit Length Strings, Return Mask + OptCategory[STARS_NN_pcmpistri] = 2; // Packed Compare Implicit Length Strings, Return Index + OptCategory[STARS_NN_pcmpistrm] = 2; // Packed Compare Implicit Length Strings, Return Mask + OptCategory[STARS_NN_pcmpgtq] = 1; // Compare Packed Data for Greater Than + OptCategory[STARS_NN_popcnt] = 2; // Return the Count of Number of Bits Set to 1 + + // AMD SSE4a instructions + + OptCategory[STARS_NN_extrq] = 1; // Extract Field From Register + OptCategory[STARS_NN_insertq] = 1; // Insert Field + OptCategory[STARS_NN_movntsd] = 0; // Move Non-Temporal Scalar Double-Precision Floating-Point + OptCategory[STARS_NN_movntss] = 0; // Move Non-Temporal Scalar Single-Precision Floating-Point + OptCategory[STARS_NN_lzcnt] = 2; // Leading Zero Count + + // xsave/xrstor instructions + + OptCategory[STARS_NN_xgetbv] = 8; // Get Value of Extended Control Register + OptCategory[STARS_NN_xrstor] = 0; // Restore Processor Extended States + OptCategory[STARS_NN_xsave] = 1; // Save Processor Extended States + OptCategory[STARS_NN_xsetbv] = 1; // Set Value of Extended Control Register + + // Intel Safer Mode Extensions (SMX) + + OptCategory[STARS_NN_getsec] = 1; // Safer Mode Extensions (SMX) Instruction + + // AMD-V Virtualization ISA Extension + + OptCategory[STARS_NN_clgi] = 0; // Clear Global Interrupt Flag + OptCategory[STARS_NN_invlpga] = 1; // Invalidate TLB Entry in a Specified ASID + OptCategory[STARS_NN_skinit] = 1; // Secure Init and Jump with Attestation + OptCategory[STARS_NN_stgi] = 0; // Set Global Interrupt Flag + OptCategory[STARS_NN_vmexit] = 1; // Stop Executing Guest, Begin Executing Host + OptCategory[STARS_NN_vmload] = 0; // Load State from VMCB + OptCategory[STARS_NN_vmmcall] = 1; // Call VMM + OptCategory[STARS_NN_vmrun] = 1; // Run Virtual Machine + OptCategory[STARS_NN_vmsave] = 0; // Save State to VMCB + + // VMX+ instructions + + OptCategory[STARS_NN_invept] = 1; // Invalidate Translations Derived from EPT + OptCategory[STARS_NN_invvpid] = 1; // Invalidate Translations Based on VPID + + // Intel Atom instructions + + OptCategory[STARS_NN_movbe] = 3; // Move Data After Swapping Bytes + + // Intel AES instructions + + OptCategory[STARS_NN_aesenc] = 1; // Perform One Round of an AES Encryption Flow + OptCategory[STARS_NN_aesenclast] = 1; // Perform the Last Round of an AES Encryption Flow + OptCategory[STARS_NN_aesdec] = 1; // Perform One Round of an AES Decryption Flow + OptCategory[STARS_NN_aesdeclast] = 1; // Perform the Last Round of an AES Decryption Flow + OptCategory[STARS_NN_aesimc] = 1; // Perform the AES InvMixColumn Transformation + OptCategory[STARS_NN_aeskeygenassist] = 1; // AES Round Key Generation Assist + + // Carryless multiplication + + OptCategory[STARS_NN_pclmulqdq] = 1; // Carry-Less Multiplication Quadword + + // Returns modified by operand size prefixes + + OptCategory[STARS_NN_retnw] = 0; // Return Near from Procedure (use16) + OptCategory[STARS_NN_retnd] = 0; // Return Near from Procedure (use32) + OptCategory[STARS_NN_retnq] = 0; // Return Near from Procedure (use64) + OptCategory[STARS_NN_retfw] = 0; // Return Far from Procedure (use16) + OptCategory[STARS_NN_retfd] = 0; // Return Far from Procedure (use32) + OptCategory[STARS_NN_retfq] = 0; // Return Far from Procedure (use64) + + // RDRAND support + + OptCategory[STARS_NN_rdrand] = 2; // Read Random Number + + // new GPR instructions + + OptCategory[STARS_NN_adcx] = 5; // Unsigned Integer Addition of Two Operands with Carry Flag + OptCategory[STARS_NN_adox] = 5; // Unsigned Integer Addition of Two Operands with Overflow Flag + OptCategory[STARS_NN_andn] = 0; // Logical AND NOT + OptCategory[STARS_NN_bextr] = 2; // Bit Field Extract + OptCategory[STARS_NN_blsi] = 2; // Extract Lowest Set Isolated Bit + OptCategory[STARS_NN_blsmsk] = 2; // Get Mask Up to Lowest Set Bit + OptCategory[STARS_NN_blsr] = 2; // Reset Lowest Set Bit + OptCategory[STARS_NN_bzhi] = 2; // Zero High Bits Starting with Specified Bit Position + OptCategory[STARS_NN_clac] = 1; // Clear AC Flag in EFLAGS Register + OptCategory[STARS_NN_mulx] = 2; // Unsigned Multiply Without Affecting Flags + OptCategory[STARS_NN_pdep] = 2; // Parallel Bits Deposit + OptCategory[STARS_NN_pext] = 2; // Parallel Bits Extract + OptCategory[STARS_NN_rorx] = 2; // Rotate Right Logical Without Affecting Flags + OptCategory[STARS_NN_sarx] = 2; // Shift Arithmetically Right Without Affecting Flags + OptCategory[STARS_NN_shlx] = 2; // Shift Logically Left Without Affecting Flags + OptCategory[STARS_NN_shrx] = 2; // Shift Logically Right Without Affecting Flags + OptCategory[STARS_NN_stac] = 1; // Set AC Flag in EFLAGS Register + OptCategory[STARS_NN_tzcnt] = 2; // Count the Number of Trailing Zero Bits + OptCategory[STARS_NN_xsaveopt] = 1; // Save Processor Extended States Optimized + OptCategory[STARS_NN_invpcid] = 1; // Invalidate Processor Context ID + OptCategory[STARS_NN_rdseed] = 2; // Read Random Seed + OptCategory[STARS_NN_rdfsbase] = 6; // Read FS Segment Base + OptCategory[STARS_NN_rdgsbase] = 6; // Read GS Segment Base + OptCategory[STARS_NN_wrfsbase] = 6; // Write FS Segment Base + OptCategory[STARS_NN_wrgsbase] = 6; // Write GS Segment Base + + // new AVX instructions + + OptCategory[STARS_NN_vaddpd] = 1; // Add Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vaddps] = 1; // Packed Single-FP Add + OptCategory[STARS_NN_vaddsd] = 1; // Add Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vaddss] = 1; // Scalar Single-FP Add + OptCategory[STARS_NN_vaddsubpd] = 1; // Add /Sub packed DP FP numbers + OptCategory[STARS_NN_vaddsubps] = 1; // Add /Sub packed SP FP numbers + OptCategory[STARS_NN_vaesdec] = 1; // Perform One Round of an AES Decryption Flow + OptCategory[STARS_NN_vaesdeclast] = 1; // Perform the Last Round of an AES Decryption Flow + OptCategory[STARS_NN_vaesenc] = 1; // Perform One Round of an AES Encryption Flow + OptCategory[STARS_NN_vaesenclast] = 1; // Perform the Last Round of an AES Encryption Flow + OptCategory[STARS_NN_vaesimc] = 1; // Perform the AES InvMixColumn Transformation + OptCategory[STARS_NN_vaeskeygenassist] = 1; // AES Round Key Generation Assist + OptCategory[STARS_NN_vandnpd] = 1; // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vandnps] = 1; // Bitwise Logical And Not for Single-FP + OptCategory[STARS_NN_vandpd] = 1; // Bitwise Logical AND of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vandps] = 1; // Bitwise Logical And for Single-FP + OptCategory[STARS_NN_vblendpd] = 1; // Blend Packed Double Precision Floating-Point Values + OptCategory[STARS_NN_vblendps] = 1; // Blend Packed Single Precision Floating-Point Values + OptCategory[STARS_NN_vblendvpd] = 1; // Variable Blend Packed Double Precision Floating-Point Values + OptCategory[STARS_NN_vblendvps] = 1; // Variable Blend Packed Single Precision Floating-Point Values + OptCategory[STARS_NN_vbroadcastf128] = 1; // Broadcast 128 Bits of Floating-Point Data + OptCategory[STARS_NN_vbroadcasti128] = 1; // Broadcast 128 Bits of Integer Data + OptCategory[STARS_NN_vbroadcastsd] = 1; // Broadcast Double-Precision Floating-Point Element + OptCategory[STARS_NN_vbroadcastss] = 1; // Broadcast Single-Precision Floating-Point Element + OptCategory[STARS_NN_vcmppd] = 1; // Compare Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vcmpps] = 1; // Packed Single-FP Compare + OptCategory[STARS_NN_vcmpsd] = 1; // Compare Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vcmpss] = 1; // Scalar Single-FP Compare + OptCategory[STARS_NN_vcomisd] = 1; // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + OptCategory[STARS_NN_vcomiss] = 1; // Scalar Ordered Single-FP Compare and Set EFLAGS + OptCategory[STARS_NN_vcvtdq2pd] = 1; // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vcvtdq2ps] = 1; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vcvtpd2dq] = 1; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + OptCategory[STARS_NN_vcvtpd2ps] = 1; // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vcvtph2ps] = 1; // Convert 16-bit FP Values to Single-Precision FP Values + OptCategory[STARS_NN_vcvtps2dq] = 1; // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + OptCategory[STARS_NN_vcvtps2pd] = 1; // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vcvtps2ph] = 1; // Convert Single-Precision FP value to 16-bit FP value + OptCategory[STARS_NN_vcvtsd2si] = 1; // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer + OptCategory[STARS_NN_vcvtsd2ss] = 1; // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value + OptCategory[STARS_NN_vcvtsi2sd] = 1; // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value + OptCategory[STARS_NN_vcvtsi2ss] = 1; // Scalar signed INT32 to Single-FP conversion + OptCategory[STARS_NN_vcvtss2sd] = 1; // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value + OptCategory[STARS_NN_vcvtss2si] = 1; // Scalar Single-FP to signed INT32 conversion + OptCategory[STARS_NN_vcvttpd2dq] = 1; // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + OptCategory[STARS_NN_vcvttps2dq] = 1; // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + OptCategory[STARS_NN_vcvttsd2si] = 1; // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer + OptCategory[STARS_NN_vcvttss2si] = 1; // Scalar Single-FP to signed INT32 conversion (truncate) + OptCategory[STARS_NN_vdivpd] = 1; // Divide Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vdivps] = 1; // Packed Single-FP Divide + OptCategory[STARS_NN_vdivsd] = 1; // Divide Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vdivss] = 1; // Scalar Single-FP Divide + OptCategory[STARS_NN_vdppd] = 1; // Dot Product of Packed Double Precision Floating-Point Values + OptCategory[STARS_NN_vdpps] = 1; // Dot Product of Packed Single Precision Floating-Point Values + OptCategory[STARS_NN_vextractf128] = 1; // Extract Packed Floating-Point Values + OptCategory[STARS_NN_vextracti128] = 1; // Extract Packed Integer Values + OptCategory[STARS_NN_vextractps] = 1; // Extract Packed Floating-Point Values + OptCategory[STARS_NN_vfmadd132pd] = 1; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmadd132ps] = 1; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmadd132sd] = 1; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmadd132ss] = 1; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmadd213pd] = 1; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmadd213ps] = 1; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmadd213sd] = 1; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmadd213ss] = 1; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmadd231pd] = 1; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmadd231ps] = 1; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmadd231sd] = 1; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmadd231ss] = 1; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmaddsub132pd] = 1; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmaddsub132ps] = 1; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmaddsub213pd] = 1; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmaddsub213ps] = 1; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmaddsub231pd] = 1; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmaddsub231ps] = 1; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsub132pd] = 1; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsub132ps] = 1; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsub132sd] = 1; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsub132ss] = 1; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsub213pd] = 1; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsub213ps] = 1; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsub213sd] = 1; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsub213ss] = 1; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsub231pd] = 1; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsub231ps] = 1; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsub231sd] = 1; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsub231ss] = 1; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsubadd132pd] = 1; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsubadd132ps] = 1; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsubadd213pd] = 1; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsubadd213ps] = 1; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsubadd231pd] = 1; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfmsubadd231ps] = 1; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmadd132pd] = 1; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmadd132ps] = 1; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmadd132sd] = 1; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmadd132ss] = 1; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmadd213pd] = 1; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmadd213ps] = 1; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmadd213sd] = 1; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmadd213ss] = 1; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmadd231pd] = 1; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmadd231ps] = 1; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmadd231sd] = 1; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmadd231ss] = 1; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmsub132pd] = 1; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmsub132ps] = 1; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmsub132sd] = 1; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmsub132ss] = 1; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmsub213pd] = 1; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmsub213ps] = 1; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmsub213sd] = 1; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmsub213ss] = 1; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmsub231pd] = 1; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmsub231ps] = 1; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmsub231sd] = 1; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vfnmsub231ss] = 1; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + OptCategory[STARS_NN_vgatherdps] = 1; // Gather Packed SP FP Values Using Signed Dword Indices + OptCategory[STARS_NN_vgatherdpd] = 1; // Gather Packed DP FP Values Using Signed Dword Indices + OptCategory[STARS_NN_vgatherqps] = 1; // Gather Packed SP FP Values Using Signed Qword Indices + OptCategory[STARS_NN_vgatherqpd] = 1; // Gather Packed DP FP Values Using Signed Qword Indices + OptCategory[STARS_NN_vhaddpd] = 1; // Add horizontally packed DP FP numbers + OptCategory[STARS_NN_vhaddps] = 1; // Add horizontally packed SP FP numbers + OptCategory[STARS_NN_vhsubpd] = 1; // Sub horizontally packed DP FP numbers + OptCategory[STARS_NN_vhsubps] = 1; // Sub horizontally packed SP FP numbers + OptCategory[STARS_NN_vinsertf128] = 1; // Insert Packed Floating-Point Values + OptCategory[STARS_NN_vinserti128] = 1; // Insert Packed Integer Values + OptCategory[STARS_NN_vinsertps] = 1; // Insert Packed Single Precision Floating-Point Value + OptCategory[STARS_NN_vlddqu] = 1; // Load Unaligned Packed Integer Values + OptCategory[STARS_NN_vldmxcsr] = 1; // Load Streaming SIMD Extensions Technology Control/Status Register + OptCategory[STARS_NN_vmaskmovdqu] = 9; // Store Selected Bytes of Double Quadword with NT Hint + OptCategory[STARS_NN_vmaskmovpd] = 9; // Conditionally Load Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vmaskmovps] = 9; // Conditionally Load Packed Single-Precision Floating-Point Values + OptCategory[STARS_NN_vmaxpd] = 1; // Return Maximum Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vmaxps] = 1; // Packed Single-FP Maximum + OptCategory[STARS_NN_vmaxsd] = 1; // Return Maximum Scalar Double-Precision Floating-Point Value + OptCategory[STARS_NN_vmaxss] = 1; // Scalar Single-FP Maximum + OptCategory[STARS_NN_vminpd] = 1; // Return Minimum Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vminps] = 1; // Packed Single-FP Minimum + OptCategory[STARS_NN_vminsd] = 1; // Return Minimum Scalar Double-Precision Floating-Point Value + OptCategory[STARS_NN_vminss] = 1; // Scalar Single-FP Minimum + OptCategory[STARS_NN_vmovapd] = 9; // Move Aligned Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vmovaps] = 9; // Move Aligned Four Packed Single-FP + OptCategory[STARS_NN_vmovd] = 9; // Move 32 bits + OptCategory[STARS_NN_vmovddup] = 1; // Move One Double-FP and Duplicate + OptCategory[STARS_NN_vmovdqa] = 1; // Move Aligned Double Quadword + OptCategory[STARS_NN_vmovdqu] = 1; // Move Unaligned Double Quadword + OptCategory[STARS_NN_vmovhlps] = 1; // Move High to Low Packed Single-FP + OptCategory[STARS_NN_vmovhpd] = 1; // Move High Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vmovhps] = 1; // Move High Packed Single-FP + OptCategory[STARS_NN_vmovlhps] = 1; // Move Low to High Packed Single-FP + OptCategory[STARS_NN_vmovlpd] = 1; // Move Low Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vmovlps] = 1; // Move Low Packed Single-FP + OptCategory[STARS_NN_vmovmskpd] = 1; // Extract Packed Double-Precision Floating-Point Sign Mask + OptCategory[STARS_NN_vmovmskps] = 1; // Move Mask to Register + OptCategory[STARS_NN_vmovntdq] = 1; // Store Double Quadword Using Non-Temporal Hint + OptCategory[STARS_NN_vmovntdqa] = 1; // Load Double Quadword Non-Temporal Aligned Hint + OptCategory[STARS_NN_vmovntpd] = 1; // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint + OptCategory[STARS_NN_vmovntps] = 1; // Move Aligned Four Packed Single-FP Non Temporal + OptCategory[STARS_NN_vmovntsd] = 1; // Move Non-Temporal Scalar Double-Precision Floating-Point + OptCategory[STARS_NN_vmovntss] = 1; // Move Non-Temporal Scalar Single-Precision Floating-Point + OptCategory[STARS_NN_vmovq] = 1; // Move 64 bits + OptCategory[STARS_NN_vmovsd] = 1; // Move Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vmovshdup] = 1; // Move Packed Single-FP High and Duplicate + OptCategory[STARS_NN_vmovsldup] = 1; // Move Packed Single-FP Low and Duplicate + OptCategory[STARS_NN_vmovss] = 1; // Move Scalar Single-FP + OptCategory[STARS_NN_vmovupd] = 1; // Move Unaligned Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vmovups] = 1; // Move Unaligned Four Packed Single-FP + OptCategory[STARS_NN_vmpsadbw] = 1; // Compute Multiple Packed Sums of Absolute Difference + OptCategory[STARS_NN_vmulpd] = 1; // Multiply Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vmulps] = 1; // Packed Single-FP Multiply + OptCategory[STARS_NN_vmulsd] = 1; // Multiply Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vmulss] = 1; // Scalar Single-FP Multiply + OptCategory[STARS_NN_vorpd] = 1; // Bitwise Logical OR of Double-Precision Floating-Point Values + OptCategory[STARS_NN_vorps] = 1; // Bitwise Logical OR for Single-FP Data + OptCategory[STARS_NN_vpabsb] = 1; // Packed Absolute Value Byte + OptCategory[STARS_NN_vpabsd] = 1; // Packed Absolute Value Doubleword + OptCategory[STARS_NN_vpabsw] = 1; // Packed Absolute Value Word + OptCategory[STARS_NN_vpackssdw] = 1; // Pack with Signed Saturation (Dword->Word) + OptCategory[STARS_NN_vpacksswb] = 1; // Pack with Signed Saturation (Word->Byte) + OptCategory[STARS_NN_vpackusdw] = 1; // Pack with Unsigned Saturation + OptCategory[STARS_NN_vpackuswb] = 1; // Pack with Unsigned Saturation (Word->Byte) + OptCategory[STARS_NN_vpaddb] = 1; // Packed Add Byte + OptCategory[STARS_NN_vpaddd] = 1; // Packed Add Dword + OptCategory[STARS_NN_vpaddq] = 1; // Add Packed Quadword Integers + OptCategory[STARS_NN_vpaddsb] = 1; // Packed Add with Saturation (Byte) + OptCategory[STARS_NN_vpaddsw] = 1; // Packed Add with Saturation (Word) + OptCategory[STARS_NN_vpaddusb] = 1; // Packed Add Unsigned with Saturation (Byte) + OptCategory[STARS_NN_vpaddusw] = 1; // Packed Add Unsigned with Saturation (Word) + OptCategory[STARS_NN_vpaddw] = 1; // Packed Add Word + OptCategory[STARS_NN_vpalignr] = 1; // Packed Align Right + OptCategory[STARS_NN_vpand] = 1; // Bitwise Logical And + OptCategory[STARS_NN_vpandn] = 1; // Bitwise Logical And Not + OptCategory[STARS_NN_vpavgb] = 1; // Packed Average (Byte) + OptCategory[STARS_NN_vpavgw] = 1; // Packed Average (Word) + OptCategory[STARS_NN_vpblendd] = 1; // Blend Packed Dwords + OptCategory[STARS_NN_vpblendvb] = 1; // Variable Blend Packed Bytes + OptCategory[STARS_NN_vpblendw] = 1; // Blend Packed Words + OptCategory[STARS_NN_vpbroadcastb] = 1; // Broadcast a Byte Integer + OptCategory[STARS_NN_vpbroadcastd] = 1; // Broadcast a Dword Integer + OptCategory[STARS_NN_vpbroadcastq] = 1; // Broadcast a Qword Integer + OptCategory[STARS_NN_vpbroadcastw] = 1; // Broadcast a Word Integer + OptCategory[STARS_NN_vpclmulqdq] = 1; // Carry-Less Multiplication Quadword + OptCategory[STARS_NN_vpcmpeqb] = 1; // Packed Compare for Equal (Byte) + OptCategory[STARS_NN_vpcmpeqd] = 1; // Packed Compare for Equal (Dword) + OptCategory[STARS_NN_vpcmpeqq] = 1; // Compare Packed Qword Data for Equal + OptCategory[STARS_NN_vpcmpeqw] = 1; // Packed Compare for Equal (Word) + OptCategory[STARS_NN_vpcmpestri] = 1; // Packed Compare Explicit Length Strings, Return Index + OptCategory[STARS_NN_vpcmpestrm] = 1; // Packed Compare Explicit Length Strings, Return Mask + OptCategory[STARS_NN_vpcmpgtb] = 1; // Packed Compare for Greater Than (Byte) + OptCategory[STARS_NN_vpcmpgtd] = 1; // Packed Compare for Greater Than (Dword) + OptCategory[STARS_NN_vpcmpgtq] = 1; // Compare Packed Data for Greater Than + OptCategory[STARS_NN_vpcmpgtw] = 1; // Packed Compare for Greater Than (Word) + OptCategory[STARS_NN_vpcmpistri] = 1; // Packed Compare Implicit Length Strings, Return Index + OptCategory[STARS_NN_vpcmpistrm] = 1; // Packed Compare Implicit Length Strings, Return Mask + OptCategory[STARS_NN_vperm2f128] = 1; // Permute Floating-Point Values + OptCategory[STARS_NN_vperm2i128] = 1; // Permute Integer Values + OptCategory[STARS_NN_vpermd] = 1; // Full Doublewords Element Permutation + OptCategory[STARS_NN_vpermilpd] = 1; // Permute Double-Precision Floating-Point Values + OptCategory[STARS_NN_vpermilps] = 1; // Permute Single-Precision Floating-Point Values + OptCategory[STARS_NN_vpermpd] = 1; // Permute Double-Precision Floating-Point Elements + OptCategory[STARS_NN_vpermps] = 1; // Permute Single-Precision Floating-Point Elements + OptCategory[STARS_NN_vpermq] = 1; // Qwords Element Permutation + OptCategory[STARS_NN_vpextrb] = 1; // Extract Byte + OptCategory[STARS_NN_vpextrd] = 1; // Extract Dword + OptCategory[STARS_NN_vpextrq] = 1; // Extract Qword + OptCategory[STARS_NN_vpextrw] = 1; // Extract Word + OptCategory[STARS_NN_vpgatherdd] = 1; // Gather Packed Dword Values Using Signed Dword Indices + OptCategory[STARS_NN_vpgatherdq] = 1; // Gather Packed Qword Values Using Signed Dword Indices + OptCategory[STARS_NN_vpgatherqd] = 1; // Gather Packed Dword Values Using Signed Qword Indices + OptCategory[STARS_NN_vpgatherqq] = 1; // Gather Packed Qword Values Using Signed Qword Indices + OptCategory[STARS_NN_vphaddd] = 1; // Packed Horizontal Add Doubleword + OptCategory[STARS_NN_vphaddsw] = 1; // Packed Horizontal Add and Saturate + OptCategory[STARS_NN_vphaddw] = 1; // Packed Horizontal Add Word + OptCategory[STARS_NN_vphminposuw] = 1; // Packed Horizontal Word Minimum + OptCategory[STARS_NN_vphsubd] = 1; // Packed Horizontal Subtract Doubleword + OptCategory[STARS_NN_vphsubsw] = 1; // Packed Horizontal Subtract and Saturate + OptCategory[STARS_NN_vphsubw] = 1; // Packed Horizontal Subtract Word + OptCategory[STARS_NN_vpinsrb] = 1; // Insert Byte + OptCategory[STARS_NN_vpinsrd] = 1; // Insert Dword + OptCategory[STARS_NN_vpinsrq] = 1; // Insert Qword + OptCategory[STARS_NN_vpinsrw] = 1; // Insert Word + OptCategory[STARS_NN_vpmaddubsw] = 1; // Multiply and Add Packed Signed and Unsigned Bytes + OptCategory[STARS_NN_vpmaddwd] = 1; // Packed Multiply and Add + OptCategory[STARS_NN_vpmaskmovd] = 1; // Conditionally Store Dword Values Using Mask + OptCategory[STARS_NN_vpmaskmovq] = 1; // Conditionally Store Qword Values Using Mask + OptCategory[STARS_NN_vpmaxsb] = 1; // Maximum of Packed Signed Byte Integers + OptCategory[STARS_NN_vpmaxsd] = 1; // Maximum of Packed Signed Dword Integers + OptCategory[STARS_NN_vpmaxsw] = 1; // Packed Signed Integer Word Maximum + OptCategory[STARS_NN_vpmaxub] = 1; // Packed Unsigned Integer Byte Maximum + OptCategory[STARS_NN_vpmaxud] = 1; // Maximum of Packed Unsigned Dword Integers + OptCategory[STARS_NN_vpmaxuw] = 1; // Maximum of Packed Word Integers + OptCategory[STARS_NN_vpminsb] = 1; // Minimum of Packed Signed Byte Integers + OptCategory[STARS_NN_vpminsd] = 1; // Minimum of Packed Signed Dword Integers + OptCategory[STARS_NN_vpminsw] = 1; // Packed Signed Integer Word Minimum + OptCategory[STARS_NN_vpminub] = 1; // Packed Unsigned Integer Byte Minimum + OptCategory[STARS_NN_vpminud] = 1; // Minimum of Packed Unsigned Dword Integers + OptCategory[STARS_NN_vpminuw] = 1; // Minimum of Packed Word Integers + OptCategory[STARS_NN_vpmovmskb] = 1; // Move Byte Mask to Integer + OptCategory[STARS_NN_vpmovsxbd] = 1; // Packed Move with Sign Extend + OptCategory[STARS_NN_vpmovsxbq] = 1; // Packed Move with Sign Extend + OptCategory[STARS_NN_vpmovsxbw] = 1; // Packed Move with Sign Extend + OptCategory[STARS_NN_vpmovsxdq] = 1; // Packed Move with Sign Extend + OptCategory[STARS_NN_vpmovsxwd] = 1; // Packed Move with Sign Extend + OptCategory[STARS_NN_vpmovsxwq] = 1; // Packed Move with Sign Extend + OptCategory[STARS_NN_vpmovzxbd] = 1; // Packed Move with Zero Extend + OptCategory[STARS_NN_vpmovzxbq] = 1; // Packed Move with Zero Extend + OptCategory[STARS_NN_vpmovzxbw] = 1; // Packed Move with Zero Extend + OptCategory[STARS_NN_vpmovzxdq] = 1; // Packed Move with Zero Extend + OptCategory[STARS_NN_vpmovzxwd] = 1; // Packed Move with Zero Extend + OptCategory[STARS_NN_vpmovzxwq] = 1; // Packed Move with Zero Extend + OptCategory[STARS_NN_vpmuldq] = 1; // Multiply Packed Signed Dword Integers + OptCategory[STARS_NN_vpmulhrsw] = 1; // Packed Multiply High with Round and Scale + OptCategory[STARS_NN_vpmulhuw] = 1; // Packed Multiply High Unsigned + OptCategory[STARS_NN_vpmulhw] = 1; // Packed Multiply High + OptCategory[STARS_NN_vpmulld] = 1; // Multiply Packed Signed Dword Integers and Store Low Result + OptCategory[STARS_NN_vpmullw] = 1; // Packed Multiply Low + OptCategory[STARS_NN_vpmuludq] = 1; // Multiply Packed Unsigned Doubleword Integers + OptCategory[STARS_NN_vpor] = 1; // Bitwise Logical Or + OptCategory[STARS_NN_vpsadbw] = 1; // Packed Sum of Absolute Differences + OptCategory[STARS_NN_vpshufb] = 1; // Packed Shuffle Bytes + OptCategory[STARS_NN_vpshufd] = 1; // Shuffle Packed Doublewords + OptCategory[STARS_NN_vpshufhw] = 1; // Shuffle Packed High Words + OptCategory[STARS_NN_vpshuflw] = 1; // Shuffle Packed Low Words + OptCategory[STARS_NN_vpsignb] = 1; // Packed SIGN Byte + OptCategory[STARS_NN_vpsignd] = 1; // Packed SIGN Doubleword + OptCategory[STARS_NN_vpsignw] = 1; // Packed SIGN Word + OptCategory[STARS_NN_vpslld] = 1; // Packed Shift Left Logical (Dword) + OptCategory[STARS_NN_vpslldq] = 1; // Shift Double Quadword Left Logical + OptCategory[STARS_NN_vpsllq] = 1; // Packed Shift Left Logical (Qword) + OptCategory[STARS_NN_vpsllvd] = 1; // Variable Bit Shift Left Logical (Dword) + OptCategory[STARS_NN_vpsllvq] = 1; // Variable Bit Shift Left Logical (Qword) + OptCategory[STARS_NN_vpsllw] = 1; // Packed Shift Left Logical (Word) + OptCategory[STARS_NN_vpsrad] = 1; // Packed Shift Right Arithmetic (Dword) + OptCategory[STARS_NN_vpsravd] = 1; // Variable Bit Shift Right Arithmetic + OptCategory[STARS_NN_vpsraw] = 1; // Packed Shift Right Arithmetic (Word) + OptCategory[STARS_NN_vpsrld] = 1; // Packed Shift Right Logical (Dword) + OptCategory[STARS_NN_vpsrldq] = 1; // Shift Double Quadword Right Logical (Qword) + OptCategory[STARS_NN_vpsrlq] = 1; // Packed Shift Right Logical (Qword) + OptCategory[STARS_NN_vpsrlvd] = 1; // Variable Bit Shift Right Logical (Dword) + OptCategory[STARS_NN_vpsrlvq] = 1; // Variable Bit Shift Right Logical (Qword) + OptCategory[STARS_NN_vpsrlw] = 1; // Packed Shift Right Logical (Word) + OptCategory[STARS_NN_vpsubb] = 1; // Packed Subtract Byte + OptCategory[STARS_NN_vpsubd] = 1; // Packed Subtract Dword + OptCategory[STARS_NN_vpsubq] = 1; // Subtract Packed Quadword Integers + OptCategory[STARS_NN_vpsubsb] = 1; // Packed Subtract with Saturation (Byte) + OptCategory[STARS_NN_vpsubsw] = 1; // Packed Subtract with Saturation (Word) + OptCategory[STARS_NN_vpsubusb] = 1; // Packed Subtract Unsigned with Saturation (Byte) + OptCategory[STARS_NN_vpsubusw] = 1; // Packed Subtract Unsigned with Saturation (Word) + OptCategory[STARS_NN_vpsubw] = 1; // Packed Subtract Word + OptCategory[STARS_NN_vptest] = 1; // Logical Compare + OptCategory[STARS_NN_vpunpckhbw] = 1; // Unpack High Packed Data (Byte->Word) + OptCategory[STARS_NN_vpunpckhdq] = 1; // Unpack High Packed Data (Dword->Qword) + OptCategory[STARS_NN_vpunpckhqdq] = 1; // Unpack High Packed Data (Qword->Xmmword) + OptCategory[STARS_NN_vpunpckhwd] = 1; // Unpack High Packed Data (Word->Dword) + OptCategory[STARS_NN_vpunpcklbw] = 1; // Unpack Low Packed Data (Byte->Word) + OptCategory[STARS_NN_vpunpckldq] = 1; // Unpack Low Packed Data (Dword->Qword) + OptCategory[STARS_NN_vpunpcklqdq] = 1; // Unpack Low Packed Data (Qword->Xmmword) + OptCategory[STARS_NN_vpunpcklwd] = 1; // Unpack Low Packed Data (Word->Dword) + OptCategory[STARS_NN_vpxor] = 1; // Bitwise Logical Exclusive Or + OptCategory[STARS_NN_vrcpps] = 1; // Packed Single-FP Reciprocal + OptCategory[STARS_NN_vrcpss] = 1; // Scalar Single-FP Reciprocal + OptCategory[STARS_NN_vroundpd] = 1; // Round Packed Double Precision Floating-Point Values + OptCategory[STARS_NN_vroundps] = 1; // Round Packed Single Precision Floating-Point Values + OptCategory[STARS_NN_vroundsd] = 1; // Round Scalar Double Precision Floating-Point Values + OptCategory[STARS_NN_vroundss] = 1; // Round Scalar Single Precision Floating-Point Values + OptCategory[STARS_NN_vrsqrtps] = 1; // Packed Single-FP Square Root Reciprocal + OptCategory[STARS_NN_vrsqrtss] = 1; // Scalar Single-FP Square Root Reciprocal + OptCategory[STARS_NN_vshufpd] = 1; // Shuffle Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vshufps] = 1; // Shuffle Single-FP + OptCategory[STARS_NN_vsqrtpd] = 1; // Compute Square Roots of Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vsqrtps] = 1; // Packed Single-FP Square Root + OptCategory[STARS_NN_vsqrtsd] = 1; // Compute Square Rootof Scalar Double-Precision Floating-Point Value + OptCategory[STARS_NN_vsqrtss] = 1; // Scalar Single-FP Square Root + OptCategory[STARS_NN_vstmxcsr] = 1; // Store Streaming SIMD Extensions Technology Control/Status Register + OptCategory[STARS_NN_vsubpd] = 1; // Subtract Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vsubps] = 1; // Packed Single-FP Subtract + OptCategory[STARS_NN_vsubsd] = 1; // Subtract Scalar Double-Precision Floating-Point Values + OptCategory[STARS_NN_vsubss] = 1; // Scalar Single-FP Subtract + OptCategory[STARS_NN_vtestpd] = 1; // Packed Double-Precision Floating-Point Bit Test + OptCategory[STARS_NN_vtestps] = 1; // Packed Single-Precision Floating-Point Bit Test + OptCategory[STARS_NN_vucomisd] = 1; // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + OptCategory[STARS_NN_vucomiss] = 1; // Scalar Unordered Single-FP Compare and Set EFLAGS + OptCategory[STARS_NN_vunpckhpd] = 1; // Unpack and Interleave High Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vunpckhps] = 1; // Unpack High Packed Single-FP Data + OptCategory[STARS_NN_vunpcklpd] = 1; // Unpack and Interleave Low Packed Double-Precision Floating-Point Values + OptCategory[STARS_NN_vunpcklps] = 1; // Unpack Low Packed Single-FP Data + OptCategory[STARS_NN_vxorpd] = 1; // Bitwise Logical OR of Double-Precision Floating-Point Values + OptCategory[STARS_NN_vxorps] = 1; // Bitwise Logical XOR for Single-FP Data + OptCategory[STARS_NN_vzeroall] = 1; // Zero All YMM Registers + OptCategory[STARS_NN_vzeroupper] = 1; // Zero Upper Bits of YMM Registers + + // Transactional Synchronization Extensions + + OptCategory[STARS_NN_xabort] = 1; // Transaction Abort + OptCategory[STARS_NN_xbegin] = 1; // Transaction Begin + OptCategory[STARS_NN_xend] = 1; // Transaction End + OptCategory[STARS_NN_xtest] = 1; // Test If In Transactional Execution + + // Virtual PC synthetic instructions + + OptCategory[STARS_NN_vmgetinfo] = 1; // Virtual PC - Get VM Information + OptCategory[STARS_NN_vmsetinfo] = 1; // Virtual PC - Set VM Information + OptCategory[STARS_NN_vmdxdsbl] = 1; // Virtual PC - Disable Direct Execution + OptCategory[STARS_NN_vmdxenbl] = 1; // Virtual PC - Enable Direct Execution + OptCategory[STARS_NN_vmcpuid] = 1; // Virtual PC - Virtualized CPU Information + OptCategory[STARS_NN_vmhlt] = 1; // Virtual PC - Halt + OptCategory[STARS_NN_vmsplaf] = 1; // Virtual PC - Spin Lock Acquisition Failed + OptCategory[STARS_NN_vmpushfd] = 1; // Virtual PC - Push virtualized flags register + OptCategory[STARS_NN_vmpopfd] = 1; // Virtual PC - Pop virtualized flags register + OptCategory[STARS_NN_vmcli] = 1; // Virtual PC - Clear Interrupt Flag + OptCategory[STARS_NN_vmsti] = 1; // Virtual PC - Set Interrupt Flag + OptCategory[STARS_NN_vmiretd] = 1; // Virtual PC - Return From Interrupt + OptCategory[STARS_NN_vmsgdt] = 1; // Virtual PC - Store Global Descriptor Table + OptCategory[STARS_NN_vmsidt] = 1; // Virtual PC - Store Interrupt Descriptor Table + OptCategory[STARS_NN_vmsldt] = 1; // Virtual PC - Store Local Descriptor Table + OptCategory[STARS_NN_vmstr] = 1; // Virtual PC - Store Task Register + OptCategory[STARS_NN_vmsdte] = 1; // Virtual PC - Store to Descriptor Table Entry + OptCategory[STARS_NN_vpcext] = 1; // Virtual PC - ISA extension + +#endif // 599 < IDA_SDK_VERSION + + OptCategory[STARS_NN_last] = 1; + + return; + +} // end of STARS_Program_t::InitOptCategory() + +// Initialize the StackAlteration[] array to define how opcodes adjust the stack pointer. +void STARS_Program_t::InitStackAlteration(void) { + // Default category is 0; most instructions do not alter the stack pointer. + (void)memset(StackAlteration, 0, sizeof(StackAlteration)); + + // Many arithmetic instructions could alter the stack pointer. We will have to + // examine each instruction that performs addition, subtraction, logical AND, etc., + // to determine if the stack pointer was the DEF operand. We cannot use a purely + // table driven approach to compute stack pointer alteration. The table is used for + // the deterministic cases, e.g. push, pop, call, return. Because of variability on + // a few of these instructions, a value of 1 in the table below is a trigger to investigate RTLs + // that might or might not alter the stack pointer, e.g. add, subtract, etc., or that might + // have operand-dependent effects on the stack pointer. + + StackAlteration[STARS_NN_add] = 1; // Addition; check operands for stack pointer + StackAlteration[STARS_NN_adc] = 1; // Addition; check operands for stack pointer ; RARE for stack pointer + StackAlteration[STARS_NN_and] = 1; // Logical AND; check operands for stack pointer + StackAlteration[STARS_NN_call] = -((STARS_sval_t) this->GetSTARS_ISA_Bytewidth()); // Call Procedure; -4, but return cancels it to zero + StackAlteration[STARS_NN_callfi] = -2 * ((STARS_sval_t) this->GetSTARS_ISA_Bytewidth()); // Indirect Call Far Procedure; -8, but far return cancels it to zero + StackAlteration[STARS_NN_callni] = -((STARS_sval_t) this->GetSTARS_ISA_Bytewidth()); // Indirect Call Near Procedure; -4, but return cancels it to zero + StackAlteration[STARS_NN_enterw] = 1; // Make Stack Frame for Procedure Parameters ** + StackAlteration[STARS_NN_enter] = 1; // Make Stack Frame for Procedure Parameters ** + StackAlteration[STARS_NN_enterd] = 1; // Make Stack Frame for Procedure Parameters ** + StackAlteration[STARS_NN_enterq] = 1; // Make Stack Frame for Procedure Parameters ** + StackAlteration[STARS_NN_int] = 0; // Call to Interrupt Procedure + StackAlteration[STARS_NN_into] = 0; // Call to Interrupt Procedure if Overflow Flag = 1 + StackAlteration[STARS_NN_int3] = 0; // Trap to Debugger + StackAlteration[STARS_NN_iretw] = 6; // Interrupt Return + StackAlteration[STARS_NN_iret] = 12; // Interrupt Return + StackAlteration[STARS_NN_iretd] = 12; // Interrupt Return (use32) + StackAlteration[STARS_NN_iretq] = 40; // Interrupt Return (use64) + StackAlteration[STARS_NN_lea] = 1; // Load Effective Address (can be used for basic arithmetic assignments) + StackAlteration[STARS_NN_leavew] = 1; // High Level Procedure Exit ** + StackAlteration[STARS_NN_leave] = 1; // High Level Procedure Exit ** + StackAlteration[STARS_NN_leaved] = 1; // High Level Procedure Exit ** + StackAlteration[STARS_NN_leaveq] = 1; // High Level Procedure Exit ** + StackAlteration[STARS_NN_mov] = 1; // Move Data ; could be esp := ebp (deallocate stack frame) or esp := ebx (unknown) + StackAlteration[STARS_NN_pop] = 1; // Pop a word from the Stack ; could be 16-bit or 32-bit operand, etc. + StackAlteration[STARS_NN_popaw] = 14; // Pop all General Registers + StackAlteration[STARS_NN_popa] = 28; // Pop all General Registers + StackAlteration[STARS_NN_popad] = 28; // Pop all General Registers (use32) + StackAlteration[STARS_NN_popaq] = 56; // Pop all General Registers (use64) + StackAlteration[STARS_NN_popfw] = 2; // Pop Stack into Flags Register ** + StackAlteration[STARS_NN_popf] = 4; // Pop Stack into Flags Register ** + StackAlteration[STARS_NN_popfd] = 4; // Pop Stack into Eflags Register ** + StackAlteration[STARS_NN_popfq] = 8; // Pop Stack into Rflags Register ** + StackAlteration[STARS_NN_push] = 1; // Push Operand onto the Stack ; could be 16-bit or 32-bit operand, etc. + StackAlteration[STARS_NN_pushaw] = -14; // Push all General Registers + StackAlteration[STARS_NN_pusha] = -28; // Push all General Registers + StackAlteration[STARS_NN_pushad] = -28; // Push all General Registers (use32) + StackAlteration[STARS_NN_pushaq] = -56; // Push all General Registers (use64) + StackAlteration[STARS_NN_pushfw] = -2; // Push Flags Register onto the Stack + StackAlteration[STARS_NN_pushf] = -4; // Push Flags Register onto the Stack + StackAlteration[STARS_NN_pushfd] = -4; // Push Flags Register onto the Stack (use32) + StackAlteration[STARS_NN_pushfq] = -8; // Push Flags Register onto the Stack (use64) + StackAlteration[STARS_NN_retn] = 1; // Return Near from Procedure (usually 4 bytes) + StackAlteration[STARS_NN_retf] = 1; // Return Far from Procedure (usually 8 bytes) + StackAlteration[STARS_NN_sub] = 1; // Subtraction; check operands for stack pointer + StackAlteration[STARS_NN_sbb] = 1; // Subtraction; check operands for stack pointer ; RARE for stack pointer + + // + // 486 instructions + // + + + // + // Pentium instructions + // + + + // + // Pentium Pro instructions + // + + + // + // FPP instructions + // + + + // + // 80387 instructions + // + + // + // Instructions added 28.02.96 + // + + StackAlteration[STARS_NN_loadall] = 0; // Load the entire CPU state from ES:EDI ?? Cannot find in Intel manuals + + // + // MMX instructions + // + + + // + // Undocumented Deschutes processor instructions + // + + // Pentium II instructions + + StackAlteration[STARS_NN_sysenter] = 0; // Fast Transition to System Call Entry Point + StackAlteration[STARS_NN_sysexit] = 0; // Fast Transition from System Call Entry Point + + // 3DNow! instructions + + + // Pentium III instructions + + + // Pentium III Pseudo instructions + + // AMD K7 instructions + + // Revisit AMD if we port to it. + + // Undocumented FP instructions (thanks to norbert.juffa@adm.com) + + // Pentium 4 instructions + + + // AMD syscall/sysret instructions NOTE: not AMD, found in Intel manual + + StackAlteration[STARS_NN_syscall] = 0; // Low latency system call + StackAlteration[STARS_NN_sysret] = 0; // Return from system call + + // AMD64 instructions NOTE: not AMD, found in Intel manual + + // New Pentium instructions (SSE3) + + + // Missing AMD64 instructions NOTE: also found in Intel manual + + // SSE3 instructions + + // SSSE3 instructions + + + // VMX instructions + +#if 599 < IDA_SDK_VERSION + + // Added with x86-64 + + // Geode LX 3DNow! extensions + + // SSE2 pseudoinstructions + + + // SSSE4.1 instructions + + + // SSSE4.2 instructions + + // AMD SSE4a instructions + + // xsave/xrstor instructions + + // Intel Safer Mode Extensions (SMX) + + // AMD-V Virtualization ISA Extension + + // VMX+ instructions + + // Intel Atom instructions + + // Intel AES instructions + + // Carryless multiplication + + // Returns modified by operand size prefixes + + StackAlteration[STARS_NN_retnw] = 1; // Return Near from Procedure (use16) + StackAlteration[STARS_NN_retnd] = 1; // Return Near from Procedure (use32) + StackAlteration[STARS_NN_retnq] = 1; // Return Near from Procedure (use64) + StackAlteration[STARS_NN_retfw] = 1; // Return Far from Procedure (use16) + StackAlteration[STARS_NN_retfd] = 1; // Return Far from Procedure (use32) + StackAlteration[STARS_NN_retfq] = 1; // Return Far from Procedure (use64) + + // RDRAND support + + // new GPR instructions + + // new AVX instructions + + // Transactional Synchronization Extensions + + // Virtual PC synthetic instructions + +#endif // 599 < IDA_SDK_VERSION + + StackAlteration[STARS_NN_last] = 0; + + return; + +} // end STARS_Program_t::InitStackAlteration() + +// Initialize the lookup maps that are used to define the FG info that can +// be inferred from a library function name. +void STARS_Program_t::InitLibFuncFGInfoMaps(void) { + struct FineGrainedInfo FGEntry; + pair<string, struct FineGrainedInfo> MapEntry; + pair<map<string, struct FineGrainedInfo>::iterator, bool> InsertResult; + + // Add functions that return signed integers. + FGEntry.SignMiscInfo = FG_MASK_SIGNED; + FGEntry.SizeInfo = (FG_MASK_INTEGER | ComputeOperandBitWidthMask(nullptr, sizeof(int))); + MapEntry.second = FGEntry; + + MapEntry.first = "atoi"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strcmp"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strcoll"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strncmp"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "memcmp"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "isalnum"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "isalpha"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "islower"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "isupper"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "isdigit"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "isxdigit"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "iscntrl"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "isgraph"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "isblank"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "isspace"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "isprint"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "ispunct"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + // Functions that return signed longs. + if (sizeof(long int) != sizeof(int)) { + FGEntry.SizeInfo = (FG_MASK_INTEGER | ComputeOperandBitWidthMask(nullptr, sizeof(long int))); + MapEntry.second = FGEntry; + } + + MapEntry.first = "atol"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strtol"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + // Functions that return signed long longs. + if (sizeof(long long int) != sizeof(long int)) { + FGEntry.SizeInfo = (FG_MASK_INTEGER | ComputeOperandBitWidthMask(nullptr, sizeof(long long int))); + MapEntry.second = FGEntry; + } + + MapEntry.first = "atoll"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strtoll"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + // Functions that return unsigned long longs. + FGEntry.SignMiscInfo = FG_MASK_UNSIGNED; + MapEntry.second = FGEntry; + + MapEntry.first = "strtoull"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + // Functions that return unsigned longs. + if (sizeof(long long int) != sizeof(long int)) { + FGEntry.SizeInfo = (FG_MASK_INTEGER | ComputeOperandBitWidthMask(nullptr, sizeof(long int))); + MapEntry.second = FGEntry; + } + + MapEntry.first = "strtoul"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + // Functions that return size_t. + FGEntry.SizeInfo = (FG_MASK_INTEGER | ComputeOperandBitWidthMask(nullptr, sizeof(size_t))); + FGEntry.SignMiscInfo = FG_MASK_UNSIGNED; + MapEntry.second = FGEntry; + + MapEntry.first = "strlen"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strxfrm"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strspn"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strcspn"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strftime"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + // Functions that return (char *). + FGEntry.SizeInfo = (FG_MASK_DATAPOINTER | ComputeOperandBitWidthMask(nullptr, sizeof(char *))); + FGEntry.SignMiscInfo = FG_MASK_UNSIGNED; + MapEntry.second = FGEntry; + + MapEntry.first = "strcpy"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strncpy"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strcat"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strncat"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strchr"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strrchr"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strpbrk"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strstr"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strtok"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "strerror"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "asctime"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "ctime"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + // Functions that return (void *) or a similar data pointer. + FGEntry.SizeInfo = (FG_MASK_DATAPOINTER | ComputeOperandBitWidthMask(nullptr, sizeof(void *))); + FGEntry.SignMiscInfo = FG_MASK_UNSIGNED; + MapEntry.second = FGEntry; + + MapEntry.first = "setlocale"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "localeconv"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "malloc"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "calloc"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "realloc"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "memchr"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "memcpy"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "mempcpy"; // non-standard, found in glibc + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "memmove"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "memset"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "gmtime"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + MapEntry.first = "localtime"; + InsertResult = ReturnRegisterTypeMap.insert(MapEntry); + assert(InsertResult.second); + + // Functions that return bool. + FGEntry.SizeInfo = (FG_MASK_INTEGER | ComputeOperandBitWidthMask(nullptr, sizeof(bool))); + FGEntry.SignMiscInfo = FG_MASK_UNSIGNED; + MapEntry.second = FGEntry; + + + // NOTE: Add <math.h> functions later. + + return; +} // end of STARS_Program_t::InitLibFuncFGInfoMaps() + +// Initialize the DFACategory[] array to define instruction classes +// for the purposes of data flow analysis. +void STARS_Program_t::InitDFACategory(void) { + // Default category is 0, not the start or end of a basic block. + (void) memset(DFACategory, 0, sizeof(DFACategory)); + + DFACategory[STARS_NN_call] = CALL; // Call Procedure + DFACategory[STARS_NN_callfi] = INDIR_CALL; // Indirect Call Far Procedure + DFACategory[STARS_NN_callni] = INDIR_CALL; // Indirect Call Near Procedure + + DFACategory[STARS_NN_hlt] = HALT; // Halt + + DFACategory[STARS_NN_int] = INDIR_CALL; // Call to Interrupt Procedure + DFACategory[STARS_NN_into] = INDIR_CALL; // Call to Interrupt Procedure if Overflow Flag = 1 + DFACategory[STARS_NN_int3] = INDIR_CALL; // Trap to Debugger + DFACategory[STARS_NN_iretw] = RETURN; // Interrupt Return + DFACategory[STARS_NN_iret] = RETURN; // Interrupt Return + DFACategory[STARS_NN_iretd] = RETURN; // Interrupt Return (use32) + DFACategory[STARS_NN_iretq] = RETURN; // Interrupt Return (use64) + DFACategory[STARS_NN_ja] = COND_BRANCH; // Jump if Above (CF=0 & ZF=0) + DFACategory[STARS_NN_jae] = COND_BRANCH; // Jump if Above or Equal (CF=0) + DFACategory[STARS_NN_jb] = COND_BRANCH; // Jump if Below (CF=1) + DFACategory[STARS_NN_jbe] = COND_BRANCH; // Jump if Below or Equal (CF=1 | ZF=1) + DFACategory[STARS_NN_jc] = COND_BRANCH; // Jump if Carry (CF=1) + DFACategory[STARS_NN_jcxz] = COND_BRANCH; // Jump if CX is 0 + DFACategory[STARS_NN_jecxz] = COND_BRANCH; // Jump if ECX is 0 + DFACategory[STARS_NN_jrcxz] = COND_BRANCH; // Jump if RCX is 0 + DFACategory[STARS_NN_je] = COND_BRANCH; // Jump if Equal (ZF=1) + DFACategory[STARS_NN_jg] = COND_BRANCH; // Jump if Greater (ZF=0 & SF=OF) + DFACategory[STARS_NN_jge] = COND_BRANCH; // Jump if Greater or Equal (SF=OF) + DFACategory[STARS_NN_jl] = COND_BRANCH; // Jump if Less (SF!=OF) + DFACategory[STARS_NN_jle] = COND_BRANCH; // Jump if Less or Equal (ZF=1 | SF!=OF) + DFACategory[STARS_NN_jna] = COND_BRANCH; // Jump if Not Above (CF=1 | ZF=1) + DFACategory[STARS_NN_jnae] = COND_BRANCH; // Jump if Not Above or Equal (CF=1) + DFACategory[STARS_NN_jnb] = COND_BRANCH; // Jump if Not Below (CF=0) + DFACategory[STARS_NN_jnbe] = COND_BRANCH; // Jump if Not Below or Equal (CF=0 & ZF=0) + DFACategory[STARS_NN_jnc] = COND_BRANCH; // Jump if Not Carry (CF=0) + DFACategory[STARS_NN_jne] = COND_BRANCH; // Jump if Not Equal (ZF=0) + DFACategory[STARS_NN_jng] = COND_BRANCH; // Jump if Not Greater (ZF=1 | SF!=OF) + DFACategory[STARS_NN_jnge] = COND_BRANCH; // Jump if Not Greater or Equal (SF!=OF) + DFACategory[STARS_NN_jnl] = COND_BRANCH; // Jump if Not Less (SF=OF) + DFACategory[STARS_NN_jnle] = COND_BRANCH; // Jump if Not Less or Equal (ZF=0 & SF=OF) + DFACategory[STARS_NN_jno] = COND_BRANCH; // Jump if Not Overflow (OF=0) + DFACategory[STARS_NN_jnp] = COND_BRANCH; // Jump if Not Parity (PF=0) + DFACategory[STARS_NN_jns] = COND_BRANCH; // Jump if Not Sign (SF=0) + DFACategory[STARS_NN_jnz] = COND_BRANCH; // Jump if Not Zero (ZF=0) + DFACategory[STARS_NN_jo] = COND_BRANCH; // Jump if Overflow (OF=1) + DFACategory[STARS_NN_jp] = COND_BRANCH; // Jump if Parity (PF=1) + DFACategory[STARS_NN_jpe] = COND_BRANCH; // Jump if Parity Even (PF=1) + DFACategory[STARS_NN_jpo] = COND_BRANCH; // Jump if Parity Odd (PF=0) + DFACategory[STARS_NN_js] = COND_BRANCH; // Jump if Sign (SF=1) + DFACategory[STARS_NN_jz] = COND_BRANCH; // Jump if Zero (ZF=1) + DFACategory[STARS_NN_jmp] = JUMP; // Jump + DFACategory[STARS_NN_jmpfi] = INDIR_JUMP; // Indirect Far Jump + DFACategory[STARS_NN_jmpni] = INDIR_JUMP; // Indirect Near Jump + DFACategory[STARS_NN_jmpshort] = JUMP; // Jump Short (only in 64-bit mode) + + DFACategory[STARS_NN_loopw] = COND_BRANCH; // Loop while ECX != 0 + DFACategory[STARS_NN_loop] = COND_BRANCH; // Loop while CX != 0 + DFACategory[STARS_NN_loopd] = COND_BRANCH; // Loop while ECX != 0 + DFACategory[STARS_NN_loopq] = COND_BRANCH; // Loop while RCX != 0 + DFACategory[STARS_NN_loopwe] = COND_BRANCH; // Loop while CX != 0 and ZF=1 + DFACategory[STARS_NN_loope] = COND_BRANCH; // Loop while rCX != 0 and ZF=1 + DFACategory[STARS_NN_loopde] = COND_BRANCH; // Loop while ECX != 0 and ZF=1 + DFACategory[STARS_NN_loopqe] = COND_BRANCH; // Loop while RCX != 0 and ZF=1 + DFACategory[STARS_NN_loopwne] = COND_BRANCH; // Loop while CX != 0 and ZF=0 + DFACategory[STARS_NN_loopne] = COND_BRANCH; // Loop while rCX != 0 and ZF=0 + DFACategory[STARS_NN_loopdne] = COND_BRANCH; // Loop while ECX != 0 and ZF=0 + DFACategory[STARS_NN_loopqne] = COND_BRANCH; // Loop while RCX != 0 and ZF=0 + + DFACategory[STARS_NN_retn] = RETURN; // Return Near from Procedure + DFACategory[STARS_NN_retf] = RETURN; // Return Far from Procedure + + // + // Pentium instructions + // + + DFACategory[STARS_NN_rsm] = HALT; // Resume from System Management Mode + + // Pentium II instructions + + DFACategory[STARS_NN_sysenter] = CALL; // Fast Transition to System Call Entry Point + DFACategory[STARS_NN_sysexit] = CALL; // Fast Transition from System Call Entry Point + + // AMD syscall/sysret instructions NOTE: not AMD, found in Intel manual + + DFACategory[STARS_NN_syscall] = CALL; // Low latency system call + DFACategory[STARS_NN_sysret] = CALL; // Return from system call + + // VMX instructions + + DFACategory[STARS_NN_vmcall] = INDIR_CALL; // Call to VM Monitor + + // Added with x86-64 + + // Geode LX 3DNow! extensions + + // SSE2 pseudoinstructions + + // SSSE4.1 instructions + + // SSSE4.2 instructions + + // AMD SSE4a instructions + + // xsave/xrstor instructions + + // Intel Safer Mode Extensions (SMX) + + // AMD-V Virtualization ISA Extension + + // VMX+ instructions + + // Intel Atom instructions + + // Intel AES instructions + + // Carryless multiplication + + // Returns modified by operand size prefixes + + DFACategory[STARS_NN_retnw] = RETURN; // Return Near from Procedure (use16) + DFACategory[STARS_NN_retnd] = RETURN; // Return Near from Procedure (use32) + DFACategory[STARS_NN_retnq] = RETURN; // Return Near from Procedure (use64) + DFACategory[STARS_NN_retfw] = RETURN; // Return Far from Procedure (use16) + DFACategory[STARS_NN_retfd] = RETURN; // Return Far from Procedure (use32) + DFACategory[STARS_NN_retfq] = RETURN; // Return Far from Procedure (use64) + + // RDRAND support + + // new GPR instructions + + // new AVX instructions + + // Transactional Synchronization Extensions + + // Virtual PC synthetic instructions + + return; + +} // end of STARS_Program_t::InitDFACategory() + +// Initialize the SMPDefsFlags[] array to define how we emit +// optimizing annotations. +void STARS_Program_t::InitSMPDefsFlags(void) { + // Default value is true. Many instructions set the flags. + (void) memset(SMPDefsFlags, true, sizeof(SMPDefsFlags)); + + SMPDefsFlags[STARS_NN_null] = false; // Unknown Operation + SMPDefsFlags[STARS_NN_bound] = false; // Check Array Index Against Bounds + SMPDefsFlags[STARS_NN_call] = false; // Call Procedure + SMPDefsFlags[STARS_NN_callfi] = false; // Indirect Call Far Procedure + SMPDefsFlags[STARS_NN_callni] = false; // Indirect Call Near Procedure + SMPDefsFlags[STARS_NN_cbw] = false; // AL -> AX (with sign) + SMPDefsFlags[STARS_NN_cwde] = false; // AX -> EAX (with sign) + SMPDefsFlags[STARS_NN_cdqe] = false; // EAX -> RAX (with sign) + SMPDefsFlags[STARS_NN_clts] = false; // Clear Task-Switched Flag in CR0 + SMPDefsFlags[STARS_NN_cwd] = false; // AX -> DX:AX (with sign) + SMPDefsFlags[STARS_NN_cdq] = false; // EAX -> EDX:EAX (with sign) + SMPDefsFlags[STARS_NN_cqo] = false; // RAX -> RDX:RAX (with sign) + SMPDefsFlags[STARS_NN_enterw] = false; // Make Stack Frame for Procedure Parameters + SMPDefsFlags[STARS_NN_enter] = false; // Make Stack Frame for Procedure Parameters + SMPDefsFlags[STARS_NN_enterd] = false; // Make Stack Frame for Procedure Parameters + SMPDefsFlags[STARS_NN_enterq] = false; // Make Stack Frame for Procedure Parameters + SMPDefsFlags[STARS_NN_hlt] = false; // Halt + SMPDefsFlags[STARS_NN_in] = false; // Input from Port + SMPDefsFlags[STARS_NN_ins] = false; // Input Byte(s) from Port to String + SMPDefsFlags[STARS_NN_iretw] = false; // Interrupt Return + SMPDefsFlags[STARS_NN_iret] = false; // Interrupt Return + SMPDefsFlags[STARS_NN_iretd] = false; // Interrupt Return (use32) + SMPDefsFlags[STARS_NN_iretq] = false; // Interrupt Return (use64) + SMPDefsFlags[STARS_NN_ja] = false; // Jump if Above (CF=0 & ZF=0) + SMPDefsFlags[STARS_NN_jae] = false; // Jump if Above or Equal (CF=0) + SMPDefsFlags[STARS_NN_jb] = false; // Jump if Below (CF=1) + SMPDefsFlags[STARS_NN_jbe] = false; // Jump if Below or Equal (CF=1 | ZF=1) + SMPDefsFlags[STARS_NN_jc] = false; // Jump if Carry (CF=1) + SMPDefsFlags[STARS_NN_jcxz] = false; // Jump if CX is 0 + SMPDefsFlags[STARS_NN_jecxz] = false; // Jump if ECX is 0 + SMPDefsFlags[STARS_NN_jrcxz] = false; // Jump if RCX is 0 + SMPDefsFlags[STARS_NN_je] = false; // Jump if Equal (ZF=1) + SMPDefsFlags[STARS_NN_jg] = false; // Jump if Greater (ZF=0 & SF=OF) + SMPDefsFlags[STARS_NN_jge] = false; // Jump if Greater or Equal (SF=OF) + SMPDefsFlags[STARS_NN_jl] = false; // Jump if Less (SF!=OF) + SMPDefsFlags[STARS_NN_jle] = false; // Jump if Less or Equal (ZF=1 | SF!=OF) + SMPDefsFlags[STARS_NN_jna] = false; // Jump if Not Above (CF=1 | ZF=1) + SMPDefsFlags[STARS_NN_jnae] = false; // Jump if Not Above or Equal (CF=1) + SMPDefsFlags[STARS_NN_jnb] = false; // Jump if Not Below (CF=0) + SMPDefsFlags[STARS_NN_jnbe] = false; // Jump if Not Below or Equal (CF=0 & ZF=0) + SMPDefsFlags[STARS_NN_jnc] = false; // Jump if Not Carry (CF=0) + SMPDefsFlags[STARS_NN_jne] = false; // Jump if Not Equal (ZF=0) + SMPDefsFlags[STARS_NN_jng] = false; // Jump if Not Greater (ZF=1 | SF!=OF) + SMPDefsFlags[STARS_NN_jnge] = false; // Jump if Not Greater or Equal (SF!=OF) + SMPDefsFlags[STARS_NN_jnl] = false; // Jump if Not Less (SF=OF) + SMPDefsFlags[STARS_NN_jnle] = false; // Jump if Not Less or Equal (ZF=0 & SF=OF) + SMPDefsFlags[STARS_NN_jno] = false; // Jump if Not Overflow (OF=0) + SMPDefsFlags[STARS_NN_jnp] = false; // Jump if Not Parity (PF=0) + SMPDefsFlags[STARS_NN_jns] = false; // Jump if Not Sign (SF=0) + SMPDefsFlags[STARS_NN_jnz] = false; // Jump if Not Zero (ZF=0) + SMPDefsFlags[STARS_NN_jo] = false; // Jump if Overflow (OF=1) + SMPDefsFlags[STARS_NN_jp] = false; // Jump if Parity (PF=1) + SMPDefsFlags[STARS_NN_jpe] = false; // Jump if Parity Even (PF=1) + SMPDefsFlags[STARS_NN_jpo] = false; // Jump if Parity Odd (PF=0) + SMPDefsFlags[STARS_NN_js] = false; // Jump if Sign (SF=1) + SMPDefsFlags[STARS_NN_jz] = false; // Jump if Zero (ZF=1) + SMPDefsFlags[STARS_NN_jmp] = false; // Jump + SMPDefsFlags[STARS_NN_jmpfi] = false; // Indirect Far Jump + SMPDefsFlags[STARS_NN_jmpni] = false; // Indirect Near Jump + SMPDefsFlags[STARS_NN_jmpshort] = false; // Jump Short (not used) + SMPDefsFlags[STARS_NN_lahf] = false; // Load Flags into AH Register + SMPDefsFlags[STARS_NN_lea] = false; // Load Effective Address + SMPDefsFlags[STARS_NN_leavew] = false; // High Level Procedure Exit + SMPDefsFlags[STARS_NN_leave] = false; // High Level Procedure Exit + SMPDefsFlags[STARS_NN_leaved] = false; // High Level Procedure Exit + SMPDefsFlags[STARS_NN_leaveq] = false; // High Level Procedure Exit + SMPDefsFlags[STARS_NN_lgdt] = false; // Load Global Descriptor Table Register + SMPDefsFlags[STARS_NN_lidt] = false; // Load Interrupt Descriptor Table Register + SMPDefsFlags[STARS_NN_lgs] = false; // Load Full Pointer to GS:xx + SMPDefsFlags[STARS_NN_lss] = false; // Load Full Pointer to SS:xx + SMPDefsFlags[STARS_NN_lds] = false; // Load Full Pointer to DS:xx + SMPDefsFlags[STARS_NN_les] = false; // Load Full Pointer to ES:xx + SMPDefsFlags[STARS_NN_lfs] = false; // Load Full Pointer to FS:xx + SMPDefsFlags[STARS_NN_loopw] = false; // Loop while ECX != 0 + SMPDefsFlags[STARS_NN_loop] = false; // Loop while ECX != 0 + SMPDefsFlags[STARS_NN_loopwe] = false; // Loop while CX != 0 and ZF=1 + SMPDefsFlags[STARS_NN_loope] = false; // Loop while rCX != 0 and ZF=1 + SMPDefsFlags[STARS_NN_loopde] = false; // Loop while ECX != 0 and ZF=1 + SMPDefsFlags[STARS_NN_loopqe] = false; // Loop while RCX != 0 and ZF=1 + SMPDefsFlags[STARS_NN_loopwne] = false; // Loop while CX != 0 and ZF=0 + SMPDefsFlags[STARS_NN_loopne] = false; // Loop while rCX != 0 and ZF=0 + SMPDefsFlags[STARS_NN_loopdne] = false; // Loop while ECX != 0 and ZF=0 + SMPDefsFlags[STARS_NN_loopqne] = false; // Loop while RCX != 0 and ZF=0 + SMPDefsFlags[STARS_NN_ltr] = false; // Load Task Register + SMPDefsFlags[STARS_NN_mov] = false; // Move Data + SMPDefsFlags[STARS_NN_movsp] = true; // Move to/from Special Registers + SMPDefsFlags[STARS_NN_movs] = false; // Move Byte(s) from String to String + SMPDefsFlags[STARS_NN_movsx] = false; // Move with Sign-Extend + SMPDefsFlags[STARS_NN_movzx] = false; // Move with Zero-Extend + SMPDefsFlags[STARS_NN_nop] = false; // No Operation + SMPDefsFlags[STARS_NN_not] = false; // One's Complement Negation + SMPDefsFlags[STARS_NN_out] = false; // Output to Port + SMPDefsFlags[STARS_NN_outs] = false; // Output Byte(s) to Port + SMPDefsFlags[STARS_NN_pop] = false; // Pop a word from the Stack + SMPDefsFlags[STARS_NN_popaw] = false; // Pop all General Registers + SMPDefsFlags[STARS_NN_popa] = false; // Pop all General Registers + SMPDefsFlags[STARS_NN_popad] = false; // Pop all General Registers (use32) + SMPDefsFlags[STARS_NN_popaq] = false; // Pop all General Registers (use64) + SMPDefsFlags[STARS_NN_push] = false; // Push Operand onto the Stack + SMPDefsFlags[STARS_NN_pushaw] = false; // Push all General Registers + SMPDefsFlags[STARS_NN_pusha] = false; // Push all General Registers + SMPDefsFlags[STARS_NN_pushad] = false; // Push all General Registers (use32) + SMPDefsFlags[STARS_NN_pushaq] = false; // Push all General Registers (use64) + SMPDefsFlags[STARS_NN_pushfw] = false; // Push Flags Register onto the Stack + SMPDefsFlags[STARS_NN_pushf] = false; // Push Flags Register onto the Stack + SMPDefsFlags[STARS_NN_pushfd] = false; // Push Flags Register onto the Stack (use32) + SMPDefsFlags[STARS_NN_pushfq] = false; // Push Flags Register onto the Stack (use64) + SMPDefsFlags[STARS_NN_rep] = false; // Repeat String Operation + SMPDefsFlags[STARS_NN_repe] = false; // Repeat String Operation while ZF=1 + SMPDefsFlags[STARS_NN_repne] = false; // Repeat String Operation while ZF=0 + SMPDefsFlags[STARS_NN_retn] = false; // Return Near from Procedure + SMPDefsFlags[STARS_NN_retf] = false; // Return Far from Procedure + SMPDefsFlags[STARS_NN_sahf] = true; // Store AH into flags + SMPDefsFlags[STARS_NN_shl] = true; // Shift Logical Left + SMPDefsFlags[STARS_NN_shr] = true; // Shift Logical Right + SMPDefsFlags[STARS_NN_seta] = false; // Set Byte if Above (CF=0 & ZF=0) + SMPDefsFlags[STARS_NN_setae] = false; // Set Byte if Above or Equal (CF=0) + SMPDefsFlags[STARS_NN_setb] = false; // Set Byte if Below (CF=1) + SMPDefsFlags[STARS_NN_setbe] = false; // Set Byte if Below or Equal (CF=1 | ZF=1) + SMPDefsFlags[STARS_NN_setc] = false; // Set Byte if Carry (CF=1) + SMPDefsFlags[STARS_NN_sete] = false; // Set Byte if Equal (ZF=1) + SMPDefsFlags[STARS_NN_setg] = false; // Set Byte if Greater (ZF=0 & SF=OF) + SMPDefsFlags[STARS_NN_setge] = false; // Set Byte if Greater or Equal (SF=OF) + SMPDefsFlags[STARS_NN_setl] = false; // Set Byte if Less (SF!=OF) + SMPDefsFlags[STARS_NN_setle] = false; // Set Byte if Less or Equal (ZF=1 | SF!=OF) + SMPDefsFlags[STARS_NN_setna] = false; // Set Byte if Not Above (CF=1 | ZF=1) + SMPDefsFlags[STARS_NN_setnae] = false; // Set Byte if Not Above or Equal (CF=1) + SMPDefsFlags[STARS_NN_setnb] = false; // Set Byte if Not Below (CF=0) + SMPDefsFlags[STARS_NN_setnbe] = false; // Set Byte if Not Below or Equal (CF=0 & ZF=0) + SMPDefsFlags[STARS_NN_setnc] = false; // Set Byte if Not Carry (CF=0) + SMPDefsFlags[STARS_NN_setne] = false; // Set Byte if Not Equal (ZF=0) + SMPDefsFlags[STARS_NN_setng] = false; // Set Byte if Not Greater (ZF=1 | SF!=OF) + SMPDefsFlags[STARS_NN_setnge] = false; // Set Byte if Not Greater or Equal (SF!=OF) + SMPDefsFlags[STARS_NN_setnl] = false; // Set Byte if Not Less (SF=OF) + SMPDefsFlags[STARS_NN_setnle] = false; // Set Byte if Not Less or Equal (ZF=0 & SF=OF) + SMPDefsFlags[STARS_NN_setno] = false; // Set Byte if Not Overflow (OF=0) + SMPDefsFlags[STARS_NN_setnp] = false; // Set Byte if Not Parity (PF=0) + SMPDefsFlags[STARS_NN_setns] = false; // Set Byte if Not Sign (SF=0) + SMPDefsFlags[STARS_NN_setnz] = false; // Set Byte if Not Zero (ZF=0) + SMPDefsFlags[STARS_NN_seto] = false; // Set Byte if Overflow (OF=1) + SMPDefsFlags[STARS_NN_setp] = false; // Set Byte if Parity (PF=1) + SMPDefsFlags[STARS_NN_setpe] = false; // Set Byte if Parity Even (PF=1) + SMPDefsFlags[STARS_NN_setpo] = false; // Set Byte if Parity Odd (PF=0) + SMPDefsFlags[STARS_NN_sets] = false; // Set Byte if Sign (SF=1) + SMPDefsFlags[STARS_NN_setz] = false; // Set Byte if Zero (ZF=1) + SMPDefsFlags[STARS_NN_sgdt] = false; // Store Global Descriptor Table Register + SMPDefsFlags[STARS_NN_sidt] = false; // Store Interrupt Descriptor Table Register + SMPDefsFlags[STARS_NN_sldt] = false; // Store Local Descriptor Table Register + SMPDefsFlags[STARS_NN_str] = false; // Store Task Register + SMPDefsFlags[STARS_NN_wait] = false; // Wait until BUSY# Pin is Inactive (HIGH) + SMPDefsFlags[STARS_NN_xchg] = false; // Exchange Register/Memory with Register + SMPDefsFlags[STARS_NN_xlat] = false; // Table Lookup Translation + + // + // 486 instructions + // + + SMPDefsFlags[STARS_NN_bswap] = false; // Swap bytes in register + SMPDefsFlags[STARS_NN_invd] = false; // Invalidate Data Cache + SMPDefsFlags[STARS_NN_wbinvd] = false; // Invalidate Data Cache (write changes) + SMPDefsFlags[STARS_NN_invlpg] = false; // Invalidate TLB entry + + // + // Pentium instructions + // + + SMPDefsFlags[STARS_NN_rdmsr] = false; // Read Machine Status Register + SMPDefsFlags[STARS_NN_wrmsr] = false; // Write Machine Status Register + SMPDefsFlags[STARS_NN_cpuid] = false; // Get CPU ID + SMPDefsFlags[STARS_NN_rdtsc] = false; // Read Time Stamp Counter + + // + // Pentium Pro instructions + // + + SMPDefsFlags[STARS_NN_cmova] = false; // Move if Above (CF=0 & ZF=0) + SMPDefsFlags[STARS_NN_cmovb] = false; // Move if Below (CF=1) + SMPDefsFlags[STARS_NN_cmovbe] = false; // Move if Below or Equal (CF=1 | ZF=1) + SMPDefsFlags[STARS_NN_cmovg] = false; // Move if Greater (ZF=0 & SF=OF) + SMPDefsFlags[STARS_NN_cmovge] = false; // Move if Greater or Equal (SF=OF) + SMPDefsFlags[STARS_NN_cmovl] = false; // Move if Less (SF!=OF) + SMPDefsFlags[STARS_NN_cmovle] = false; // Move if Less or Equal (ZF=1 | SF!=OF) + SMPDefsFlags[STARS_NN_cmovnb] = false; // Move if Not Below (CF=0) + SMPDefsFlags[STARS_NN_cmovno] = false; // Move if Not Overflow (OF=0) + SMPDefsFlags[STARS_NN_cmovnp] = false; // Move if Not Parity (PF=0) + SMPDefsFlags[STARS_NN_cmovns] = false; // Move if Not Sign (SF=0) + SMPDefsFlags[STARS_NN_cmovnz] = false; // Move if Not Zero (ZF=0) + SMPDefsFlags[STARS_NN_cmovo] = false; // Move if Overflow (OF=1) + SMPDefsFlags[STARS_NN_cmovp] = false; // Move if Parity (PF=1) + SMPDefsFlags[STARS_NN_cmovs] = false; // Move if Sign (SF=1) + SMPDefsFlags[STARS_NN_cmovz] = false; // Move if Zero (ZF=1) + SMPDefsFlags[STARS_NN_fcmovb] = false; // Floating Move if Below + SMPDefsFlags[STARS_NN_fcmove] = false; // Floating Move if Equal + SMPDefsFlags[STARS_NN_fcmovbe] = false; // Floating Move if Below or Equal + SMPDefsFlags[STARS_NN_fcmovu] = false; // Floating Move if Unordered + SMPDefsFlags[STARS_NN_fcmovnb] = false; // Floating Move if Not Below + SMPDefsFlags[STARS_NN_fcmovne] = false; // Floating Move if Not Equal + SMPDefsFlags[STARS_NN_fcmovnbe] = false; // Floating Move if Not Below or Equal + SMPDefsFlags[STARS_NN_fcmovnu] = false; // Floating Move if Not Unordered + SMPDefsFlags[STARS_NN_rdpmc] = false; // Read Performance Monitor Counter + + // + // FPP instructions + // + + SMPDefsFlags[STARS_NN_fld] = false; // Load Real + SMPDefsFlags[STARS_NN_fst] = false; // Store Real + SMPDefsFlags[STARS_NN_fstp] = false; // Store Real and Pop + SMPDefsFlags[STARS_NN_fxch] = false; // Exchange Registers + SMPDefsFlags[STARS_NN_fild] = false; // Load Integer + SMPDefsFlags[STARS_NN_fist] = false; // Store Integer + SMPDefsFlags[STARS_NN_fistp] = false; // Store Integer and Pop + SMPDefsFlags[STARS_NN_fbld] = false; // Load BCD + SMPDefsFlags[STARS_NN_fbstp] = false; // Store BCD and Pop + SMPDefsFlags[STARS_NN_fadd] = false; // Add Real + SMPDefsFlags[STARS_NN_faddp] = false; // Add Real and Pop + SMPDefsFlags[STARS_NN_fiadd] = false; // Add Integer + SMPDefsFlags[STARS_NN_fsub] = false; // Subtract Real + SMPDefsFlags[STARS_NN_fsubp] = false; // Subtract Real and Pop + SMPDefsFlags[STARS_NN_fisub] = false; // Subtract Integer + SMPDefsFlags[STARS_NN_fsubr] = false; // Subtract Real Reversed + SMPDefsFlags[STARS_NN_fsubrp] = false; // Subtract Real Reversed and Pop + SMPDefsFlags[STARS_NN_fisubr] = false; // Subtract Integer Reversed + SMPDefsFlags[STARS_NN_fmul] = false; // Multiply Real + SMPDefsFlags[STARS_NN_fmulp] = false; // Multiply Real and Pop + SMPDefsFlags[STARS_NN_fimul] = false; // Multiply Integer + SMPDefsFlags[STARS_NN_fdiv] = false; // Divide Real + SMPDefsFlags[STARS_NN_fdivp] = false; // Divide Real and Pop + SMPDefsFlags[STARS_NN_fidiv] = false; // Divide Integer + SMPDefsFlags[STARS_NN_fdivr] = false; // Divide Real Reversed + SMPDefsFlags[STARS_NN_fdivrp] = false; // Divide Real Reversed and Pop + SMPDefsFlags[STARS_NN_fidivr] = false; // Divide Integer Reversed + SMPDefsFlags[STARS_NN_fsqrt] = false; // Square Root + SMPDefsFlags[STARS_NN_fscale] = false; // Scale: st(0) <- st(0) * 2^st(1) + SMPDefsFlags[STARS_NN_fprem] = false; // Partial Remainder + SMPDefsFlags[STARS_NN_frndint] = false; // Round to Integer + SMPDefsFlags[STARS_NN_fxtract] = false; // Extract exponent and significand + SMPDefsFlags[STARS_NN_fabs] = false; // Absolute value + SMPDefsFlags[STARS_NN_fchs] = false; // Change Sign + SMPDefsFlags[STARS_NN_ficom] = false; // Compare Integer + SMPDefsFlags[STARS_NN_ficomp] = false; // Compare Integer and Pop + SMPDefsFlags[STARS_NN_ftst] = false; // Test + SMPDefsFlags[STARS_NN_fxam] = false; // Examine + SMPDefsFlags[STARS_NN_fptan] = false; // Partial tangent + SMPDefsFlags[STARS_NN_fpatan] = false; // Partial arctangent + SMPDefsFlags[STARS_NN_f2xm1] = false; // 2^x - 1 + SMPDefsFlags[STARS_NN_fyl2x] = false; // Y * lg2(X) + SMPDefsFlags[STARS_NN_fyl2xp1] = false; // Y * lg2(X+1) + SMPDefsFlags[STARS_NN_fldz] = false; // Load +0.0 + SMPDefsFlags[STARS_NN_fld1] = false; // Load +1.0 + SMPDefsFlags[STARS_NN_fldpi] = false; // Load PI=3.14... + SMPDefsFlags[STARS_NN_fldl2t] = false; // Load lg2(10) + SMPDefsFlags[STARS_NN_fldl2e] = false; // Load lg2(e) + SMPDefsFlags[STARS_NN_fldlg2] = false; // Load lg10(2) + SMPDefsFlags[STARS_NN_fldln2] = false; // Load ln(2) + SMPDefsFlags[STARS_NN_finit] = false; // Initialize Processor + SMPDefsFlags[STARS_NN_fninit] = false; // Initialize Processor (no wait) + SMPDefsFlags[STARS_NN_fsetpm] = false; // Set Protected Mode + SMPDefsFlags[STARS_NN_fldcw] = false; // Load Control Word + SMPDefsFlags[STARS_NN_fstcw] = false; // Store Control Word + SMPDefsFlags[STARS_NN_fnstcw] = false; // Store Control Word (no wait) + SMPDefsFlags[STARS_NN_fstsw] = false; // Store Status Word to memory or AX + SMPDefsFlags[STARS_NN_fnstsw] = false; // Store Status Word (no wait) to memory or AX + SMPDefsFlags[STARS_NN_fclex] = false; // Clear Exceptions + SMPDefsFlags[STARS_NN_fnclex] = false; // Clear Exceptions (no wait) + SMPDefsFlags[STARS_NN_fstenv] = false; // Store Environment + SMPDefsFlags[STARS_NN_fnstenv] = false; // Store Environment (no wait) + SMPDefsFlags[STARS_NN_fldenv] = false; // Load Environment + SMPDefsFlags[STARS_NN_fsave] = false; // Save State + SMPDefsFlags[STARS_NN_fnsave] = false; // Save State (no wait) + SMPDefsFlags[STARS_NN_frstor] = false; // Restore State + SMPDefsFlags[STARS_NN_fincstp] = false; // Increment Stack Pointer + SMPDefsFlags[STARS_NN_fdecstp] = false; // Decrement Stack Pointer + SMPDefsFlags[STARS_NN_ffree] = false; // Free Register + SMPDefsFlags[STARS_NN_fnop] = false; // No Operation + SMPDefsFlags[STARS_NN_feni] = false; // (8087 only) + SMPDefsFlags[STARS_NN_fneni] = false; // (no wait) (8087 only) + SMPDefsFlags[STARS_NN_fdisi] = false; // (8087 only) + SMPDefsFlags[STARS_NN_fndisi] = false; // (no wait) (8087 only) + + // + // 80387 instructions + // + + SMPDefsFlags[STARS_NN_fprem1] = false; // Partial Remainder ( < half ) + SMPDefsFlags[STARS_NN_fsincos] = false; // t<-cos(st); st<-sin(st); push t + SMPDefsFlags[STARS_NN_fsin] = false; // Sine + SMPDefsFlags[STARS_NN_fcos] = false; // Cosine + SMPDefsFlags[STARS_NN_fucom] = false; // Compare Unordered Real + SMPDefsFlags[STARS_NN_fucomp] = false; // Compare Unordered Real and Pop + SMPDefsFlags[STARS_NN_fucompp] = false; // Compare Unordered Real and Pop Twice + + // + // Instructions added 28.02.96 + // + + SMPDefsFlags[STARS_NN_svdc] = false; // Save Register and Descriptor + SMPDefsFlags[STARS_NN_rsdc] = false; // Restore Register and Descriptor + SMPDefsFlags[STARS_NN_svldt] = false; // Save LDTR and Descriptor + SMPDefsFlags[STARS_NN_rsldt] = false; // Restore LDTR and Descriptor + SMPDefsFlags[STARS_NN_svts] = false; // Save TR and Descriptor + SMPDefsFlags[STARS_NN_rsts] = false; // Restore TR and Descriptor + SMPDefsFlags[STARS_NN_icebp] = false; // ICE Break Point + + // + // MMX instructions + // + + SMPDefsFlags[STARS_NN_emms] = false; // Empty MMX state + SMPDefsFlags[STARS_NN_movd] = false; // Move 32 bits + SMPDefsFlags[STARS_NN_movq] = false; // Move 64 bits + SMPDefsFlags[STARS_NN_packsswb] = false; // Pack with Signed Saturation (Word->Byte) + SMPDefsFlags[STARS_NN_packssdw] = false; // Pack with Signed Saturation (Dword->Word) + SMPDefsFlags[STARS_NN_packuswb] = false; // Pack with Unsigned Saturation (Word->Byte) + SMPDefsFlags[STARS_NN_paddb] = false; // Packed Add Byte + SMPDefsFlags[STARS_NN_paddw] = false; // Packed Add Word + SMPDefsFlags[STARS_NN_paddd] = false; // Packed Add Dword + SMPDefsFlags[STARS_NN_paddsb] = false; // Packed Add with Saturation (Byte) + SMPDefsFlags[STARS_NN_paddsw] = false; // Packed Add with Saturation (Word) + SMPDefsFlags[STARS_NN_paddusb] = false; // Packed Add Unsigned with Saturation (Byte) + SMPDefsFlags[STARS_NN_paddusw] = false; // Packed Add Unsigned with Saturation (Word) + SMPDefsFlags[STARS_NN_pand] = false; // Bitwise Logical And + SMPDefsFlags[STARS_NN_pandn] = false; // Bitwise Logical And Not + SMPDefsFlags[STARS_NN_pcmpeqb] = false; // Packed Compare for Equal (Byte) + SMPDefsFlags[STARS_NN_pcmpeqw] = false; // Packed Compare for Equal (Word) + SMPDefsFlags[STARS_NN_pcmpeqd] = false; // Packed Compare for Equal (Dword) + SMPDefsFlags[STARS_NN_pcmpgtb] = false; // Packed Compare for Greater Than (Byte) + SMPDefsFlags[STARS_NN_pcmpgtw] = false; // Packed Compare for Greater Than (Word) + SMPDefsFlags[STARS_NN_pcmpgtd] = false; // Packed Compare for Greater Than (Dword) + SMPDefsFlags[STARS_NN_pmaddwd] = false; // Packed Multiply and Add + SMPDefsFlags[STARS_NN_pmulhw] = false; // Packed Multiply High + SMPDefsFlags[STARS_NN_pmullw] = false; // Packed Multiply Low + SMPDefsFlags[STARS_NN_por] = false; // Bitwise Logical Or + SMPDefsFlags[STARS_NN_psllw] = false; // Packed Shift Left Logical (Word) + SMPDefsFlags[STARS_NN_pslld] = false; // Packed Shift Left Logical (Dword) + SMPDefsFlags[STARS_NN_psllq] = false; // Packed Shift Left Logical (Qword) + SMPDefsFlags[STARS_NN_psraw] = false; // Packed Shift Right Arithmetic (Word) + SMPDefsFlags[STARS_NN_psrad] = false; // Packed Shift Right Arithmetic (Dword) + SMPDefsFlags[STARS_NN_psrlw] = false; // Packed Shift Right Logical (Word) + SMPDefsFlags[STARS_NN_psrld] = false; // Packed Shift Right Logical (Dword) + SMPDefsFlags[STARS_NN_psrlq] = false; // Packed Shift Right Logical (Qword) + SMPDefsFlags[STARS_NN_psubb] = false; // Packed Subtract Byte + SMPDefsFlags[STARS_NN_psubw] = false; // Packed Subtract Word + SMPDefsFlags[STARS_NN_psubd] = false; // Packed Subtract Dword + SMPDefsFlags[STARS_NN_psubsb] = false; // Packed Subtract with Saturation (Byte) + SMPDefsFlags[STARS_NN_psubsw] = false; // Packed Subtract with Saturation (Word) + SMPDefsFlags[STARS_NN_psubusb] = false; // Packed Subtract Unsigned with Saturation (Byte) + SMPDefsFlags[STARS_NN_psubusw] = false; // Packed Subtract Unsigned with Saturation (Word) + SMPDefsFlags[STARS_NN_punpckhbw] = false; // Unpack High Packed Data (Byte->Word) + SMPDefsFlags[STARS_NN_punpckhwd] = false; // Unpack High Packed Data (Word->Dword) + SMPDefsFlags[STARS_NN_punpckhdq] = false; // Unpack High Packed Data (Dword->Qword) + SMPDefsFlags[STARS_NN_punpcklbw] = false; // Unpack Low Packed Data (Byte->Word) + SMPDefsFlags[STARS_NN_punpcklwd] = false; // Unpack Low Packed Data (Word->Dword) + SMPDefsFlags[STARS_NN_punpckldq] = false; // Unpack Low Packed Data (Dword->Qword) + SMPDefsFlags[STARS_NN_pxor] = false; // Bitwise Logical Exclusive Or + + // + // Undocumented Deschutes processor instructions + // + + SMPDefsFlags[STARS_NN_fxsave] = false; // Fast save FP context + SMPDefsFlags[STARS_NN_fxrstor] = false; // Fast restore FP context + + // Pentium II instructions + + SMPDefsFlags[STARS_NN_sysexit] = false; // Fast Transition from System Call Entry Point + + // 3DNow! instructions + + SMPDefsFlags[STARS_NN_pavgusb] = false; // Packed 8-bit Unsigned Integer Averaging + SMPDefsFlags[STARS_NN_pfadd] = false; // Packed Floating-Point Addition + SMPDefsFlags[STARS_NN_pfsub] = false; // Packed Floating-Point Subtraction + SMPDefsFlags[STARS_NN_pfsubr] = false; // Packed Floating-Point Reverse Subtraction + SMPDefsFlags[STARS_NN_pfacc] = false; // Packed Floating-Point Accumulate + SMPDefsFlags[STARS_NN_pfcmpge] = false; // Packed Floating-Point Comparison, Greater or Equal + SMPDefsFlags[STARS_NN_pfcmpgt] = false; // Packed Floating-Point Comparison, Greater + SMPDefsFlags[STARS_NN_pfcmpeq] = false; // Packed Floating-Point Comparison, Equal + SMPDefsFlags[STARS_NN_pfmin] = false; // Packed Floating-Point Minimum + SMPDefsFlags[STARS_NN_pfmax] = false; // Packed Floating-Point Maximum + SMPDefsFlags[STARS_NN_pi2fd] = false; // Packed 32-bit Integer to Floating-Point + SMPDefsFlags[STARS_NN_pf2id] = false; // Packed Floating-Point to 32-bit Integer + SMPDefsFlags[STARS_NN_pfrcp] = false; // Packed Floating-Point Reciprocal Approximation + SMPDefsFlags[STARS_NN_pfrsqrt] = false; // Packed Floating-Point Reciprocal Square Root Approximation + SMPDefsFlags[STARS_NN_pfmul] = false; // Packed Floating-Point Multiplication + SMPDefsFlags[STARS_NN_pfrcpit1] = false; // Packed Floating-Point Reciprocal First Iteration Step + SMPDefsFlags[STARS_NN_pfrsqit1] = false; // Packed Floating-Point Reciprocal Square Root First Iteration Step + SMPDefsFlags[STARS_NN_pfrcpit2] = false; // Packed Floating-Point Reciprocal Second Iteration Step + SMPDefsFlags[STARS_NN_pmulhrw] = false; // Packed Floating-Point 16-bit Integer Multiply with rounding + SMPDefsFlags[STARS_NN_femms] = false; // Faster entry/exit of the MMX or floating-point state + SMPDefsFlags[STARS_NN_prefetch] = false; // Prefetch at least a 32-byte line into L1 data cache + SMPDefsFlags[STARS_NN_prefetchw] = false; // Prefetch processor cache line into L1 data cache (mark as modified) + + + // Pentium III instructions + + SMPDefsFlags[STARS_NN_addps] = false; // Packed Single-FP Add + SMPDefsFlags[STARS_NN_addss] = false; // Scalar Single-FP Add + SMPDefsFlags[STARS_NN_andnps] = false; // Bitwise Logical And Not for Single-FP + SMPDefsFlags[STARS_NN_andps] = false; // Bitwise Logical And for Single-FP + SMPDefsFlags[STARS_NN_cmpps] = false; // Packed Single-FP Compare + SMPDefsFlags[STARS_NN_cmpss] = false; // Scalar Single-FP Compare + SMPDefsFlags[STARS_NN_cvtpi2ps] = false; // Packed signed INT32 to Packed Single-FP conversion + SMPDefsFlags[STARS_NN_cvtps2pi] = false; // Packed Single-FP to Packed INT32 conversion + SMPDefsFlags[STARS_NN_cvtsi2ss] = false; // Scalar signed INT32 to Single-FP conversion + SMPDefsFlags[STARS_NN_cvtss2si] = false; // Scalar Single-FP to signed INT32 conversion + SMPDefsFlags[STARS_NN_cvttps2pi] = false; // Packed Single-FP to Packed INT32 conversion (truncate) + SMPDefsFlags[STARS_NN_cvttss2si] = false; // Scalar Single-FP to signed INT32 conversion (truncate) + SMPDefsFlags[STARS_NN_divps] = false; // Packed Single-FP Divide + SMPDefsFlags[STARS_NN_divss] = false; // Scalar Single-FP Divide + SMPDefsFlags[STARS_NN_ldmxcsr] = false; // Load Streaming SIMD Extensions Technology Control/Status Register + SMPDefsFlags[STARS_NN_maxps] = false; // Packed Single-FP Maximum + SMPDefsFlags[STARS_NN_maxss] = false; // Scalar Single-FP Maximum + SMPDefsFlags[STARS_NN_minps] = false; // Packed Single-FP Minimum + SMPDefsFlags[STARS_NN_minss] = false; // Scalar Single-FP Minimum + SMPDefsFlags[STARS_NN_movaps] = false; // Move Aligned Four Packed Single-FP + SMPDefsFlags[STARS_NN_movhlps] = false; // Move High to Low Packed Single-FP + SMPDefsFlags[STARS_NN_movhps] = false; // Move High Packed Single-FP + SMPDefsFlags[STARS_NN_movlhps] = false; // Move Low to High Packed Single-FP + SMPDefsFlags[STARS_NN_movlps] = false; // Move Low Packed Single-FP + SMPDefsFlags[STARS_NN_movmskps] = false; // Move Mask to Register + SMPDefsFlags[STARS_NN_movss] = false; // Move Scalar Single-FP + SMPDefsFlags[STARS_NN_movups] = false; // Move Unaligned Four Packed Single-FP + SMPDefsFlags[STARS_NN_mulps] = false; // Packed Single-FP Multiply + SMPDefsFlags[STARS_NN_mulss] = false; // Scalar Single-FP Multiply + SMPDefsFlags[STARS_NN_orps] = false; // Bitwise Logical OR for Single-FP Data + SMPDefsFlags[STARS_NN_rcpps] = false; // Packed Single-FP Reciprocal + SMPDefsFlags[STARS_NN_rcpss] = false; // Scalar Single-FP Reciprocal + SMPDefsFlags[STARS_NN_rsqrtps] = false; // Packed Single-FP Square Root Reciprocal + SMPDefsFlags[STARS_NN_rsqrtss] = false; // Scalar Single-FP Square Root Reciprocal + SMPDefsFlags[STARS_NN_shufps] = false; // Shuffle Single-FP + SMPDefsFlags[STARS_NN_sqrtps] = false; // Packed Single-FP Square Root + SMPDefsFlags[STARS_NN_sqrtss] = false; // Scalar Single-FP Square Root + SMPDefsFlags[STARS_NN_stmxcsr] = false; // Store Streaming SIMD Extensions Technology Control/Status Register + SMPDefsFlags[STARS_NN_subps] = false; // Packed Single-FP Subtract + SMPDefsFlags[STARS_NN_subss] = false; // Scalar Single-FP Subtract + SMPDefsFlags[STARS_NN_unpckhps] = false; // Unpack High Packed Single-FP Data + SMPDefsFlags[STARS_NN_unpcklps] = false; // Unpack Low Packed Single-FP Data + SMPDefsFlags[STARS_NN_xorps] = false; // Bitwise Logical XOR for Single-FP Data + SMPDefsFlags[STARS_NN_pavgb] = false; // Packed Average (Byte) + SMPDefsFlags[STARS_NN_pavgw] = false; // Packed Average (Word) + SMPDefsFlags[STARS_NN_pextrw] = false; // Extract Word + SMPDefsFlags[STARS_NN_pinsrw] = false; // Insert Word + SMPDefsFlags[STARS_NN_pmaxsw] = false; // Packed Signed Integer Word Maximum + SMPDefsFlags[STARS_NN_pmaxub] = false; // Packed Unsigned Integer Byte Maximum + SMPDefsFlags[STARS_NN_pminsw] = false; // Packed Signed Integer Word Minimum + SMPDefsFlags[STARS_NN_pminub] = false; // Packed Unsigned Integer Byte Minimum + SMPDefsFlags[STARS_NN_pmovmskb] = false; // Move Byte Mask to Integer + SMPDefsFlags[STARS_NN_pmulhuw] = false; // Packed Multiply High Unsigned + SMPDefsFlags[STARS_NN_psadbw] = false; // Packed Sum of Absolute Differences + SMPDefsFlags[STARS_NN_pshufw] = false; // Packed Shuffle Word + SMPDefsFlags[STARS_NN_maskmovq] = false; // Byte Mask write + SMPDefsFlags[STARS_NN_movntps] = false; // Move Aligned Four Packed Single-FP Non Temporal + SMPDefsFlags[STARS_NN_movntq] = false; // Move 64 Bits Non Temporal + SMPDefsFlags[STARS_NN_prefetcht0] = false; // Prefetch to all cache levels + SMPDefsFlags[STARS_NN_prefetcht1] = false; // Prefetch to all cache levels + SMPDefsFlags[STARS_NN_prefetcht2] = false; // Prefetch to L2 cache + SMPDefsFlags[STARS_NN_prefetchnta] = false; // Prefetch to L1 cache + SMPDefsFlags[STARS_NN_sfence] = false; // Store Fence + + // Pentium III Pseudo instructions + + SMPDefsFlags[STARS_NN_cmpeqps] = false; // Packed Single-FP Compare EQ + SMPDefsFlags[STARS_NN_cmpltps] = false; // Packed Single-FP Compare LT + SMPDefsFlags[STARS_NN_cmpleps] = false; // Packed Single-FP Compare LE + SMPDefsFlags[STARS_NN_cmpunordps] = false; // Packed Single-FP Compare UNORD + SMPDefsFlags[STARS_NN_cmpneqps] = false; // Packed Single-FP Compare NOT EQ + SMPDefsFlags[STARS_NN_cmpnltps] = false; // Packed Single-FP Compare NOT LT + SMPDefsFlags[STARS_NN_cmpnleps] = false; // Packed Single-FP Compare NOT LE + SMPDefsFlags[STARS_NN_cmpordps] = false; // Packed Single-FP Compare ORDERED + SMPDefsFlags[STARS_NN_cmpeqss] = false; // Scalar Single-FP Compare EQ + SMPDefsFlags[STARS_NN_cmpltss] = false; // Scalar Single-FP Compare LT + SMPDefsFlags[STARS_NN_cmpless] = false; // Scalar Single-FP Compare LE + SMPDefsFlags[STARS_NN_cmpunordss] = false; // Scalar Single-FP Compare UNORD + SMPDefsFlags[STARS_NN_cmpneqss] = false; // Scalar Single-FP Compare NOT EQ + SMPDefsFlags[STARS_NN_cmpnltss] = false; // Scalar Single-FP Compare NOT LT + SMPDefsFlags[STARS_NN_cmpnless] = false; // Scalar Single-FP Compare NOT LE + SMPDefsFlags[STARS_NN_cmpordss] = false; // Scalar Single-FP Compare ORDERED + + // AMD K7 instructions + + // Revisit AMD if we port to it. + SMPDefsFlags[STARS_NN_pf2iw] = false; // Packed Floating-Point to Integer with Sign Extend + SMPDefsFlags[STARS_NN_pfnacc] = false; // Packed Floating-Point Negative Accumulate + SMPDefsFlags[STARS_NN_pfpnacc] = false; // Packed Floating-Point Mixed Positive-Negative Accumulate + SMPDefsFlags[STARS_NN_pi2fw] = false; // Packed 16-bit Integer to Floating-Point + SMPDefsFlags[STARS_NN_pswapd] = false; // Packed Swap Double Word + + // Undocumented FP instructions (thanks to norbert.juffa@adm.com) + + SMPDefsFlags[STARS_NN_fstp1] = false; // Alias of Store Real and Pop + SMPDefsFlags[STARS_NN_fxch4] = false; // Alias of Exchange Registers + SMPDefsFlags[STARS_NN_ffreep] = false; // Free Register and Pop + SMPDefsFlags[STARS_NN_fxch7] = false; // Alias of Exchange Registers + SMPDefsFlags[STARS_NN_fstp8] = false; // Alias of Store Real and Pop + SMPDefsFlags[STARS_NN_fstp9] = false; // Alias of Store Real and Pop + + // Pentium 4 instructions + + SMPDefsFlags[STARS_NN_addpd] = false; // Add Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_addsd] = false; // Add Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_andnpd] = false; // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_andpd] = false; // Bitwise Logical AND of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_clflush] = false; // Flush Cache Line + SMPDefsFlags[STARS_NN_cmppd] = false; // Compare Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_cmpsd] = false; // Compare Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_cvtdq2pd] = false; // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_cvtdq2ps] = false; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_cvtpd2dq] = false; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + SMPDefsFlags[STARS_NN_cvtpd2pi] = false; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + SMPDefsFlags[STARS_NN_cvtpd2ps] = false; // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_cvtpi2pd] = false; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_cvtps2dq] = false; // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + SMPDefsFlags[STARS_NN_cvtps2pd] = false; // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_cvtsd2si] = false; // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer + SMPDefsFlags[STARS_NN_cvtsd2ss] = false; // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value + SMPDefsFlags[STARS_NN_cvtsi2sd] = false; // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value + SMPDefsFlags[STARS_NN_cvtss2sd] = false; // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value + SMPDefsFlags[STARS_NN_cvttpd2dq] = false; // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + SMPDefsFlags[STARS_NN_cvttpd2pi] = false; // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + SMPDefsFlags[STARS_NN_cvttps2dq] = false; // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + SMPDefsFlags[STARS_NN_cvttsd2si] = false; // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer + SMPDefsFlags[STARS_NN_divpd] = false; // Divide Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_divsd] = false; // Divide Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_lfence] = false; // Load Fence + SMPDefsFlags[STARS_NN_maskmovdqu] = false; // Store Selected Bytes of Double Quadword + SMPDefsFlags[STARS_NN_maxpd] = false; // Return Maximum Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_maxsd] = false; // Return Maximum Scalar Double-Precision Floating-Point Value + SMPDefsFlags[STARS_NN_mfence] = false; // Memory Fence + SMPDefsFlags[STARS_NN_minpd] = false; // Return Minimum Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_minsd] = false; // Return Minimum Scalar Double-Precision Floating-Point Value + SMPDefsFlags[STARS_NN_movapd] = false; // Move Aligned Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_movdq2q] = false; // Move Quadword from XMM to MMX Register + SMPDefsFlags[STARS_NN_movdqa] = false; // Move Aligned Double Quadword + SMPDefsFlags[STARS_NN_movdqu] = false; // Move Unaligned Double Quadword + SMPDefsFlags[STARS_NN_movhpd] = false; // Move High Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_movlpd] = false; // Move Low Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_movmskpd] = false; // Extract Packed Double-Precision Floating-Point Sign Mask + SMPDefsFlags[STARS_NN_movntdq] = false; // Store Double Quadword Using Non-Temporal Hint + SMPDefsFlags[STARS_NN_movnti] = false; // Store Doubleword Using Non-Temporal Hint + SMPDefsFlags[STARS_NN_movntpd] = false; // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint + SMPDefsFlags[STARS_NN_movq2dq] = false; // Move Quadword from MMX to XMM Register + SMPDefsFlags[STARS_NN_movsd] = false; // Move Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_movupd] = false; // Move Unaligned Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_mulpd] = false; // Multiply Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_mulsd] = false; // Multiply Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_orpd] = false; // Bitwise Logical OR of Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_paddq] = false; // Add Packed Quadword Integers + SMPDefsFlags[STARS_NN_pause] = false; // Spin Loop Hint + SMPDefsFlags[STARS_NN_pmuludq] = false; // Multiply Packed Unsigned Doubleword Integers + SMPDefsFlags[STARS_NN_pshufd] = false; // Shuffle Packed Doublewords + SMPDefsFlags[STARS_NN_pshufhw] = false; // Shuffle Packed High Words + SMPDefsFlags[STARS_NN_pshuflw] = false; // Shuffle Packed Low Words + SMPDefsFlags[STARS_NN_pslldq] = false; // Shift Double Quadword Left Logical + SMPDefsFlags[STARS_NN_psrldq] = false; // Shift Double Quadword Right Logical + SMPDefsFlags[STARS_NN_psubq] = false; // Subtract Packed Quadword Integers + SMPDefsFlags[STARS_NN_punpckhqdq] = false; // Unpack High Data + SMPDefsFlags[STARS_NN_punpcklqdq] = false; // Unpack Low Data + SMPDefsFlags[STARS_NN_shufpd] = false; // Shuffle Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_sqrtpd] = false; // Compute Square Roots of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_sqrtsd] = false; // Compute Square Rootof Scalar Double-Precision Floating-Point Value + SMPDefsFlags[STARS_NN_subpd] = false; // Subtract Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_subsd] = false; // Subtract Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_unpckhpd] = false; // Unpack and Interleave High Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_unpcklpd] = false; // Unpack and Interleave Low Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_xorpd] = false; // Bitwise Logical OR of Double-Precision Floating-Point Values + + + // AMD syscall/sysret instructions NOTE: not AMD, found in Intel manual + + + // AMD64 instructions NOTE: not AMD, found in Intel manual + + SMPDefsFlags[STARS_NN_swapgs] = false; // Exchange GS base with KernelGSBase MSR + + // New Pentium instructions (SSE3) + + SMPDefsFlags[STARS_NN_movddup] = false; // Move One Double-FP and Duplicate + SMPDefsFlags[STARS_NN_movshdup] = false; // Move Packed Single-FP High and Duplicate + SMPDefsFlags[STARS_NN_movsldup] = false; // Move Packed Single-FP Low and Duplicate + + // Missing AMD64 instructions NOTE: also found in Intel manual + + SMPDefsFlags[STARS_NN_movsxd] = false; // Move with Sign-Extend Doubleword + + // SSE3 instructions + + SMPDefsFlags[STARS_NN_addsubpd] = false; // Add /Sub packed DP FP numbers + SMPDefsFlags[STARS_NN_addsubps] = false; // Add /Sub packed SP FP numbers + SMPDefsFlags[STARS_NN_haddpd] = false; // Add horizontally packed DP FP numbers + SMPDefsFlags[STARS_NN_haddps] = false; // Add horizontally packed SP FP numbers + SMPDefsFlags[STARS_NN_hsubpd] = false; // Sub horizontally packed DP FP numbers + SMPDefsFlags[STARS_NN_hsubps] = false; // Sub horizontally packed SP FP numbers + SMPDefsFlags[STARS_NN_monitor] = false; // Set up a linear address range to be monitored by hardware + SMPDefsFlags[STARS_NN_mwait] = false; // Wait until write-back store performed within the range specified by the MONITOR instruction + SMPDefsFlags[STARS_NN_fisttp] = false; // Store ST in intXX (chop) and pop + SMPDefsFlags[STARS_NN_lddqu] = false; // Load unaligned integer 128-bit + + // SSSE3 instructions + + SMPDefsFlags[STARS_NN_psignb] = false; // Packed SIGN Byte + SMPDefsFlags[STARS_NN_psignw] = false; // Packed SIGN Word + SMPDefsFlags[STARS_NN_psignd] = false; // Packed SIGN Doubleword + SMPDefsFlags[STARS_NN_pshufb] = false; // Packed Shuffle Bytes + SMPDefsFlags[STARS_NN_pmulhrsw] = false; // Packed Multiply High with Round and Scale + SMPDefsFlags[STARS_NN_pmaddubsw] = false; // Multiply and Add Packed Signed and Unsigned Bytes + SMPDefsFlags[STARS_NN_phsubsw] = false; // Packed Horizontal Subtract and Saturate + SMPDefsFlags[STARS_NN_phaddsw] = false; // Packed Horizontal Add and Saturate + SMPDefsFlags[STARS_NN_phaddw] = false; // Packed Horizontal Add Word + SMPDefsFlags[STARS_NN_phaddd] = false; // Packed Horizontal Add Doubleword + SMPDefsFlags[STARS_NN_phsubw] = false; // Packed Horizontal Subtract Word + SMPDefsFlags[STARS_NN_phsubd] = false; // Packed Horizontal Subtract Doubleword + SMPDefsFlags[STARS_NN_palignr] = false; // Packed Align Right + SMPDefsFlags[STARS_NN_pabsb] = false; // Packed Absolute Value Byte + SMPDefsFlags[STARS_NN_pabsw] = false; // Packed Absolute Value Word + SMPDefsFlags[STARS_NN_pabsd] = false; // Packed Absolute Value Doubleword + + // VMX instructions + +#if 599 < IDA_SDK_VERSION + + SMPDefsFlags[STARS_NN_ud2] = false; // Undefined Instruction + + // Added with x86-64 + + SMPDefsFlags[STARS_NN_rdtscp] = false; // Read Time-Stamp Counter and Processor ID + + // Geode LX 3DNow! extensions + + SMPDefsFlags[STARS_NN_pfrcpv] = false; // Reciprocal Approximation for a Pair of 32-bit Floats + SMPDefsFlags[STARS_NN_pfrsqrtv] = false; // Reciprocal Square Root Approximation for a Pair of 32-bit Floats + + // SSE2 pseudoinstructions + + SMPDefsFlags[STARS_NN_cmpeqpd] = false; // Packed Double-FP Compare EQ + SMPDefsFlags[STARS_NN_cmpltpd] = false; // Packed Double-FP Compare LT + SMPDefsFlags[STARS_NN_cmplepd] = false; // Packed Double-FP Compare LE + SMPDefsFlags[STARS_NN_cmpunordpd] = false; // Packed Double-FP Compare UNORD + SMPDefsFlags[STARS_NN_cmpneqpd] = false; // Packed Double-FP Compare NOT EQ + SMPDefsFlags[STARS_NN_cmpnltpd] = false; // Packed Double-FP Compare NOT LT + SMPDefsFlags[STARS_NN_cmpnlepd] = false; // Packed Double-FP Compare NOT LE + SMPDefsFlags[STARS_NN_cmpordpd] = false; // Packed Double-FP Compare ORDERED + SMPDefsFlags[STARS_NN_cmpeqsd] = false; // Scalar Double-FP Compare EQ + SMPDefsFlags[STARS_NN_cmpltsd] = false; // Scalar Double-FP Compare LT + SMPDefsFlags[STARS_NN_cmplesd] = false; // Scalar Double-FP Compare LE + SMPDefsFlags[STARS_NN_cmpunordsd] = false; // Scalar Double-FP Compare UNORD + SMPDefsFlags[STARS_NN_cmpneqsd] = false; // Scalar Double-FP Compare NOT EQ + SMPDefsFlags[STARS_NN_cmpnltsd] = false; // Scalar Double-FP Compare NOT LT + SMPDefsFlags[STARS_NN_cmpnlesd] = false; // Scalar Double-FP Compare NOT LE + SMPDefsFlags[STARS_NN_cmpordsd] = false; // Scalar Double-FP Compare ORDERED + + // SSSE4.1 instructions + + SMPDefsFlags[STARS_NN_blendpd] = false; // Blend Packed Double Precision Floating-Point Values + SMPDefsFlags[STARS_NN_blendps] = false; // Blend Packed Single Precision Floating-Point Values + SMPDefsFlags[STARS_NN_blendvpd] = false; // Variable Blend Packed Double Precision Floating-Point Values + SMPDefsFlags[STARS_NN_blendvps] = false; // Variable Blend Packed Single Precision Floating-Point Values + SMPDefsFlags[STARS_NN_dppd] = false; // Dot Product of Packed Double Precision Floating-Point Values + SMPDefsFlags[STARS_NN_dpps] = false; // Dot Product of Packed Single Precision Floating-Point Values + SMPDefsFlags[STARS_NN_extractps] = 2; // Extract Packed Single Precision Floating-Point Value + SMPDefsFlags[STARS_NN_insertps] = false; // Insert Packed Single Precision Floating-Point Value + SMPDefsFlags[STARS_NN_movntdqa] = false; // Load Double Quadword Non-Temporal Aligned Hint + SMPDefsFlags[STARS_NN_mpsadbw] = false; // Compute Multiple Packed Sums of Absolute Difference + SMPDefsFlags[STARS_NN_packusdw] = false; // Pack with Unsigned Saturation + SMPDefsFlags[STARS_NN_pblendvb] = false; // Variable Blend Packed Bytes + SMPDefsFlags[STARS_NN_pblendw] = false; // Blend Packed Words + SMPDefsFlags[STARS_NN_pcmpeqq] = false; // Compare Packed Qword Data for Equal + SMPDefsFlags[STARS_NN_pextrb] = false; // Extract Byte + SMPDefsFlags[STARS_NN_pextrd] = false; // Extract Dword + SMPDefsFlags[STARS_NN_pextrq] = false; // Extract Qword + SMPDefsFlags[STARS_NN_phminposuw] = false; // Packed Horizontal Word Minimum + SMPDefsFlags[STARS_NN_pinsrb] = false; // Insert Byte + SMPDefsFlags[STARS_NN_pinsrd] = false; // Insert Dword + SMPDefsFlags[STARS_NN_pinsrq] = false; // Insert Qword + SMPDefsFlags[STARS_NN_pmaxsb] = false; // Maximum of Packed Signed Byte Integers + SMPDefsFlags[STARS_NN_pmaxsd] = false; // Maximum of Packed Signed Dword Integers + SMPDefsFlags[STARS_NN_pmaxud] = false; // Maximum of Packed Unsigned Dword Integers + SMPDefsFlags[STARS_NN_pmaxuw] = false; // Maximum of Packed Word Integers + SMPDefsFlags[STARS_NN_pminsb] = false; // Minimum of Packed Signed Byte Integers + SMPDefsFlags[STARS_NN_pminsd] = false; // Minimum of Packed Signed Dword Integers + SMPDefsFlags[STARS_NN_pminud] = false; // Minimum of Packed Unsigned Dword Integers + SMPDefsFlags[STARS_NN_pminuw] = false; // Minimum of Packed Word Integers + SMPDefsFlags[STARS_NN_pmovsxbw] = false; // Packed Move with Sign Extend + SMPDefsFlags[STARS_NN_pmovsxbd] = false; // Packed Move with Sign Extend + SMPDefsFlags[STARS_NN_pmovsxbq] = false; // Packed Move with Sign Extend + SMPDefsFlags[STARS_NN_pmovsxwd] = false; // Packed Move with Sign Extend + SMPDefsFlags[STARS_NN_pmovsxwq] = false; // Packed Move with Sign Extend + SMPDefsFlags[STARS_NN_pmovsxdq] = false; // Packed Move with Sign Extend + SMPDefsFlags[STARS_NN_pmovzxbw] = false; // Packed Move with Zero Extend + SMPDefsFlags[STARS_NN_pmovzxbd] = false; // Packed Move with Zero Extend + SMPDefsFlags[STARS_NN_pmovzxbq] = false; // Packed Move with Zero Extend + SMPDefsFlags[STARS_NN_pmovzxwd] = false; // Packed Move with Zero Extend + SMPDefsFlags[STARS_NN_pmovzxwq] = false; // Packed Move with Zero Extend + SMPDefsFlags[STARS_NN_pmovzxdq] = false; // Packed Move with Zero Extend + SMPDefsFlags[STARS_NN_pmuldq] = false; // Multiply Packed Signed Dword Integers + SMPDefsFlags[STARS_NN_pmulld] = false; // Multiply Packed Signed Dword Integers and Store Low Result + SMPDefsFlags[STARS_NN_roundpd] = false; // Round Packed Double Precision Floating-Point Values + SMPDefsFlags[STARS_NN_roundps] = false; // Round Packed Single Precision Floating-Point Values + SMPDefsFlags[STARS_NN_roundsd] = false; // Round Scalar Double Precision Floating-Point Values + SMPDefsFlags[STARS_NN_roundss] = false; // Round Scalar Single Precision Floating-Point Values + + // SSSE4.2 instructions + SMPDefsFlags[STARS_NN_crc32] = false; // Accumulate CRC32 Value + SMPDefsFlags[STARS_NN_pcmpgtq] = false; // Compare Packed Data for Greater Than + + // AMD SSE4a instructions + + SMPDefsFlags[STARS_NN_extrq] = false; // Extract Field From Register + SMPDefsFlags[STARS_NN_insertq] = false; // Insert Field + SMPDefsFlags[STARS_NN_movntsd] = false; // Move Non-Temporal Scalar Double-Precision Floating-Point + SMPDefsFlags[STARS_NN_movntss] = false; // Move Non-Temporal Scalar Single-Precision Floating-Point + + // xsave/xrstor instructions + + SMPDefsFlags[STARS_NN_xgetbv] = false; // Get Value of Extended Control Register + SMPDefsFlags[STARS_NN_xrstor] = false; // Restore Processor Extended States + SMPDefsFlags[STARS_NN_xsave] = false; // Save Processor Extended States + SMPDefsFlags[STARS_NN_xsetbv] = false; // Set Value of Extended Control Register + + // Intel Safer Mode Extensions (SMX) + + // AMD-V Virtualization ISA Extension + + SMPDefsFlags[STARS_NN_invlpga] = false; // Invalidate TLB Entry in a Specified ASID + SMPDefsFlags[STARS_NN_skinit] = false; // Secure Init and Jump with Attestation + SMPDefsFlags[STARS_NN_vmexit] = false; // Stop Executing Guest, Begin Executing Host + SMPDefsFlags[STARS_NN_vmload] = false; // Load State from VMCB + SMPDefsFlags[STARS_NN_vmmcall] = false; // Call VMM + SMPDefsFlags[STARS_NN_vmrun] = false; // Run Virtual Machine + SMPDefsFlags[STARS_NN_vmsave] = false; // Save State to VMCB + + // VMX+ instructions + + SMPDefsFlags[STARS_NN_invept] = false; // Invalidate Translations Derived from EPT + SMPDefsFlags[STARS_NN_invvpid] = false; // Invalidate Translations Based on VPID + + // Intel Atom instructions + + SMPDefsFlags[STARS_NN_movbe] = false; // Move Data After Swapping Bytes + + // Intel AES instructions + + SMPDefsFlags[STARS_NN_aesenc] = false; // Perform One Round of an AES Encryption Flow + SMPDefsFlags[STARS_NN_aesenclast] = false; // Perform the Last Round of an AES Encryption Flow + SMPDefsFlags[STARS_NN_aesdec] = false; // Perform One Round of an AES Decryption Flow + SMPDefsFlags[STARS_NN_aesdeclast] = false; // Perform the Last Round of an AES Decryption Flow + SMPDefsFlags[STARS_NN_aesimc] = false; // Perform the AES InvMixColumn Transformation + SMPDefsFlags[STARS_NN_aeskeygenassist] = false; // AES Round Key Generation Assist + + // Carryless multiplication + + SMPDefsFlags[STARS_NN_pclmulqdq] = false; // Carry-Less Multiplication Quadword + + // Returns modified by operand size prefixes + + SMPDefsFlags[STARS_NN_retnw] = false; // Return Near from Procedure (use16) + SMPDefsFlags[STARS_NN_retnd] = false; // Return Near from Procedure (use32) + SMPDefsFlags[STARS_NN_retnq] = false; // Return Near from Procedure (use64) + SMPDefsFlags[STARS_NN_retfw] = false; // Return Far from Procedure (use16) + SMPDefsFlags[STARS_NN_retfd] = false; // Return Far from Procedure (use32) + SMPDefsFlags[STARS_NN_retfq] = false; // Return Far from Procedure (use64) + + // RDRAND support + + // new GPR instructions + + SMPDefsFlags[STARS_NN_mulx] = false; // Unsigned Multiply Without Affecting Flags + SMPDefsFlags[STARS_NN_pdep] = false; // Parallel Bits Deposit + SMPDefsFlags[STARS_NN_pext] = false; // Parallel Bits Extract + SMPDefsFlags[STARS_NN_rorx] = false; // Rotate Right Logical Without Affecting Flags + SMPDefsFlags[STARS_NN_sarx] = false; // Shift Arithmetically Right Without Affecting Flags + SMPDefsFlags[STARS_NN_shlx] = false; // Shift Logically Left Without Affecting Flags + SMPDefsFlags[STARS_NN_shrx] = false; // Shift Logically Right Without Affecting Flags + + SMPDefsFlags[STARS_NN_xsaveopt] = false; // Save Processor Extended States Optimized + SMPDefsFlags[STARS_NN_invpcid] = false; // Invalidate Processor Context ID + SMPDefsFlags[STARS_NN_rdseed] = false; // Read Random Seed + SMPDefsFlags[STARS_NN_rdfsbase] = false; // Read FS Segment Base + SMPDefsFlags[STARS_NN_rdgsbase] = false; // Read GS Segment Base + SMPDefsFlags[STARS_NN_wrfsbase] = false; // Write FS Segment Base + SMPDefsFlags[STARS_NN_wrgsbase] = false; // Write GS Segment Base + + // new AVX instructions + + SMPDefsFlags[STARS_NN_vaddpd] = false; // Add Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vaddps] = false; // Packed Single-FP Add + SMPDefsFlags[STARS_NN_vaddsd] = false; // Add Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vaddss] = false; // Scalar Single-FP Add + SMPDefsFlags[STARS_NN_vaddsubpd] = false; // Add /Sub packed DP FP numbers + SMPDefsFlags[STARS_NN_vaddsubps] = false; // Add /Sub packed SP FP numbers + SMPDefsFlags[STARS_NN_vaesdec] = false; // Perform One Round of an AES Decryption Flow + SMPDefsFlags[STARS_NN_vaesdeclast] = false; // Perform the Last Round of an AES Decryption Flow + SMPDefsFlags[STARS_NN_vaesenc] = false; // Perform One Round of an AES Encryption Flow + SMPDefsFlags[STARS_NN_vaesenclast] = false; // Perform the Last Round of an AES Encryption Flow + SMPDefsFlags[STARS_NN_vaesimc] = false; // Perform the AES InvMixColumn Transformation + SMPDefsFlags[STARS_NN_vaeskeygenassist] = false; // AES Round Key Generation Assist + SMPDefsFlags[STARS_NN_vandnpd] = false; // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vandnps] = false; // Bitwise Logical And Not for Single-FP + SMPDefsFlags[STARS_NN_vandpd] = false; // Bitwise Logical AND of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vandps] = false; // Bitwise Logical And for Single-FP + SMPDefsFlags[STARS_NN_vblendpd] = false; // Blend Packed Double Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vblendps] = false; // Blend Packed Single Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vblendvpd] = false; // Variable Blend Packed Double Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vblendvps] = false; // Variable Blend Packed Single Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vbroadcastf128] = false; // Broadcast 128 Bits of Floating-Point Data + SMPDefsFlags[STARS_NN_vbroadcasti128] = false; // Broadcast 128 Bits of Integer Data + SMPDefsFlags[STARS_NN_vbroadcastsd] = false; // Broadcast Double-Precision Floating-Point Element + SMPDefsFlags[STARS_NN_vbroadcastss] = false; // Broadcast Single-Precision Floating-Point Element + SMPDefsFlags[STARS_NN_vcmppd] = false; // Compare Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vcmpps] = false; // Packed Single-FP Compare + SMPDefsFlags[STARS_NN_vcmpsd] = false; // Compare Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vcmpss] = false; // Scalar Single-FP Compare + SMPDefsFlags[STARS_NN_vcomisd] = false; // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + SMPDefsFlags[STARS_NN_vcomiss] = false; // Scalar Ordered Single-FP Compare and Set EFLAGS + SMPDefsFlags[STARS_NN_vcvtdq2pd] = false; // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vcvtdq2ps] = false; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vcvtpd2dq] = false; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + SMPDefsFlags[STARS_NN_vcvtpd2ps] = false; // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vcvtph2ps] = false; // Convert 16-bit FP Values to Single-Precision FP Values + SMPDefsFlags[STARS_NN_vcvtps2dq] = false; // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + SMPDefsFlags[STARS_NN_vcvtps2pd] = false; // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vcvtps2ph] = false; // Convert Single-Precision FP value to 16-bit FP value + SMPDefsFlags[STARS_NN_vcvtsd2si] = false; // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer + SMPDefsFlags[STARS_NN_vcvtsd2ss] = false; // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value + SMPDefsFlags[STARS_NN_vcvtsi2sd] = false; // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value + SMPDefsFlags[STARS_NN_vcvtsi2ss] = false; // Scalar signed INT32 to Single-FP conversion + SMPDefsFlags[STARS_NN_vcvtss2sd] = false; // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value + SMPDefsFlags[STARS_NN_vcvtss2si] = false; // Scalar Single-FP to signed INT32 conversion + SMPDefsFlags[STARS_NN_vcvttpd2dq] = false; // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + SMPDefsFlags[STARS_NN_vcvttps2dq] = false; // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + SMPDefsFlags[STARS_NN_vcvttsd2si] = false; // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer + SMPDefsFlags[STARS_NN_vcvttss2si] = false; // Scalar Single-FP to signed INT32 conversion (truncate) + SMPDefsFlags[STARS_NN_vdivpd] = false; // Divide Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vdivps] = false; // Packed Single-FP Divide + SMPDefsFlags[STARS_NN_vdivsd] = false; // Divide Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vdivss] = false; // Scalar Single-FP Divide + SMPDefsFlags[STARS_NN_vdppd] = false; // Dot Product of Packed Double Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vdpps] = false; // Dot Product of Packed Single Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vextractf128] = false; // Extract Packed Floating-Point Values + SMPDefsFlags[STARS_NN_vextracti128] = false; // Extract Packed Integer Values + SMPDefsFlags[STARS_NN_vextractps] = false; // Extract Packed Floating-Point Values + SMPDefsFlags[STARS_NN_vfmadd132pd] = false; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmadd132ps] = false; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmadd132sd] = false; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmadd132ss] = false; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmadd213pd] = false; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmadd213ps] = false; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmadd213sd] = false; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmadd213ss] = false; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmadd231pd] = false; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmadd231ps] = false; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmadd231sd] = false; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmadd231ss] = false; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmaddsub132pd] = false; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmaddsub132ps] = false; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmaddsub213pd] = false; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmaddsub213ps] = false; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmaddsub231pd] = false; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmaddsub231ps] = false; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsub132pd] = false; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsub132ps] = false; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsub132sd] = false; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsub132ss] = false; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsub213pd] = false; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsub213ps] = false; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsub213sd] = false; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsub213ss] = false; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsub231pd] = false; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsub231ps] = false; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsub231sd] = false; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsub231ss] = false; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsubadd132pd] = false; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsubadd132ps] = false; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsubadd213pd] = false; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsubadd213ps] = false; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsubadd231pd] = false; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfmsubadd231ps] = false; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmadd132pd] = false; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmadd132ps] = false; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmadd132sd] = false; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmadd132ss] = false; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmadd213pd] = false; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmadd213ps] = false; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmadd213sd] = false; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmadd213ss] = false; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmadd231pd] = false; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmadd231ps] = false; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmadd231sd] = false; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmadd231ss] = false; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmsub132pd] = false; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmsub132ps] = false; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmsub132sd] = false; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmsub132ss] = false; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmsub213pd] = false; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmsub213ps] = false; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmsub213sd] = false; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmsub213ss] = false; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmsub231pd] = false; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmsub231ps] = false; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmsub231sd] = false; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vfnmsub231ss] = false; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vgatherdps] = false; // Gather Packed SP FP Values Using Signed Dword Indices + SMPDefsFlags[STARS_NN_vgatherdpd] = false; // Gather Packed DP FP Values Using Signed Dword Indices + SMPDefsFlags[STARS_NN_vgatherqps] = false; // Gather Packed SP FP Values Using Signed Qword Indices + SMPDefsFlags[STARS_NN_vgatherqpd] = false; // Gather Packed DP FP Values Using Signed Qword Indices + SMPDefsFlags[STARS_NN_vhaddpd] = false; // Add horizontally packed DP FP numbers + SMPDefsFlags[STARS_NN_vhaddps] = false; // Add horizontally packed SP FP numbers + SMPDefsFlags[STARS_NN_vhsubpd] = false; // Sub horizontally packed DP FP numbers + SMPDefsFlags[STARS_NN_vhsubps] = false; // Sub horizontally packed SP FP numbers + SMPDefsFlags[STARS_NN_vinsertf128] = false; // Insert Packed Floating-Point Values + SMPDefsFlags[STARS_NN_vinserti128] = false; // Insert Packed Integer Values + SMPDefsFlags[STARS_NN_vinsertps] = false; // Insert Packed Single Precision Floating-Point Value + SMPDefsFlags[STARS_NN_vlddqu] = false; // Load Unaligned Packed Integer Values + SMPDefsFlags[STARS_NN_vldmxcsr] = false; // Load Streaming SIMD Extensions Technology Control/Status Register + SMPDefsFlags[STARS_NN_vmaskmovdqu] = false; // Store Selected Bytes of Double Quadword with NT Hint + SMPDefsFlags[STARS_NN_vmaskmovpd] = false; // Conditionally Load Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vmaskmovps] = false; // Conditionally Load Packed Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vmaxpd] = false; // Return Maximum Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vmaxps] = false; // Packed Single-FP Maximum + SMPDefsFlags[STARS_NN_vmaxsd] = false; // Return Maximum Scalar Double-Precision Floating-Point Value + SMPDefsFlags[STARS_NN_vmaxss] = false; // Scalar Single-FP Maximum + SMPDefsFlags[STARS_NN_vminpd] = false; // Return Minimum Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vminps] = false; // Packed Single-FP Minimum + SMPDefsFlags[STARS_NN_vminsd] = false; // Return Minimum Scalar Double-Precision Floating-Point Value + SMPDefsFlags[STARS_NN_vminss] = false; // Scalar Single-FP Minimum + SMPDefsFlags[STARS_NN_vmovapd] = false; // Move Aligned Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vmovaps] = false; // Move Aligned Four Packed Single-FP + SMPDefsFlags[STARS_NN_vmovd] = false; // Move 32 bits + SMPDefsFlags[STARS_NN_vmovddup] = false; // Move One Double-FP and Duplicate + SMPDefsFlags[STARS_NN_vmovdqa] = false; // Move Aligned Double Quadword + SMPDefsFlags[STARS_NN_vmovdqu] = false; // Move Unaligned Double Quadword + SMPDefsFlags[STARS_NN_vmovhlps] = false; // Move High to Low Packed Single-FP + SMPDefsFlags[STARS_NN_vmovhpd] = false; // Move High Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vmovhps] = false; // Move High Packed Single-FP + SMPDefsFlags[STARS_NN_vmovlhps] = false; // Move Low to High Packed Single-FP + SMPDefsFlags[STARS_NN_vmovlpd] = false; // Move Low Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vmovlps] = false; // Move Low Packed Single-FP + SMPDefsFlags[STARS_NN_vmovmskpd] = false; // Extract Packed Double-Precision Floating-Point Sign Mask + SMPDefsFlags[STARS_NN_vmovmskps] = false; // Move Mask to Register + SMPDefsFlags[STARS_NN_vmovntdq] = false; // Store Double Quadword Using Non-Temporal Hint + SMPDefsFlags[STARS_NN_vmovntdqa] = false; // Load Double Quadword Non-Temporal Aligned Hint + SMPDefsFlags[STARS_NN_vmovntpd] = false; // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint + SMPDefsFlags[STARS_NN_vmovntps] = false; // Move Aligned Four Packed Single-FP Non Temporal + SMPDefsFlags[STARS_NN_vmovntsd] = false; // Move Non-Temporal Scalar Double-Precision Floating-Point + SMPDefsFlags[STARS_NN_vmovntss] = false; // Move Non-Temporal Scalar Single-Precision Floating-Point + SMPDefsFlags[STARS_NN_vmovq] = false; // Move 64 bits + SMPDefsFlags[STARS_NN_vmovsd] = false; // Move Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vmovshdup] = false; // Move Packed Single-FP High and Duplicate + SMPDefsFlags[STARS_NN_vmovsldup] = false; // Move Packed Single-FP Low and Duplicate + SMPDefsFlags[STARS_NN_vmovss] = false; // Move Scalar Single-FP + SMPDefsFlags[STARS_NN_vmovupd] = false; // Move Unaligned Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vmovups] = false; // Move Unaligned Four Packed Single-FP + SMPDefsFlags[STARS_NN_vmpsadbw] = false; // Compute Multiple Packed Sums of Absolute Difference + SMPDefsFlags[STARS_NN_vmulpd] = false; // Multiply Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vmulps] = false; // Packed Single-FP Multiply + SMPDefsFlags[STARS_NN_vmulsd] = false; // Multiply Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vmulss] = false; // Scalar Single-FP Multiply + SMPDefsFlags[STARS_NN_vorpd] = false; // Bitwise Logical OR of Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vorps] = false; // Bitwise Logical OR for Single-FP Data + SMPDefsFlags[STARS_NN_vpabsb] = false; // Packed Absolute Value Byte + SMPDefsFlags[STARS_NN_vpabsd] = false; // Packed Absolute Value Doubleword + SMPDefsFlags[STARS_NN_vpabsw] = false; // Packed Absolute Value Word + SMPDefsFlags[STARS_NN_vpackssdw] = false; // Pack with Signed Saturation (Dword->Word) + SMPDefsFlags[STARS_NN_vpacksswb] = false; // Pack with Signed Saturation (Word->Byte) + SMPDefsFlags[STARS_NN_vpackusdw] = false; // Pack with Unsigned Saturation + SMPDefsFlags[STARS_NN_vpackuswb] = false; // Pack with Unsigned Saturation (Word->Byte) + SMPDefsFlags[STARS_NN_vpaddb] = false; // Packed Add Byte + SMPDefsFlags[STARS_NN_vpaddd] = false; // Packed Add Dword + SMPDefsFlags[STARS_NN_vpaddq] = false; // Add Packed Quadword Integers + SMPDefsFlags[STARS_NN_vpaddsb] = false; // Packed Add with Saturation (Byte) + SMPDefsFlags[STARS_NN_vpaddsw] = false; // Packed Add with Saturation (Word) + SMPDefsFlags[STARS_NN_vpaddusb] = false; // Packed Add Unsigned with Saturation (Byte) + SMPDefsFlags[STARS_NN_vpaddusw] = false; // Packed Add Unsigned with Saturation (Word) + SMPDefsFlags[STARS_NN_vpaddw] = false; // Packed Add Word + SMPDefsFlags[STARS_NN_vpalignr] = false; // Packed Align Right + SMPDefsFlags[STARS_NN_vpand] = false; // Bitwise Logical And + SMPDefsFlags[STARS_NN_vpandn] = false; // Bitwise Logical And Not + SMPDefsFlags[STARS_NN_vpavgb] = false; // Packed Average (Byte) + SMPDefsFlags[STARS_NN_vpavgw] = false; // Packed Average (Word) + SMPDefsFlags[STARS_NN_vpblendd] = false; // Blend Packed Dwords + SMPDefsFlags[STARS_NN_vpblendvb] = false; // Variable Blend Packed Bytes + SMPDefsFlags[STARS_NN_vpblendw] = false; // Blend Packed Words + SMPDefsFlags[STARS_NN_vpbroadcastb] = false; // Broadcast a Byte Integer + SMPDefsFlags[STARS_NN_vpbroadcastd] = false; // Broadcast a Dword Integer + SMPDefsFlags[STARS_NN_vpbroadcastq] = false; // Broadcast a Qword Integer + SMPDefsFlags[STARS_NN_vpbroadcastw] = false; // Broadcast a Word Integer + SMPDefsFlags[STARS_NN_vpclmulqdq] = false; // Carry-Less Multiplication Quadword + SMPDefsFlags[STARS_NN_vpcmpeqb] = false; // Packed Compare for Equal (Byte) + SMPDefsFlags[STARS_NN_vpcmpeqd] = false; // Packed Compare for Equal (Dword) + SMPDefsFlags[STARS_NN_vpcmpeqq] = false; // Compare Packed Qword Data for Equal + SMPDefsFlags[STARS_NN_vpcmpeqw] = false; // Packed Compare for Equal (Word) + SMPDefsFlags[STARS_NN_vpcmpestri] = false; // Packed Compare Explicit Length Strings, Return Index + SMPDefsFlags[STARS_NN_vpcmpestrm] = false; // Packed Compare Explicit Length Strings, Return Mask + SMPDefsFlags[STARS_NN_vpcmpgtb] = false; // Packed Compare for Greater Than (Byte) + SMPDefsFlags[STARS_NN_vpcmpgtd] = false; // Packed Compare for Greater Than (Dword) + SMPDefsFlags[STARS_NN_vpcmpgtq] = false; // Compare Packed Data for Greater Than + SMPDefsFlags[STARS_NN_vpcmpgtw] = false; // Packed Compare for Greater Than (Word) + SMPDefsFlags[STARS_NN_vpcmpistri] = false; // Packed Compare Implicit Length Strings, Return Index + SMPDefsFlags[STARS_NN_vpcmpistrm] = false; // Packed Compare Implicit Length Strings, Return Mask + SMPDefsFlags[STARS_NN_vperm2f128] = false; // Permute Floating-Point Values + SMPDefsFlags[STARS_NN_vperm2i128] = false; // Permute Integer Values + SMPDefsFlags[STARS_NN_vpermd] = false; // Full Doublewords Element Permutation + SMPDefsFlags[STARS_NN_vpermilpd] = false; // Permute Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vpermilps] = false; // Permute Single-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vpermpd] = false; // Permute Double-Precision Floating-Point Elements + SMPDefsFlags[STARS_NN_vpermps] = false; // Permute Single-Precision Floating-Point Elements + SMPDefsFlags[STARS_NN_vpermq] = false; // Qwords Element Permutation + SMPDefsFlags[STARS_NN_vpextrb] = false; // Extract Byte + SMPDefsFlags[STARS_NN_vpextrd] = false; // Extract Dword + SMPDefsFlags[STARS_NN_vpextrq] = false; // Extract Qword + SMPDefsFlags[STARS_NN_vpextrw] = false; // Extract Word + SMPDefsFlags[STARS_NN_vpgatherdd] = false; // Gather Packed Dword Values Using Signed Dword Indices + SMPDefsFlags[STARS_NN_vpgatherdq] = false; // Gather Packed Qword Values Using Signed Dword Indices + SMPDefsFlags[STARS_NN_vpgatherqd] = false; // Gather Packed Dword Values Using Signed Qword Indices + SMPDefsFlags[STARS_NN_vpgatherqq] = false; // Gather Packed Qword Values Using Signed Qword Indices + SMPDefsFlags[STARS_NN_vphaddd] = false; // Packed Horizontal Add Doubleword + SMPDefsFlags[STARS_NN_vphaddsw] = false; // Packed Horizontal Add and Saturate + SMPDefsFlags[STARS_NN_vphaddw] = false; // Packed Horizontal Add Word + SMPDefsFlags[STARS_NN_vphminposuw] = false; // Packed Horizontal Word Minimum + SMPDefsFlags[STARS_NN_vphsubd] = false; // Packed Horizontal Subtract Doubleword + SMPDefsFlags[STARS_NN_vphsubsw] = false; // Packed Horizontal Subtract and Saturate + SMPDefsFlags[STARS_NN_vphsubw] = false; // Packed Horizontal Subtract Word + SMPDefsFlags[STARS_NN_vpinsrb] = false; // Insert Byte + SMPDefsFlags[STARS_NN_vpinsrd] = false; // Insert Dword + SMPDefsFlags[STARS_NN_vpinsrq] = false; // Insert Qword + SMPDefsFlags[STARS_NN_vpinsrw] = false; // Insert Word + SMPDefsFlags[STARS_NN_vpmaddubsw] = false; // Multiply and Add Packed Signed and Unsigned Bytes + SMPDefsFlags[STARS_NN_vpmaddwd] = false; // Packed Multiply and Add + SMPDefsFlags[STARS_NN_vpmaskmovd] = false; // Conditionally Store Dword Values Using Mask + SMPDefsFlags[STARS_NN_vpmaskmovq] = false; // Conditionally Store Qword Values Using Mask + SMPDefsFlags[STARS_NN_vpmaxsb] = false; // Maximum of Packed Signed Byte Integers + SMPDefsFlags[STARS_NN_vpmaxsd] = false; // Maximum of Packed Signed Dword Integers + SMPDefsFlags[STARS_NN_vpmaxsw] = false; // Packed Signed Integer Word Maximum + SMPDefsFlags[STARS_NN_vpmaxub] = false; // Packed Unsigned Integer Byte Maximum + SMPDefsFlags[STARS_NN_vpmaxud] = false; // Maximum of Packed Unsigned Dword Integers + SMPDefsFlags[STARS_NN_vpmaxuw] = false; // Maximum of Packed Word Integers + SMPDefsFlags[STARS_NN_vpminsb] = false; // Minimum of Packed Signed Byte Integers + SMPDefsFlags[STARS_NN_vpminsd] = false; // Minimum of Packed Signed Dword Integers + SMPDefsFlags[STARS_NN_vpminsw] = false; // Packed Signed Integer Word Minimum + SMPDefsFlags[STARS_NN_vpminub] = false; // Packed Unsigned Integer Byte Minimum + SMPDefsFlags[STARS_NN_vpminud] = false; // Minimum of Packed Unsigned Dword Integers + SMPDefsFlags[STARS_NN_vpminuw] = false; // Minimum of Packed Word Integers + SMPDefsFlags[STARS_NN_vpmovmskb] = false; // Move Byte Mask to Integer + SMPDefsFlags[STARS_NN_vpmovsxbd] = false; // Packed Move with Sign Extend + SMPDefsFlags[STARS_NN_vpmovsxbq] = false; // Packed Move with Sign Extend + SMPDefsFlags[STARS_NN_vpmovsxbw] = false; // Packed Move with Sign Extend + SMPDefsFlags[STARS_NN_vpmovsxdq] = false; // Packed Move with Sign Extend + SMPDefsFlags[STARS_NN_vpmovsxwd] = false; // Packed Move with Sign Extend + SMPDefsFlags[STARS_NN_vpmovsxwq] = false; // Packed Move with Sign Extend + SMPDefsFlags[STARS_NN_vpmovzxbd] = false; // Packed Move with Zero Extend + SMPDefsFlags[STARS_NN_vpmovzxbq] = false; // Packed Move with Zero Extend + SMPDefsFlags[STARS_NN_vpmovzxbw] = false; // Packed Move with Zero Extend + SMPDefsFlags[STARS_NN_vpmovzxdq] = false; // Packed Move with Zero Extend + SMPDefsFlags[STARS_NN_vpmovzxwd] = false; // Packed Move with Zero Extend + SMPDefsFlags[STARS_NN_vpmovzxwq] = false; // Packed Move with Zero Extend + SMPDefsFlags[STARS_NN_vpmuldq] = false; // Multiply Packed Signed Dword Integers + SMPDefsFlags[STARS_NN_vpmulhrsw] = false; // Packed Multiply High with Round and Scale + SMPDefsFlags[STARS_NN_vpmulhuw] = false; // Packed Multiply High Unsigned + SMPDefsFlags[STARS_NN_vpmulhw] = false; // Packed Multiply High + SMPDefsFlags[STARS_NN_vpmulld] = false; // Multiply Packed Signed Dword Integers and Store Low Result + SMPDefsFlags[STARS_NN_vpmullw] = false; // Packed Multiply Low + SMPDefsFlags[STARS_NN_vpmuludq] = false; // Multiply Packed Unsigned Doubleword Integers + SMPDefsFlags[STARS_NN_vpor] = false; // Bitwise Logical Or + SMPDefsFlags[STARS_NN_vpsadbw] = false; // Packed Sum of Absolute Differences + SMPDefsFlags[STARS_NN_vpshufb] = false; // Packed Shuffle Bytes + SMPDefsFlags[STARS_NN_vpshufd] = false; // Shuffle Packed Doublewords + SMPDefsFlags[STARS_NN_vpshufhw] = false; // Shuffle Packed High Words + SMPDefsFlags[STARS_NN_vpshuflw] = false; // Shuffle Packed Low Words + SMPDefsFlags[STARS_NN_vpsignb] = false; // Packed SIGN Byte + SMPDefsFlags[STARS_NN_vpsignd] = false; // Packed SIGN Doubleword + SMPDefsFlags[STARS_NN_vpsignw] = false; // Packed SIGN Word + SMPDefsFlags[STARS_NN_vpslld] = false; // Packed Shift Left Logical (Dword) + SMPDefsFlags[STARS_NN_vpslldq] = false; // Shift Double Quadword Left Logical + SMPDefsFlags[STARS_NN_vpsllq] = false; // Packed Shift Left Logical (Qword) + SMPDefsFlags[STARS_NN_vpsllvd] = false; // Variable Bit Shift Left Logical (Dword) + SMPDefsFlags[STARS_NN_vpsllvq] = false; // Variable Bit Shift Left Logical (Qword) + SMPDefsFlags[STARS_NN_vpsllw] = false; // Packed Shift Left Logical (Word) + SMPDefsFlags[STARS_NN_vpsrad] = false; // Packed Shift Right Arithmetic (Dword) + SMPDefsFlags[STARS_NN_vpsravd] = false; // Variable Bit Shift Right Arithmetic + SMPDefsFlags[STARS_NN_vpsraw] = false; // Packed Shift Right Arithmetic (Word) + SMPDefsFlags[STARS_NN_vpsrld] = false; // Packed Shift Right Logical (Dword) + SMPDefsFlags[STARS_NN_vpsrldq] = false; // Shift Double Quadword Right Logical (Qword) + SMPDefsFlags[STARS_NN_vpsrlq] = false; // Packed Shift Right Logical (Qword) + SMPDefsFlags[STARS_NN_vpsrlvd] = false; // Variable Bit Shift Right Logical (Dword) + SMPDefsFlags[STARS_NN_vpsrlvq] = false; // Variable Bit Shift Right Logical (Qword) + SMPDefsFlags[STARS_NN_vpsrlw] = false; // Packed Shift Right Logical (Word) + SMPDefsFlags[STARS_NN_vpsubb] = false; // Packed Subtract Byte + SMPDefsFlags[STARS_NN_vpsubd] = false; // Packed Subtract Dword + SMPDefsFlags[STARS_NN_vpsubq] = false; // Subtract Packed Quadword Integers + SMPDefsFlags[STARS_NN_vpsubsb] = false; // Packed Subtract with Saturation (Byte) + SMPDefsFlags[STARS_NN_vpsubsw] = false; // Packed Subtract with Saturation (Word) + SMPDefsFlags[STARS_NN_vpsubusb] = false; // Packed Subtract Unsigned with Saturation (Byte) + SMPDefsFlags[STARS_NN_vpsubusw] = false; // Packed Subtract Unsigned with Saturation (Word) + SMPDefsFlags[STARS_NN_vpsubw] = false; // Packed Subtract Word + SMPDefsFlags[STARS_NN_vptest] = false; // Logical Compare + SMPDefsFlags[STARS_NN_vpunpckhbw] = false; // Unpack High Packed Data (Byte->Word) + SMPDefsFlags[STARS_NN_vpunpckhdq] = false; // Unpack High Packed Data (Dword->Qword) + SMPDefsFlags[STARS_NN_vpunpckhqdq] = false; // Unpack High Packed Data (Qword->Xmmword) + SMPDefsFlags[STARS_NN_vpunpckhwd] = false; // Unpack High Packed Data (Word->Dword) + SMPDefsFlags[STARS_NN_vpunpcklbw] = false; // Unpack Low Packed Data (Byte->Word) + SMPDefsFlags[STARS_NN_vpunpckldq] = false; // Unpack Low Packed Data (Dword->Qword) + SMPDefsFlags[STARS_NN_vpunpcklqdq] = false; // Unpack Low Packed Data (Qword->Xmmword) + SMPDefsFlags[STARS_NN_vpunpcklwd] = false; // Unpack Low Packed Data (Word->Dword) + SMPDefsFlags[STARS_NN_vpxor] = false; // Bitwise Logical Exclusive Or + SMPDefsFlags[STARS_NN_vrcpps] = false; // Packed Single-FP Reciprocal + SMPDefsFlags[STARS_NN_vrcpss] = false; // Scalar Single-FP Reciprocal + SMPDefsFlags[STARS_NN_vroundpd] = false; // Round Packed Double Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vroundps] = false; // Round Packed Single Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vroundsd] = false; // Round Scalar Double Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vroundss] = false; // Round Scalar Single Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vrsqrtps] = false; // Packed Single-FP Square Root Reciprocal + SMPDefsFlags[STARS_NN_vrsqrtss] = false; // Scalar Single-FP Square Root Reciprocal + SMPDefsFlags[STARS_NN_vshufpd] = false; // Shuffle Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vshufps] = false; // Shuffle Single-FP + SMPDefsFlags[STARS_NN_vsqrtpd] = false; // Compute Square Roots of Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vsqrtps] = false; // Packed Single-FP Square Root + SMPDefsFlags[STARS_NN_vsqrtsd] = false; // Compute Square Rootof Scalar Double-Precision Floating-Point Value + SMPDefsFlags[STARS_NN_vsqrtss] = false; // Scalar Single-FP Square Root + SMPDefsFlags[STARS_NN_vstmxcsr] = false; // Store Streaming SIMD Extensions Technology Control/Status Register + SMPDefsFlags[STARS_NN_vsubpd] = false; // Subtract Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vsubps] = false; // Packed Single-FP Subtract + SMPDefsFlags[STARS_NN_vsubsd] = false; // Subtract Scalar Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vsubss] = false; // Scalar Single-FP Subtract + SMPDefsFlags[STARS_NN_vtestpd] = false; // Packed Double-Precision Floating-Point Bit Test + SMPDefsFlags[STARS_NN_vtestps] = false; // Packed Single-Precision Floating-Point Bit Test + SMPDefsFlags[STARS_NN_vucomisd] = false; // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + SMPDefsFlags[STARS_NN_vucomiss] = false; // Scalar Unordered Single-FP Compare and Set EFLAGS + SMPDefsFlags[STARS_NN_vunpckhpd] = false; // Unpack and Interleave High Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vunpckhps] = false; // Unpack High Packed Single-FP Data + SMPDefsFlags[STARS_NN_vunpcklpd] = false; // Unpack and Interleave Low Packed Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vunpcklps] = false; // Unpack Low Packed Single-FP Data + SMPDefsFlags[STARS_NN_vxorpd] = false; // Bitwise Logical OR of Double-Precision Floating-Point Values + SMPDefsFlags[STARS_NN_vxorps] = false; // Bitwise Logical XOR for Single-FP Data + SMPDefsFlags[STARS_NN_vzeroall] = false; // Zero All YMM Registers + SMPDefsFlags[STARS_NN_vzeroupper] = false; // Zero Upper Bits of YMM Registers + + // Transactional Synchronization Extensions + + SMPDefsFlags[STARS_NN_xabort] = false; // Transaction Abort + SMPDefsFlags[STARS_NN_xbegin] = false; // Transaction Begin + SMPDefsFlags[STARS_NN_xend] = false; // Transaction End + SMPDefsFlags[STARS_NN_xtest] = false; // Test If In Transactional Execution + + // Virtual PC synthetic instructions + + SMPDefsFlags[STARS_NN_vmgetinfo] = false; // Virtual PC - Get VM Information + SMPDefsFlags[STARS_NN_vmsetinfo] = false; // Virtual PC - Set VM Information + SMPDefsFlags[STARS_NN_vmdxdsbl] = false; // Virtual PC - Disable Direct Execution + SMPDefsFlags[STARS_NN_vmdxenbl] = false; // Virtual PC - Enable Direct Execution + SMPDefsFlags[STARS_NN_vmcpuid] = false; // Virtual PC - Virtualized CPU Information + SMPDefsFlags[STARS_NN_vmhlt] = false; // Virtual PC - Halt + SMPDefsFlags[STARS_NN_vmsplaf] = false; // Virtual PC - Spin Lock Acquisition Failed + SMPDefsFlags[STARS_NN_vmpushfd] = false; // Virtual PC - Push virtualized flags register + SMPDefsFlags[STARS_NN_vmpopfd] = false; // Virtual PC - Pop virtualized flags register + SMPDefsFlags[STARS_NN_vmcli] = false; // Virtual PC - Clear Interrupt Flag + SMPDefsFlags[STARS_NN_vmsti] = false; // Virtual PC - Set Interrupt Flag + SMPDefsFlags[STARS_NN_vmiretd] = false; // Virtual PC - Return From Interrupt + SMPDefsFlags[STARS_NN_vmsgdt] = false; // Virtual PC - Store Global Descriptor Table + SMPDefsFlags[STARS_NN_vmsidt] = false; // Virtual PC - Store Interrupt Descriptor Table + SMPDefsFlags[STARS_NN_vmsldt] = false; // Virtual PC - Store Local Descriptor Table + SMPDefsFlags[STARS_NN_vmstr] = false; // Virtual PC - Store Task Register + SMPDefsFlags[STARS_NN_vmsdte] = false; // Virtual PC - Store to Descriptor Table Entry + SMPDefsFlags[STARS_NN_vpcext] = false; // Virtual PC - ISA extension + +#endif // 599 < IDA_SDK_VERSION + + SMPDefsFlags[STARS_NN_last] = false; + + return; + +} // end of STARS_Program_t::InitSMPDefsFlags() + +// Initialize the SMPUsesFlags[] array to define how we emit +// optimizing annotations. +void STARS_Program_t::InitSMPUsesFlags(void) { + // Default value is false. Few instructions use the flags. + (void) memset(SMPUsesFlags, false, sizeof(SMPUsesFlags)); + + SMPUsesFlags[STARS_NN_null] = true; // Unknown Operation + SMPUsesFlags[STARS_NN_aaa] = true; // ASCII adjust after addition + SMPUsesFlags[STARS_NN_aas] = true; // ASCII adjust after subtraction + SMPUsesFlags[STARS_NN_adc] = true; // Add with Carry + SMPUsesFlags[STARS_NN_cmps] = true; // Compare Strings (uses DF direction flag) + SMPUsesFlags[STARS_NN_daa] = true; // Decimal Adjust AL after Addition + SMPUsesFlags[STARS_NN_das] = true; // Decimal Adjust AL after Subtraction + SMPUsesFlags[STARS_NN_ins] = true; // Input Byte(s) from Port to String + SMPUsesFlags[STARS_NN_into] = true; // Call to Interrupt Procedure if Overflow Flag = 1 + SMPUsesFlags[STARS_NN_ja] = true; // Jump if Above (CF=0 & ZF=0) + SMPUsesFlags[STARS_NN_jae] = true; // Jump if Above or Equal (CF=0) + SMPUsesFlags[STARS_NN_jb] = true; // Jump if Below (CF=1) + SMPUsesFlags[STARS_NN_jbe] = true; // Jump if Below or Equal (CF=1 | ZF=1) + SMPUsesFlags[STARS_NN_jc] = true; // Jump if Carry (CF=1) + SMPUsesFlags[STARS_NN_jcxz] = true; // Jump if CX is 0 + SMPUsesFlags[STARS_NN_jecxz] = true; // Jump if ECX is 0 + SMPUsesFlags[STARS_NN_jrcxz] = true; // Jump if RCX is 0 + SMPUsesFlags[STARS_NN_je] = true; // Jump if Equal (ZF=1) + SMPUsesFlags[STARS_NN_jg] = true; // Jump if Greater (ZF=0 & SF=OF) + SMPUsesFlags[STARS_NN_jge] = true; // Jump if Greater or Equal (SF=OF) + SMPUsesFlags[STARS_NN_jl] = true; // Jump if Less (SF!=OF) + SMPUsesFlags[STARS_NN_jle] = true; // Jump if Less or Equal (ZF=1 | SF!=OF) + SMPUsesFlags[STARS_NN_jna] = true; // Jump if Not Above (CF=1 | ZF=1) + SMPUsesFlags[STARS_NN_jnae] = true; // Jump if Not Above or Equal (CF=1) + SMPUsesFlags[STARS_NN_jnb] = true; // Jump if Not Below (CF=0) + SMPUsesFlags[STARS_NN_jnbe] = true; // Jump if Not Below or Equal (CF=0 & ZF=0) + SMPUsesFlags[STARS_NN_jnc] = true; // Jump if Not Carry (CF=0) + SMPUsesFlags[STARS_NN_jne] = true; // Jump if Not Equal (ZF=0) + SMPUsesFlags[STARS_NN_jng] = true; // Jump if Not Greater (ZF=1 | SF!=OF) + SMPUsesFlags[STARS_NN_jnge] = true; // Jump if Not Greater or Equal (SF!=OF) + SMPUsesFlags[STARS_NN_jnl] = true; // Jump if Not Less (SF=OF) + SMPUsesFlags[STARS_NN_jnle] = true; // Jump if Not Less or Equal (ZF=0 & SF=OF) + SMPUsesFlags[STARS_NN_jno] = true; // Jump if Not Overflow (OF=0) + SMPUsesFlags[STARS_NN_jnp] = true; // Jump if Not Parity (PF=0) + SMPUsesFlags[STARS_NN_jns] = true; // Jump if Not Sign (SF=0) + SMPUsesFlags[STARS_NN_jnz] = true; // Jump if Not Zero (ZF=0) + SMPUsesFlags[STARS_NN_jo] = true; // Jump if Overflow (OF=1) + SMPUsesFlags[STARS_NN_jp] = true; // Jump if Parity (PF=1) + SMPUsesFlags[STARS_NN_jpe] = true; // Jump if Parity Even (PF=1) + SMPUsesFlags[STARS_NN_jpo] = true; // Jump if Parity Odd (PF=0) + SMPUsesFlags[STARS_NN_js] = true; // Jump if Sign (SF=1) + SMPUsesFlags[STARS_NN_jz] = true; // Jump if Zero (ZF=1) + SMPUsesFlags[STARS_NN_lahf] = true; // Load Flags into AH Register + SMPUsesFlags[STARS_NN_lods] = true; // Load String + SMPUsesFlags[STARS_NN_loopwe] = true; // Loop while CX != 0 and ZF=1 + SMPUsesFlags[STARS_NN_loope] = true; // Loop while rCX != 0 and ZF=1 + SMPUsesFlags[STARS_NN_loopde] = true; // Loop while ECX != 0 and ZF=1 + SMPUsesFlags[STARS_NN_loopqe] = true; // Loop while RCX != 0 and ZF=1 + SMPUsesFlags[STARS_NN_loopwne] = true; // Loop while CX != 0 and ZF=0 + SMPUsesFlags[STARS_NN_loopne] = true; // Loop while rCX != 0 and ZF=0 + SMPUsesFlags[STARS_NN_loopdne] = true; // Loop while ECX != 0 and ZF=0 + SMPUsesFlags[STARS_NN_loopqne] = true; // Loop while RCX != 0 and ZF=0 + SMPUsesFlags[STARS_NN_movs] = true; // Move String (uses flags if REP prefix) + SMPUsesFlags[STARS_NN_outs] = true; // Output Byte(s) to Port + SMPUsesFlags[STARS_NN_pushfw] = true; // Push Flags Register onto the Stack + SMPUsesFlags[STARS_NN_pushf] = true; // Push Flags Register onto the Stack + SMPUsesFlags[STARS_NN_pushfd] = true; // Push Flags Register onto the Stack (use32) + SMPUsesFlags[STARS_NN_pushfq] = true; // Push Flags Register onto the Stack (use64) + SMPUsesFlags[STARS_NN_rcl] = true; // Rotate Through Carry Left + SMPUsesFlags[STARS_NN_rcr] = true; // Rotate Through Carry Right + SMPUsesFlags[STARS_NN_repe] = true; // Repeat String Operation while ZF=1 + SMPUsesFlags[STARS_NN_repne] = true; // Repeat String Operation while ZF=0 + SMPUsesFlags[STARS_NN_sbb] = true; // Integer Subtraction with Borrow + SMPUsesFlags[STARS_NN_scas] = true; // Compare String (uses DF direction flag) + SMPUsesFlags[STARS_NN_seta] = true; // Set Byte if Above (CF=0 & ZF=0) + SMPUsesFlags[STARS_NN_setae] = true; // Set Byte if Above or Equal (CF=0) + SMPUsesFlags[STARS_NN_setb] = true; // Set Byte if Below (CF=1) + SMPUsesFlags[STARS_NN_setbe] = true; // Set Byte if Below or Equal (CF=1 | ZF=1) + SMPUsesFlags[STARS_NN_setc] = true; // Set Byte if Carry (CF=1) + SMPUsesFlags[STARS_NN_sete] = true; // Set Byte if Equal (ZF=1) + SMPUsesFlags[STARS_NN_setg] = true; // Set Byte if Greater (ZF=0 & SF=OF) + SMPUsesFlags[STARS_NN_setge] = true; // Set Byte if Greater or Equal (SF=OF) + SMPUsesFlags[STARS_NN_setl] = true; // Set Byte if Less (SF!=OF) + SMPUsesFlags[STARS_NN_setle] = true; // Set Byte if Less or Equal (ZF=1 | SF!=OF) + SMPUsesFlags[STARS_NN_setna] = true; // Set Byte if Not Above (CF=1 | ZF=1) + SMPUsesFlags[STARS_NN_setnae] = true; // Set Byte if Not Above or Equal (CF=1) + SMPUsesFlags[STARS_NN_setnb] = true; // Set Byte if Not Below (CF=0) + SMPUsesFlags[STARS_NN_setnbe] = true; // Set Byte if Not Below or Equal (CF=0 & ZF=0) + SMPUsesFlags[STARS_NN_setnc] = true; // Set Byte if Not Carry (CF=0) + SMPUsesFlags[STARS_NN_setne] = true; // Set Byte if Not Equal (ZF=0) + SMPUsesFlags[STARS_NN_setng] = true; // Set Byte if Not Greater (ZF=1 | SF!=OF) + SMPUsesFlags[STARS_NN_setnge] = true; // Set Byte if Not Greater or Equal (SF!=OF) + SMPUsesFlags[STARS_NN_setnl] = true; // Set Byte if Not Less (SF=OF) + SMPUsesFlags[STARS_NN_setnle] = true; // Set Byte if Not Less or Equal (ZF=0 & SF=OF) + SMPUsesFlags[STARS_NN_setno] = true; // Set Byte if Not Overflow (OF=0) + SMPUsesFlags[STARS_NN_setnp] = true; // Set Byte if Not Parity (PF=0) + SMPUsesFlags[STARS_NN_setns] = true; // Set Byte if Not Sign (SF=0) + SMPUsesFlags[STARS_NN_setnz] = true; // Set Byte if Not Zero (ZF=0) + SMPUsesFlags[STARS_NN_seto] = true; // Set Byte if Overflow (OF=1) + SMPUsesFlags[STARS_NN_setp] = true; // Set Byte if Parity (PF=1) + SMPUsesFlags[STARS_NN_setpe] = true; // Set Byte if Parity Even (PF=1) + SMPUsesFlags[STARS_NN_setpo] = true; // Set Byte if Parity Odd (PF=0) + SMPUsesFlags[STARS_NN_sets] = true; // Set Byte if Sign (SF=1) + SMPUsesFlags[STARS_NN_setz] = true; // Set Byte if Zero (ZF=1) + SMPUsesFlags[STARS_NN_stos] = true; // Store String + + // + // 486 instructions + // + + // + // Pentium instructions + // + +#if 0 + SMPUsesFlags[STARS_NN_cpuid] = true; // Get CPU ID + SMPUsesFlags[STARS_NN_cmpxchg8b] = true; // Compare and Exchange Eight Bytes +#endif + + // + // Pentium Pro instructions + // + + SMPUsesFlags[STARS_NN_cmova] = true; // Move if Above (CF=0 & ZF=0) + SMPUsesFlags[STARS_NN_cmovb] = true; // Move if Below (CF=1) + SMPUsesFlags[STARS_NN_cmovbe] = true; // Move if Below or Equal (CF=1 | ZF=1) + SMPUsesFlags[STARS_NN_cmovg] = true; // Move if Greater (ZF=0 & SF=OF) + SMPUsesFlags[STARS_NN_cmovge] = true; // Move if Greater or Equal (SF=OF) + SMPUsesFlags[STARS_NN_cmovl] = true; // Move if Less (SF!=OF) + SMPUsesFlags[STARS_NN_cmovle] = true; // Move if Less or Equal (ZF=1 | SF!=OF) + SMPUsesFlags[STARS_NN_cmovnb] = true; // Move if Not Below (CF=0) + SMPUsesFlags[STARS_NN_cmovno] = true; // Move if Not Overflow (OF=0) + SMPUsesFlags[STARS_NN_cmovnp] = true; // Move if Not Parity (PF=0) + SMPUsesFlags[STARS_NN_cmovns] = true; // Move if Not Sign (SF=0) + SMPUsesFlags[STARS_NN_cmovnz] = true; // Move if Not Zero (ZF=0) + SMPUsesFlags[STARS_NN_cmovo] = true; // Move if Overflow (OF=1) + SMPUsesFlags[STARS_NN_cmovp] = true; // Move if Parity (PF=1) + SMPUsesFlags[STARS_NN_cmovs] = true; // Move if Sign (SF=1) + SMPUsesFlags[STARS_NN_cmovz] = true; // Move if Zero (ZF=1) + SMPUsesFlags[STARS_NN_fcmovb] = true; // Floating Move if Below + SMPUsesFlags[STARS_NN_fcmove] = true; // Floating Move if Equal + SMPUsesFlags[STARS_NN_fcmovbe] = true; // Floating Move if Below or Equal + SMPUsesFlags[STARS_NN_fcmovu] = true; // Floating Move if Unordered + SMPUsesFlags[STARS_NN_fcmovnb] = true; // Floating Move if Not Below + SMPUsesFlags[STARS_NN_fcmovne] = true; // Floating Move if Not Equal + SMPUsesFlags[STARS_NN_fcmovnbe] = true; // Floating Move if Not Below or Equal + SMPUsesFlags[STARS_NN_fcmovnu] = true; // Floating Move if Not Unordered + + // + // FPP instructions + // + + + // + // 80387 instructions + // + + + // + // Instructions added 28.02.96 + // + + SMPUsesFlags[STARS_NN_setalc] = true; // Set AL to Carry Flag + + // + // MMX instructions + // + + + // + // Undocumented Deschutes processor instructions + // + + + // Pentium II instructions + + + // 3DNow! instructions + + + // Pentium III instructions + + + // Pentium III Pseudo instructions + + + // AMD K7 instructions + + // Revisit AMD if we port to it. + + // Undocumented FP instructions (thanks to norbert.juffa@adm.com) + + // Pentium 4 instructions + + + + // AMD syscall/sysret instructions NOTE: not AMD, found in Intel manual + + // AMD64 instructions NOTE: not AMD, found in Intel manual + + + // New Pentium instructions (SSE3) + + + // Missing AMD64 instructions NOTE: also found in Intel manual + + + // SSE3 instructions + + + // SSSE3 instructions + + + // VMX instructions + + // Added with x86-64 + + // Geode LX 3DNow! extensions + + // SSE2 pseudoinstructions + + // SSSE4.1 instructions + + // SSSE4.2 instructions + + // AMD SSE4a instructions + + // xsave/xrstor instructions + + // Intel Safer Mode Extensions (SMX) + + // AMD-V Virtualization ISA Extension + + // VMX+ instructions + + // Intel Atom instructions + + // Intel AES instructions + + // Carryless multiplication + + // Returns modified by operand size prefixes + + // RDRAND support + + // new GPR instructions + + SMPUsesFlags[STARS_NN_adcx] = true; // Unsigned Integer Addition of Two Operands with Carry Flag + SMPUsesFlags[STARS_NN_adox] = true; // Unsigned Integer Addition of Two Operands with Overflow Flag + + // new AVX instructions + + // Transactional Synchronization Extensions + + // Virtual PC synthetic instructions + + SMPUsesFlags[STARS_NN_last] = false; + + return; + +} // end of STARS_Program_t::InitSMPUsesFlags() + +// Initialize the SMPTypeCategory[] array to define how we infer +// numeric or pointer operand types for optimizing annotations. +void STARS_Program_t::InitTypeCategory(void) { + // Default category is 0, no type inference without knowing context. + (void)memset(SMPTypeCategory, 0, sizeof(SMPTypeCategory)); + // Category 1 instructions will need no mmStrata instrumentation + // and are irrelevant to our type system, so we do not attempt + // to make type inferences. Many of these operate on numeric + // operands such as floating point or MMX/SSE registers. mmStrata + // assumes that such registers are always numeric, so we do not + // need annotations informing mmStrata that FP/MMX/SSE regs are numeric. + // Category 2 instructions always have a result type of 'n' (number). + // Category 3 instructions have a result type of 'n' (number) + // whenever the second source operand is an operand of type 'n'. + // NOTE: MOV is the only current example, and this will take some thought if + // other examples arise. + // Category 4 instructions have a result type identical to the 1st source operand type. + // NOTE: This is currently set for single-operand instructions such as + // INC, DEC. As a result, these are treated pretty much as if + // they were category 1 instructions, as there is no metadata update, + // even if the operand is a memory operand. + // If new instructions are added to this category that are not single + // operand and do require some updating, the category should be split. + // Category 5 instructions have a result type identical to the 1st source operand + // type whenever the 2nd source operand is an operand of type 'n' & vice versa. + // Examples are add, sub, adc, and sbb. There are subtle exceptions + // handled in the SMPInstr::EmitTypeAnnotations() method. + // Category 6 instructions always have a result type of 'p' (pointer). + // Category 7 instructions are category 2 instructions with two destinations, + // such as multiply and divide instructions that affect EDX:EAX. There are + // forms of these instructions that only have one destination, so they have + // to be distinguished via the operand info. + // Category 8 instructions implicitly write a numeric value to EDX:EAX, but + // EDX and EAX are not listed as operands. RDTSC, RDPMC, RDMSR, and other + // instructions that copy machine registers into EDX:EAX are category 8. + // Some instructions in category 8 also write to ECX. + // Category 9 instructions are floating point instructions that either + // have a memory destination (treat as category 13) or a FP reg destination + // (treat as category 1, as FP regs are always 'n' and ignored in our system). + // Category 10 instructions have 'n' results if the sources are all 'n'; + // we cannot infer the type of the result if the sources are of mixed types. + // Bitwise OR and AND and LEA (load effective address) are examples. + // Category 11 instructions need to have their types and locations on the stack + // frame tracked, e.g. push and pop instructions. No direct type inference. + // Category 12 instructions are similar to category 10, except that we do not + // output 'n' annotations when all sources are 'n'; rather, the instruction can + // be simply ignored (not instrumented by mmStrata) in that case. Conditional + // exchange instructions are examples; we do or do not + // move a numeric value into a register that already has numeric metadata. + // Category 13 instructions imply that their memory destination is 'n'. + // Category 14 instructions imply that their reg or memory source operand is 'n'; + // if source is not memory, they are category 1 (inferences, but no instrumentation). + // There should never be a memory destination (usual destination is fpreg or flags). + // Category 15 instructions always have 'n' source AND destination operands; + // if addressed using indirect or indexed addressing, they are a subset of category 0 + // (must be instrumented by mmStrata to keep index in bounds). Memory destinations + // are common in this category. + + // NOTE: The Memory Monitor SDT needs just three categories, corresponding + // to categories 0, 1, and all others. For all categories > 1, the + // annotation should tell the SDT exactly how to update its metadata. + // For example, a division instruction will write type 'n' (NUM) as + // the metadata for result registers EDX:EAX. So, the annotation should + // list 'n', EDX, EAX, and a terminator of ZZ. CWD (convert word to + // doubleword) should have a list of n EAX ZZ. + + SMPTypeCategory[STARS_NN_null] = 0; // Unknown Operation + SMPTypeCategory[STARS_NN_aaa] = 2; // ASCII Adjust after Addition + SMPTypeCategory[STARS_NN_aad] = 2; // ASCII Adjust AX before Division + SMPTypeCategory[STARS_NN_aam] = 2; // ASCII Adjust AX after Multiply + SMPTypeCategory[STARS_NN_aas] = 2; // ASCII Adjust AL after Subtraction + SMPTypeCategory[STARS_NN_adc] = 5; // Add with Carry + SMPTypeCategory[STARS_NN_add] = 5; // Add + SMPTypeCategory[STARS_NN_and] = 10; // Logical AND + SMPTypeCategory[STARS_NN_arpl] = 1; // Adjust RPL Field of Selector + SMPTypeCategory[STARS_NN_bound] = 1; // Check Array Index Against Bounds + SMPTypeCategory[STARS_NN_bsf] = 2; // Bit Scan Forward + SMPTypeCategory[STARS_NN_bsr] = 2; // Bit Scan Reverse + SMPTypeCategory[STARS_NN_bt] = 10; // Bit Test + SMPTypeCategory[STARS_NN_btc] = 10; // Bit Test and Complement + SMPTypeCategory[STARS_NN_btr] = 10; // Bit Test and Reset + SMPTypeCategory[STARS_NN_bts] = 10; // Bit Test and Set + SMPTypeCategory[STARS_NN_call] = 1; // Call Procedure + SMPTypeCategory[STARS_NN_callfi] = 1; // Indirect Call Far Procedure + SMPTypeCategory[STARS_NN_callni] = 1; // Indirect Call Near Procedure + SMPTypeCategory[STARS_NN_cbw] = 2; // AL -> AX (with sign) ** No ops? + SMPTypeCategory[STARS_NN_cwde] = 2; // AX -> EAX (with sign) ** + SMPTypeCategory[STARS_NN_cdqe] = 2; // EAX -> RAX (with sign) ** + SMPTypeCategory[STARS_NN_clc] = 1; // Clear Carry Flag + SMPTypeCategory[STARS_NN_cld] = 1; // Clear Direction Flag + SMPTypeCategory[STARS_NN_cli] = 1; // Clear Interrupt Flag + SMPTypeCategory[STARS_NN_clts] = 1; // Clear Task-Switched Flag in CR0 + SMPTypeCategory[STARS_NN_cmc] = 1; // Complement Carry Flag + SMPTypeCategory[STARS_NN_cmp] = 1; // Compare Two Operands + SMPTypeCategory[STARS_NN_cmps] = 14; // Compare Strings + SMPTypeCategory[STARS_NN_cwd] = 2; // AX -> DX:AX (with sign) + SMPTypeCategory[STARS_NN_cdq] = 2; // EAX -> EDX:EAX (with sign) + SMPTypeCategory[STARS_NN_cqo] = 2; // RAX -> RDX:RAX (with sign) + SMPTypeCategory[STARS_NN_daa] = 2; // Decimal Adjust AL after Addition + SMPTypeCategory[STARS_NN_das] = 2; // Decimal Adjust AL after Subtraction + SMPTypeCategory[STARS_NN_dec] = 4; // Decrement by 1 + SMPTypeCategory[STARS_NN_div] = 7; // Unsigned Divide + SMPTypeCategory[STARS_NN_enterw] = 0; // Make Stack Frame for Procedure Parameters ** + SMPTypeCategory[STARS_NN_enter] = 0; // Make Stack Frame for Procedure Parameters ** + SMPTypeCategory[STARS_NN_enterd] = 0; // Make Stack Frame for Procedure Parameters ** + SMPTypeCategory[STARS_NN_enterq] = 0; // Make Stack Frame for Procedure Parameters ** + SMPTypeCategory[STARS_NN_hlt] = 0; // Halt + SMPTypeCategory[STARS_NN_idiv] = 7; // Signed Divide + SMPTypeCategory[STARS_NN_imul] = 7; // Signed Multiply + SMPTypeCategory[STARS_NN_in] = 0; // Input from Port ** + SMPTypeCategory[STARS_NN_inc] = 4; // Increment by 1 + SMPTypeCategory[STARS_NN_ins] = 2; // Input Byte(s) from Port to String ** + SMPTypeCategory[STARS_NN_int] = 0; // Call to Interrupt Procedure + SMPTypeCategory[STARS_NN_into] = 0; // Call to Interrupt Procedure if Overflow Flag = 1 + SMPTypeCategory[STARS_NN_int3] = 0; // Trap to Debugger + SMPTypeCategory[STARS_NN_iretw] = 0; // Interrupt Return + SMPTypeCategory[STARS_NN_iret] = 0; // Interrupt Return + SMPTypeCategory[STARS_NN_iretd] = 0; // Interrupt Return (use32) + SMPTypeCategory[STARS_NN_iretq] = 0; // Interrupt Return (use64) + SMPTypeCategory[STARS_NN_ja] = 1; // Jump if Above (CF=0 & ZF=0) + SMPTypeCategory[STARS_NN_jae] = 1; // Jump if Above or Equal (CF=0) + SMPTypeCategory[STARS_NN_jb] = 1; // Jump if Below (CF=1) + SMPTypeCategory[STARS_NN_jbe] = 1; // Jump if Below or Equal (CF=1 | ZF=1) + SMPTypeCategory[STARS_NN_jc] = 1; // Jump if Carry (CF=1) + SMPTypeCategory[STARS_NN_jcxz] = 1; // Jump if CX is 0 + SMPTypeCategory[STARS_NN_jecxz] = 1; // Jump if ECX is 0 + SMPTypeCategory[STARS_NN_jrcxz] = 1; // Jump if RCX is 0 + SMPTypeCategory[STARS_NN_je] = 1; // Jump if Equal (ZF=1) + SMPTypeCategory[STARS_NN_jg] = 1; // Jump if Greater (ZF=0 & SF=OF) + SMPTypeCategory[STARS_NN_jge] = 1; // Jump if Greater or Equal (SF=OF) + SMPTypeCategory[STARS_NN_jl] = 1; // Jump if Less (SF!=OF) + SMPTypeCategory[STARS_NN_jle] = 1; // Jump if Less or Equal (ZF=1 | SF!=OF) + SMPTypeCategory[STARS_NN_jna] = 1; // Jump if Not Above (CF=1 | ZF=1) + SMPTypeCategory[STARS_NN_jnae] = 1; // Jump if Not Above or Equal (CF=1) + SMPTypeCategory[STARS_NN_jnb] = 1; // Jump if Not Below (CF=0) + SMPTypeCategory[STARS_NN_jnbe] = 1; // Jump if Not Below or Equal (CF=0 & ZF=0) + SMPTypeCategory[STARS_NN_jnc] = 1; // Jump if Not Carry (CF=0) + SMPTypeCategory[STARS_NN_jne] = 1; // Jump if Not Equal (ZF=0) + SMPTypeCategory[STARS_NN_jng] = 1; // Jump if Not Greater (ZF=1 | SF!=OF) + SMPTypeCategory[STARS_NN_jnge] = 1; // Jump if Not Greater or Equal (SF!=OF) + SMPTypeCategory[STARS_NN_jnl] = 1; // Jump if Not Less (SF=OF) + SMPTypeCategory[STARS_NN_jnle] = 1; // Jump if Not Less or Equal (ZF=0 & SF=OF) + SMPTypeCategory[STARS_NN_jno] = 1; // Jump if Not Overflow (OF=0) + SMPTypeCategory[STARS_NN_jnp] = 1; // Jump if Not Parity (PF=0) + SMPTypeCategory[STARS_NN_jns] = 1; // Jump if Not Sign (SF=0) + SMPTypeCategory[STARS_NN_jnz] = 1; // Jump if Not Zero (ZF=0) + SMPTypeCategory[STARS_NN_jo] = 1; // Jump if Overflow (OF=1) + SMPTypeCategory[STARS_NN_jp] = 1; // Jump if Parity (PF=1) + SMPTypeCategory[STARS_NN_jpe] = 1; // Jump if Parity Even (PF=1) + SMPTypeCategory[STARS_NN_jpo] = 1; // Jump if Parity Odd (PF=0) + SMPTypeCategory[STARS_NN_js] = 1; // Jump if Sign (SF=1) + SMPTypeCategory[STARS_NN_jz] = 1; // Jump if Zero (ZF=1) + SMPTypeCategory[STARS_NN_jmp] = 1; // Jump + SMPTypeCategory[STARS_NN_jmpfi] = 1; // Indirect Far Jump + SMPTypeCategory[STARS_NN_jmpni] = 1; // Indirect Near Jump + SMPTypeCategory[STARS_NN_jmpshort] = 1; // Jump Short (not used) + SMPTypeCategory[STARS_NN_lahf] = 2; // Load Flags into AH Register + SMPTypeCategory[STARS_NN_lar] = 2; // Load Access Rights Byte + SMPTypeCategory[STARS_NN_lea] = 10; // Load Effective Address ** + SMPTypeCategory[STARS_NN_leavew] = 0; // High Level Procedure Exit ** + SMPTypeCategory[STARS_NN_leave] = 0; // High Level Procedure Exit ** + SMPTypeCategory[STARS_NN_leaved] = 0; // High Level Procedure Exit ** + SMPTypeCategory[STARS_NN_leaveq] = 0; // High Level Procedure Exit ** + SMPTypeCategory[STARS_NN_lgdt] = 0; // Load Global Descriptor Table Register + SMPTypeCategory[STARS_NN_lidt] = 0; // Load Interrupt Descriptor Table Register + SMPTypeCategory[STARS_NN_lgs] = 6; // Load Full Pointer to GS:xx + SMPTypeCategory[STARS_NN_lss] = 6; // Load Full Pointer to SS:xx + SMPTypeCategory[STARS_NN_lds] = 6; // Load Full Pointer to DS:xx + SMPTypeCategory[STARS_NN_les] = 6; // Load Full Pointer to ES:xx + SMPTypeCategory[STARS_NN_lfs] = 6; // Load Full Pointer to FS:xx + SMPTypeCategory[STARS_NN_lldt] = 0; // Load Local Descriptor Table Register + SMPTypeCategory[STARS_NN_lmsw] = 1; // Load Machine Status Word + SMPTypeCategory[STARS_NN_lock] = 1; // Assert LOCK# Signal Prefix + SMPTypeCategory[STARS_NN_lods] = 0; // Load String + SMPTypeCategory[STARS_NN_loopw] = 1; // Loop while ECX != 0 + SMPTypeCategory[STARS_NN_loop] = 1; // Loop while CX != 0 + SMPTypeCategory[STARS_NN_loopd] = 1; // Loop while ECX != 0 + SMPTypeCategory[STARS_NN_loopq] = 1; // Loop while RCX != 0 + SMPTypeCategory[STARS_NN_loopwe] = 1; // Loop while CX != 0 and ZF=1 + SMPTypeCategory[STARS_NN_loope] = 1; // Loop while rCX != 0 and ZF=1 + SMPTypeCategory[STARS_NN_loopde] = 1; // Loop while ECX != 0 and ZF=1 + SMPTypeCategory[STARS_NN_loopqe] = 1; // Loop while RCX != 0 and ZF=1 + SMPTypeCategory[STARS_NN_loopwne] = 1; // Loop while CX != 0 and ZF=0 + SMPTypeCategory[STARS_NN_loopne] = 1; // Loop while rCX != 0 and ZF=0 + SMPTypeCategory[STARS_NN_loopdne] = 1; // Loop while ECX != 0 and ZF=0 + SMPTypeCategory[STARS_NN_loopqne] = 1; // Loop while RCX != 0 and ZF=0 + SMPTypeCategory[STARS_NN_lsl] = 6; // Load Segment Limit + SMPTypeCategory[STARS_NN_ltr] = 1; // Load Task Register + SMPTypeCategory[STARS_NN_mov] = 3; // Move Data + SMPTypeCategory[STARS_NN_movsp] = 3; // Move to/from Special Registers + SMPTypeCategory[STARS_NN_movs] = 0; // Move Byte(s) from String to String + SMPTypeCategory[STARS_NN_movsx] = 3; // Move with Sign-Extend + SMPTypeCategory[STARS_NN_movzx] = 3; // Move with Zero-Extend + SMPTypeCategory[STARS_NN_mul] = 7; // Unsigned Multiplication of AL or AX + SMPTypeCategory[STARS_NN_neg] = 2; // Two's Complement Negation !!!!****!!!! Change this when mmStrata handles NEGATEDPTR type. + SMPTypeCategory[STARS_NN_nop] = 1; // No Operation + SMPTypeCategory[STARS_NN_not] = 2; // One's Complement Negation + SMPTypeCategory[STARS_NN_or] = 10; // Logical Inclusive OR + SMPTypeCategory[STARS_NN_out] = 0; // Output to Port + SMPTypeCategory[STARS_NN_outs] = 0; // Output Byte(s) to Port + SMPTypeCategory[STARS_NN_pop] = 11; // Pop a word from the Stack + SMPTypeCategory[STARS_NN_popaw] = 11; // Pop all General Registers + SMPTypeCategory[STARS_NN_popa] = 11; // Pop all General Registers + SMPTypeCategory[STARS_NN_popad] = 11; // Pop all General Registers (use32) + SMPTypeCategory[STARS_NN_popaq] = 11; // Pop all General Registers (use64) + SMPTypeCategory[STARS_NN_popfw] = 11; // Pop Stack into Flags Register ** + SMPTypeCategory[STARS_NN_popf] = 11; // Pop Stack into Flags Register ** + SMPTypeCategory[STARS_NN_popfd] = 11; // Pop Stack into Eflags Register ** + SMPTypeCategory[STARS_NN_popfq] = 11; // Pop Stack into Rflags Register ** + SMPTypeCategory[STARS_NN_push] = 11; // Push Operand onto the Stack + SMPTypeCategory[STARS_NN_pushaw] = 11; // Push all General Registers + SMPTypeCategory[STARS_NN_pusha] = 11; // Push all General Registers + SMPTypeCategory[STARS_NN_pushad] = 11; // Push all General Registers (use32) + SMPTypeCategory[STARS_NN_pushaq] = 11; // Push all General Registers (use64) + SMPTypeCategory[STARS_NN_pushfw] = 11; // Push Flags Register onto the Stack + SMPTypeCategory[STARS_NN_pushf] = 11; // Push Flags Register onto the Stack + SMPTypeCategory[STARS_NN_pushfd] = 11; // Push Flags Register onto the Stack (use32) + SMPTypeCategory[STARS_NN_pushfq] = 11; // Push Flags Register onto the Stack (use64) + SMPTypeCategory[STARS_NN_rcl] = 2; // Rotate Through Carry Left + SMPTypeCategory[STARS_NN_rcr] = 2; // Rotate Through Carry Right + SMPTypeCategory[STARS_NN_rol] = 2; // Rotate Left + SMPTypeCategory[STARS_NN_ror] = 2; // Rotate Right + SMPTypeCategory[STARS_NN_rep] = 0; // Repeat String Operation + SMPTypeCategory[STARS_NN_repe] = 0; // Repeat String Operation while ZF=1 + SMPTypeCategory[STARS_NN_repne] = 0; // Repeat String Operation while ZF=0 + SMPTypeCategory[STARS_NN_retn] = 0; // Return Near from Procedure + SMPTypeCategory[STARS_NN_retf] = 0; // Return Far from Procedure + SMPTypeCategory[STARS_NN_sahf] = 14; // Store AH into Flags Register + SMPTypeCategory[STARS_NN_sal] = 2; // Shift Arithmetic Left + SMPTypeCategory[STARS_NN_sar] = 2; // Shift Arithmetic Right + SMPTypeCategory[STARS_NN_shl] = 2; // Shift Logical Left + SMPTypeCategory[STARS_NN_shr] = 2; // Shift Logical Right + SMPTypeCategory[STARS_NN_sbb] = 5; // Integer Subtraction with Borrow + SMPTypeCategory[STARS_NN_scas] = 14; // Compare String + SMPTypeCategory[STARS_NN_seta] = 2; // Set Byte if Above (CF=0 & ZF=0) + SMPTypeCategory[STARS_NN_setae] = 2; // Set Byte if Above or Equal (CF=0) + SMPTypeCategory[STARS_NN_setb] = 2; // Set Byte if Below (CF=1) + SMPTypeCategory[STARS_NN_setbe] = 2; // Set Byte if Below or Equal (CF=1 | ZF=1) + SMPTypeCategory[STARS_NN_setc] = 2; // Set Byte if Carry (CF=1) + SMPTypeCategory[STARS_NN_sete] = 2; // Set Byte if Equal (ZF=1) + SMPTypeCategory[STARS_NN_setg] = 2; // Set Byte if Greater (ZF=0 & SF=OF) + SMPTypeCategory[STARS_NN_setge] = 2; // Set Byte if Greater or Equal (SF=OF) + SMPTypeCategory[STARS_NN_setl] = 2; // Set Byte if Less (SF!=OF) + SMPTypeCategory[STARS_NN_setle] = 2; // Set Byte if Less or Equal (ZF=1 | SF!=OF) + SMPTypeCategory[STARS_NN_setna] = 2; // Set Byte if Not Above (CF=1 | ZF=1) + SMPTypeCategory[STARS_NN_setnae] = 2; // Set Byte if Not Above or Equal (CF=1) + SMPTypeCategory[STARS_NN_setnb] = 2; // Set Byte if Not Below (CF=0) + SMPTypeCategory[STARS_NN_setnbe] = 2; // Set Byte if Not Below or Equal (CF=0 & ZF=0) + SMPTypeCategory[STARS_NN_setnc] = 2; // Set Byte if Not Carry (CF=0) + SMPTypeCategory[STARS_NN_setne] = 2; // Set Byte if Not Equal (ZF=0) + SMPTypeCategory[STARS_NN_setng] = 2; // Set Byte if Not Greater (ZF=1 | SF!=OF) + SMPTypeCategory[STARS_NN_setnge] = 2; // Set Byte if Not Greater or Equal (SF!=OF) + SMPTypeCategory[STARS_NN_setnl] = 2; // Set Byte if Not Less (SF=OF) + SMPTypeCategory[STARS_NN_setnle] = 2; // Set Byte if Not Less or Equal (ZF=0 & SF=OF) + SMPTypeCategory[STARS_NN_setno] = 2; // Set Byte if Not Overflow (OF=0) + SMPTypeCategory[STARS_NN_setnp] = 2; // Set Byte if Not Parity (PF=0) + SMPTypeCategory[STARS_NN_setns] = 2; // Set Byte if Not Sign (SF=0) + SMPTypeCategory[STARS_NN_setnz] = 2; // Set Byte if Not Zero (ZF=0) + SMPTypeCategory[STARS_NN_seto] = 2; // Set Byte if Overflow (OF=1) + SMPTypeCategory[STARS_NN_setp] = 2; // Set Byte if Parity (PF=1) + SMPTypeCategory[STARS_NN_setpe] = 2; // Set Byte if Parity Even (PF=1) + SMPTypeCategory[STARS_NN_setpo] = 2; // Set Byte if Parity Odd (PF=0) + SMPTypeCategory[STARS_NN_sets] = 2; // Set Byte if Sign (SF=1) + SMPTypeCategory[STARS_NN_setz] = 2; // Set Byte if Zero (ZF=1) + SMPTypeCategory[STARS_NN_sgdt] = 0; // Store Global Descriptor Table Register + SMPTypeCategory[STARS_NN_sidt] = 0; // Store Interrupt Descriptor Table Register + SMPTypeCategory[STARS_NN_shld] = 2; // Double Precision Shift Left + SMPTypeCategory[STARS_NN_shrd] = 2; // Double Precision Shift Right + SMPTypeCategory[STARS_NN_sldt] = 6; // Store Local Descriptor Table Register + SMPTypeCategory[STARS_NN_smsw] = 2; // Store Machine Status Word + SMPTypeCategory[STARS_NN_stc] = 1; // Set Carry Flag + SMPTypeCategory[STARS_NN_std] = 1; // Set Direction Flag + SMPTypeCategory[STARS_NN_sti] = 1; // Set Interrupt Flag + SMPTypeCategory[STARS_NN_stos] = 0; // Store String + SMPTypeCategory[STARS_NN_str] = 6; // Store Task Register + SMPTypeCategory[STARS_NN_sub] = 5; // Integer Subtraction + SMPTypeCategory[STARS_NN_test] = 1; // Logical Compare + SMPTypeCategory[STARS_NN_verr] = 1; // Verify a Segment for Reading + SMPTypeCategory[STARS_NN_verw] = 1; // Verify a Segment for Writing + SMPTypeCategory[STARS_NN_wait] = 1; // Wait until BUSY# Pin is Inactive (HIGH) + SMPTypeCategory[STARS_NN_xchg] = 12; // Exchange Register/Memory with Register + SMPTypeCategory[STARS_NN_xlat] = 0; // Table Lookup Translation + SMPTypeCategory[STARS_NN_xor] = 2; // Logical Exclusive OR + + // + // 486 instructions + // + + SMPTypeCategory[STARS_NN_cmpxchg] = 12; // Compare and Exchange + SMPTypeCategory[STARS_NN_bswap] = 1; // Swap bytes in register + SMPTypeCategory[STARS_NN_xadd] = 12; // t<-dest; dest<-src+dest; src<-t + SMPTypeCategory[STARS_NN_invd] = 1; // Invalidate Data Cache + SMPTypeCategory[STARS_NN_wbinvd] = 1; // Invalidate Data Cache (write changes) + SMPTypeCategory[STARS_NN_invlpg] = 1; // Invalidate TLB entry + + // + // Pentium instructions + // + + SMPTypeCategory[STARS_NN_rdmsr] = 8; // Read Machine Status Register + SMPTypeCategory[STARS_NN_wrmsr] = 1; // Write Machine Status Register + SMPTypeCategory[STARS_NN_cpuid] = 8; // Get CPU ID + SMPTypeCategory[STARS_NN_cmpxchg8b] = 12; // Compare and Exchange Eight Bytes + SMPTypeCategory[STARS_NN_rdtsc] = 8; // Read Time Stamp Counter + SMPTypeCategory[STARS_NN_rsm] = 1; // Resume from System Management Mode + + // + // Pentium Pro instructions + // + + SMPTypeCategory[STARS_NN_cmova] = 0; // Move if Above (CF=0 & ZF=0) + SMPTypeCategory[STARS_NN_cmovb] = 0; // Move if Below (CF=1) + SMPTypeCategory[STARS_NN_cmovbe] = 0; // Move if Below or Equal (CF=1 | ZF=1) + SMPTypeCategory[STARS_NN_cmovg] = 0; // Move if Greater (ZF=0 & SF=OF) + SMPTypeCategory[STARS_NN_cmovge] = 0; // Move if Greater or Equal (SF=OF) + SMPTypeCategory[STARS_NN_cmovl] = 0; // Move if Less (SF!=OF) + SMPTypeCategory[STARS_NN_cmovle] = 0; // Move if Less or Equal (ZF=1 | SF!=OF) + SMPTypeCategory[STARS_NN_cmovnb] = 0; // Move if Not Below (CF=0) + SMPTypeCategory[STARS_NN_cmovno] = 0; // Move if Not Overflow (OF=0) + SMPTypeCategory[STARS_NN_cmovnp] = 0; // Move if Not Parity (PF=0) + SMPTypeCategory[STARS_NN_cmovns] = 0; // Move if Not Sign (SF=0) + SMPTypeCategory[STARS_NN_cmovnz] = 0; // Move if Not Zero (ZF=0) + SMPTypeCategory[STARS_NN_cmovo] = 0; // Move if Overflow (OF=1) + SMPTypeCategory[STARS_NN_cmovp] = 0; // Move if Parity (PF=1) + SMPTypeCategory[STARS_NN_cmovs] = 0; // Move if Sign (SF=1) + SMPTypeCategory[STARS_NN_cmovz] = 0; // Move if Zero (ZF=1) + SMPTypeCategory[STARS_NN_fcmovb] = 1; // Floating Move if Below + SMPTypeCategory[STARS_NN_fcmove] = 1; // Floating Move if Equal + SMPTypeCategory[STARS_NN_fcmovbe] = 1; // Floating Move if Below or Equal + SMPTypeCategory[STARS_NN_fcmovu] = 1; // Floating Move if Unordered + SMPTypeCategory[STARS_NN_fcmovnb] = 1; // Floating Move if Not Below + SMPTypeCategory[STARS_NN_fcmovne] = 1; // Floating Move if Not Equal + SMPTypeCategory[STARS_NN_fcmovnbe] = 1; // Floating Move if Not Below or Equal + SMPTypeCategory[STARS_NN_fcmovnu] = 1; // Floating Move if Not Unordered + SMPTypeCategory[STARS_NN_fcomi] = 1; // FP Compare, result in EFLAGS + SMPTypeCategory[STARS_NN_fucomi] = 1; // FP Unordered Compare, result in EFLAGS + SMPTypeCategory[STARS_NN_fcomip] = 1; // FP Compare, result in EFLAGS, pop stack + SMPTypeCategory[STARS_NN_fucomip] = 1; // FP Unordered Compare, result in EFLAGS, pop stack + SMPTypeCategory[STARS_NN_rdpmc] = 8; // Read Performance Monitor Counter + + // + // FPP instructions + // + + SMPTypeCategory[STARS_NN_fld] = 14; // Load Real ** Infer src is 'n' + SMPTypeCategory[STARS_NN_fst] = 9; // Store Real + SMPTypeCategory[STARS_NN_fstp] = 9; // Store Real and Pop + SMPTypeCategory[STARS_NN_fxch] = 1; // Exchange Registers + SMPTypeCategory[STARS_NN_fild] = 14; // Load Integer ** Infer src is 'n' + SMPTypeCategory[STARS_NN_fist] = 13; // Store Integer + SMPTypeCategory[STARS_NN_fistp] = 13; // Store Integer and Pop + SMPTypeCategory[STARS_NN_fbld] = 1; // Load BCD + SMPTypeCategory[STARS_NN_fbstp] = 13; // Store BCD and Pop + SMPTypeCategory[STARS_NN_fadd] = 14; // Add Real + SMPTypeCategory[STARS_NN_faddp] = 14; // Add Real and Pop + SMPTypeCategory[STARS_NN_fiadd] = 14; // Add Integer + SMPTypeCategory[STARS_NN_fsub] = 14; // Subtract Real + SMPTypeCategory[STARS_NN_fsubp] = 14; // Subtract Real and Pop + SMPTypeCategory[STARS_NN_fisub] = 14; // Subtract Integer + SMPTypeCategory[STARS_NN_fsubr] = 14; // Subtract Real Reversed + SMPTypeCategory[STARS_NN_fsubrp] = 14; // Subtract Real Reversed and Pop + SMPTypeCategory[STARS_NN_fisubr] = 14; // Subtract Integer Reversed + SMPTypeCategory[STARS_NN_fmul] = 14; // Multiply Real + SMPTypeCategory[STARS_NN_fmulp] = 14; // Multiply Real and Pop + SMPTypeCategory[STARS_NN_fimul] = 14; // Multiply Integer + SMPTypeCategory[STARS_NN_fdiv] = 14; // Divide Real + SMPTypeCategory[STARS_NN_fdivp] = 14; // Divide Real and Pop + SMPTypeCategory[STARS_NN_fidiv] = 14; // Divide Integer + SMPTypeCategory[STARS_NN_fdivr] = 14; // Divide Real Reversed + SMPTypeCategory[STARS_NN_fdivrp] = 14; // Divide Real Reversed and Pop + SMPTypeCategory[STARS_NN_fidivr] = 14; // Divide Integer Reversed + SMPTypeCategory[STARS_NN_fsqrt] = 1; // Square Root + SMPTypeCategory[STARS_NN_fscale] = 1; // Scale: st(0) <- st(0) * 2^st(1) + SMPTypeCategory[STARS_NN_fprem] = 1; // Partial Remainder + SMPTypeCategory[STARS_NN_frndint] = 1; // Round to Integer + SMPTypeCategory[STARS_NN_fxtract] = 1; // Extract exponent and significand + SMPTypeCategory[STARS_NN_fabs] = 1; // Absolute value + SMPTypeCategory[STARS_NN_fchs] = 1; // Change Sign + SMPTypeCategory[STARS_NN_fcom] = 1; // Compare Real + SMPTypeCategory[STARS_NN_fcomp] = 1; // Compare Real and Pop + SMPTypeCategory[STARS_NN_fcompp] = 1; // Compare Real and Pop Twice + SMPTypeCategory[STARS_NN_ficom] = 1; // Compare Integer + SMPTypeCategory[STARS_NN_ficomp] = 1; // Compare Integer and Pop + SMPTypeCategory[STARS_NN_ftst] = 1; // Test + SMPTypeCategory[STARS_NN_fxam] = 1; // Examine + SMPTypeCategory[STARS_NN_fptan] = 1; // Partial tangent + SMPTypeCategory[STARS_NN_fpatan] = 1; // Partial arctangent + SMPTypeCategory[STARS_NN_f2xm1] = 1; // 2^x - 1 + SMPTypeCategory[STARS_NN_fyl2x] = 1; // Y * lg2(X) + SMPTypeCategory[STARS_NN_fyl2xp1] = 1; // Y * lg2(X+1) + SMPTypeCategory[STARS_NN_fldz] = 1; // Load +0.0 + SMPTypeCategory[STARS_NN_fld1] = 1; // Load +1.0 + SMPTypeCategory[STARS_NN_fldpi] = 1; // Load PI=3.14... + SMPTypeCategory[STARS_NN_fldl2t] = 1; // Load lg2(10) + SMPTypeCategory[STARS_NN_fldl2e] = 1; // Load lg2(e) + SMPTypeCategory[STARS_NN_fldlg2] = 1; // Load lg10(2) + SMPTypeCategory[STARS_NN_fldln2] = 1; // Load ln(2) + SMPTypeCategory[STARS_NN_finit] = 1; // Initialize Processor + SMPTypeCategory[STARS_NN_fninit] = 1; // Initialize Processor (no wait) + SMPTypeCategory[STARS_NN_fsetpm] = 1; // Set Protected Mode + SMPTypeCategory[STARS_NN_fldcw] = 14; // Load Control Word + SMPTypeCategory[STARS_NN_fstcw] = 13; // Store Control Word + SMPTypeCategory[STARS_NN_fnstcw] = 13; // Store Control Word (no wait) + SMPTypeCategory[STARS_NN_fstsw] = 2; // Store Status Word to memory or AX + SMPTypeCategory[STARS_NN_fnstsw] = 2; // Store Status Word (no wait) to memory or AX + SMPTypeCategory[STARS_NN_fclex] = 1; // Clear Exceptions + SMPTypeCategory[STARS_NN_fnclex] = 1; // Clear Exceptions (no wait) + SMPTypeCategory[STARS_NN_fstenv] = 13; // Store Environment + SMPTypeCategory[STARS_NN_fnstenv] = 13; // Store Environment (no wait) + SMPTypeCategory[STARS_NN_fldenv] = 14; // Load Environment + SMPTypeCategory[STARS_NN_fsave] = 13; // Save State + SMPTypeCategory[STARS_NN_fnsave] = 13; // Save State (no wait) + SMPTypeCategory[STARS_NN_frstor] = 14; // Restore State ** infer src is 'n' + SMPTypeCategory[STARS_NN_fincstp] = 1; // Increment Stack Pointer + SMPTypeCategory[STARS_NN_fdecstp] = 1; // Decrement Stack Pointer + SMPTypeCategory[STARS_NN_ffree] = 1; // Free Register + SMPTypeCategory[STARS_NN_fnop] = 1; // No Operation + SMPTypeCategory[STARS_NN_feni] = 1; // (8087 only) + SMPTypeCategory[STARS_NN_fneni] = 1; // (no wait) (8087 only) + SMPTypeCategory[STARS_NN_fdisi] = 1; // (8087 only) + SMPTypeCategory[STARS_NN_fndisi] = 1; // (no wait) (8087 only) + + // + // 80387 instructions + // + + SMPTypeCategory[STARS_NN_fprem1] = 1; // Partial Remainder ( < half ) + SMPTypeCategory[STARS_NN_fsincos] = 1; // t<-cos(st); st<-sin(st); push t + SMPTypeCategory[STARS_NN_fsin] = 1; // Sine + SMPTypeCategory[STARS_NN_fcos] = 1; // Cosine + SMPTypeCategory[STARS_NN_fucom] = 1; // Compare Unordered Real + SMPTypeCategory[STARS_NN_fucomp] = 1; // Compare Unordered Real and Pop + SMPTypeCategory[STARS_NN_fucompp] = 1; // Compare Unordered Real and Pop Twice + + // + // Instructions added 28.02.96 + // + + SMPTypeCategory[STARS_NN_setalc] = 2; // Set AL to Carry Flag ** + SMPTypeCategory[STARS_NN_svdc] = 0; // Save Register and Descriptor + SMPTypeCategory[STARS_NN_rsdc] = 0; // Restore Register and Descriptor + SMPTypeCategory[STARS_NN_svldt] = 0; // Save LDTR and Descriptor + SMPTypeCategory[STARS_NN_rsldt] = 0; // Restore LDTR and Descriptor + SMPTypeCategory[STARS_NN_svts] = 1; // Save TR and Descriptor + SMPTypeCategory[STARS_NN_rsts] = 1; // Restore TR and Descriptor + SMPTypeCategory[STARS_NN_icebp] = 1; // ICE Break Point + SMPTypeCategory[STARS_NN_loadall] = 0; // Load the entire CPU state from ES:EDI ??? + + // + // MMX instructions + // + + SMPTypeCategory[STARS_NN_emms] = 1; // Empty MMX state + SMPTypeCategory[STARS_NN_movd] = 15; // Move 32 bits + SMPTypeCategory[STARS_NN_movq] = 15; // Move 64 bits + SMPTypeCategory[STARS_NN_packsswb] = 14; // Pack with Signed Saturation (Word->Byte) + SMPTypeCategory[STARS_NN_packssdw] = 14; // Pack with Signed Saturation (Dword->Word) + SMPTypeCategory[STARS_NN_packuswb] = 14; // Pack with Unsigned Saturation (Word->Byte) + SMPTypeCategory[STARS_NN_paddb] = 14; // Packed Add Byte + SMPTypeCategory[STARS_NN_paddw] = 14; // Packed Add Word + SMPTypeCategory[STARS_NN_paddd] = 14; // Packed Add Dword + SMPTypeCategory[STARS_NN_paddsb] = 14; // Packed Add with Saturation (Byte) + SMPTypeCategory[STARS_NN_paddsw] = 14; // Packed Add with Saturation (Word) + SMPTypeCategory[STARS_NN_paddusb] = 14; // Packed Add Unsigned with Saturation (Byte) + SMPTypeCategory[STARS_NN_paddusw] = 14; // Packed Add Unsigned with Saturation (Word) + SMPTypeCategory[STARS_NN_pand] = 14; // Bitwise Logical And + SMPTypeCategory[STARS_NN_pandn] = 14; // Bitwise Logical And Not + SMPTypeCategory[STARS_NN_pcmpeqb] = 14; // Packed Compare for Equal (Byte) + SMPTypeCategory[STARS_NN_pcmpeqw] = 14; // Packed Compare for Equal (Word) + SMPTypeCategory[STARS_NN_pcmpeqd] = 14; // Packed Compare for Equal (Dword) + SMPTypeCategory[STARS_NN_pcmpgtb] = 14; // Packed Compare for Greater Than (Byte) + SMPTypeCategory[STARS_NN_pcmpgtw] = 14; // Packed Compare for Greater Than (Word) + SMPTypeCategory[STARS_NN_pcmpgtd] = 14; // Packed Compare for Greater Than (Dword) + SMPTypeCategory[STARS_NN_pmaddwd] = 14; // Packed Multiply and Add + SMPTypeCategory[STARS_NN_pmulhw] = 14; // Packed Multiply High + SMPTypeCategory[STARS_NN_pmullw] = 14; // Packed Multiply Low + SMPTypeCategory[STARS_NN_por] = 14; // Bitwise Logical Or + SMPTypeCategory[STARS_NN_psllw] = 14; // Packed Shift Left Logical (Word) + SMPTypeCategory[STARS_NN_pslld] = 14; // Packed Shift Left Logical (Dword) + SMPTypeCategory[STARS_NN_psllq] = 14; // Packed Shift Left Logical (Qword) + SMPTypeCategory[STARS_NN_psraw] = 14; // Packed Shift Right Arithmetic (Word) + SMPTypeCategory[STARS_NN_psrad] = 14; // Packed Shift Right Arithmetic (Dword) + SMPTypeCategory[STARS_NN_psrlw] = 14; // Packed Shift Right Logical (Word) + SMPTypeCategory[STARS_NN_psrld] = 14; // Packed Shift Right Logical (Dword) + SMPTypeCategory[STARS_NN_psrlq] = 14; // Packed Shift Right Logical (Qword) + SMPTypeCategory[STARS_NN_psubb] = 14; // Packed Subtract Byte + SMPTypeCategory[STARS_NN_psubw] = 14; // Packed Subtract Word + SMPTypeCategory[STARS_NN_psubd] = 14; // Packed Subtract Dword + SMPTypeCategory[STARS_NN_psubsb] = 14; // Packed Subtract with Saturation (Byte) + SMPTypeCategory[STARS_NN_psubsw] = 14; // Packed Subtract with Saturation (Word) + SMPTypeCategory[STARS_NN_psubusb] = 14; // Packed Subtract Unsigned with Saturation (Byte) + SMPTypeCategory[STARS_NN_psubusw] = 14; // Packed Subtract Unsigned with Saturation (Word) + SMPTypeCategory[STARS_NN_punpckhbw] = 14; // Unpack High Packed Data (Byte->Word) + SMPTypeCategory[STARS_NN_punpckhwd] = 14; // Unpack High Packed Data (Word->Dword) + SMPTypeCategory[STARS_NN_punpckhdq] = 14; // Unpack High Packed Data (Dword->Qword) + SMPTypeCategory[STARS_NN_punpcklbw] = 14; // Unpack Low Packed Data (Byte->Word) + SMPTypeCategory[STARS_NN_punpcklwd] = 14; // Unpack Low Packed Data (Word->Dword) + SMPTypeCategory[STARS_NN_punpckldq] = 14; // Unpack Low Packed Data (Dword->Qword) + SMPTypeCategory[STARS_NN_pxor] = 14; // Bitwise Logical Exclusive Or + + // + // Undocumented Deschutes processor instructions + // + + SMPTypeCategory[STARS_NN_fxsave] = 1; // Fast save FP context ** to where? + SMPTypeCategory[STARS_NN_fxrstor] = 1; // Fast restore FP context ** from where? + + // Pentium II instructions + + SMPTypeCategory[STARS_NN_sysenter] = 1; // Fast Transition to System Call Entry Point + SMPTypeCategory[STARS_NN_sysexit] = 1; // Fast Transition from System Call Entry Point + + // 3DNow! instructions + + SMPTypeCategory[STARS_NN_pavgusb] = 14; // Packed 8-bit Unsigned Integer Averaging + SMPTypeCategory[STARS_NN_pfadd] = 14; // Packed Floating-Point Addition + SMPTypeCategory[STARS_NN_pfsub] = 14; // Packed Floating-Point Subtraction + SMPTypeCategory[STARS_NN_pfsubr] = 14; // Packed Floating-Point Reverse Subtraction + SMPTypeCategory[STARS_NN_pfacc] = 14; // Packed Floating-Point Accumulate + SMPTypeCategory[STARS_NN_pfcmpge] = 14; // Packed Floating-Point Comparison, Greater or Equal + SMPTypeCategory[STARS_NN_pfcmpgt] = 14; // Packed Floating-Point Comparison, Greater + SMPTypeCategory[STARS_NN_pfcmpeq] = 14; // Packed Floating-Point Comparison, Equal + SMPTypeCategory[STARS_NN_pfmin] = 14; // Packed Floating-Point Minimum + SMPTypeCategory[STARS_NN_pfmax] = 14; // Packed Floating-Point Maximum + SMPTypeCategory[STARS_NN_pi2fd] = 14; // Packed 32-bit Integer to Floating-Point + SMPTypeCategory[STARS_NN_pf2id] = 14; // Packed Floating-Point to 32-bit Integer + SMPTypeCategory[STARS_NN_pfrcp] = 14; // Packed Floating-Point Reciprocal Approximation + SMPTypeCategory[STARS_NN_pfrsqrt] = 14; // Packed Floating-Point Reciprocal Square Root Approximation + SMPTypeCategory[STARS_NN_pfmul] = 14; // Packed Floating-Point Multiplication + SMPTypeCategory[STARS_NN_pfrcpit1] = 14; // Packed Floating-Point Reciprocal First Iteration Step + SMPTypeCategory[STARS_NN_pfrsqit1] = 14; // Packed Floating-Point Reciprocal Square Root First Iteration Step + SMPTypeCategory[STARS_NN_pfrcpit2] = 14; // Packed Floating-Point Reciprocal Second Iteration Step + SMPTypeCategory[STARS_NN_pmulhrw] = 14; // Packed Floating-Point 16-bit Integer Multiply with rounding + SMPTypeCategory[STARS_NN_femms] = 1; // Faster entry/exit of the MMX or floating-point state + SMPTypeCategory[STARS_NN_prefetch] = 1; // Prefetch at least a 32-byte line into L1 data cache + SMPTypeCategory[STARS_NN_prefetchw] = 1; // Prefetch processor cache line into L1 data cache (mark as modified) + + + // Pentium III instructions + + SMPTypeCategory[STARS_NN_addps] = 14; // Packed Single-FP Add + SMPTypeCategory[STARS_NN_addss] = 14; // Scalar Single-FP Add + SMPTypeCategory[STARS_NN_andnps] = 14; // Bitwise Logical And Not for Single-FP + SMPTypeCategory[STARS_NN_andps] = 14; // Bitwise Logical And for Single-FP + SMPTypeCategory[STARS_NN_cmpps] = 14; // Packed Single-FP Compare + SMPTypeCategory[STARS_NN_cmpss] = 14; // Scalar Single-FP Compare + SMPTypeCategory[STARS_NN_comiss] = 14; // Scalar Ordered Single-FP Compare and Set EFLAGS + SMPTypeCategory[STARS_NN_cvtpi2ps] = 14; // Packed signed INT32 to Packed Single-FP conversion + SMPTypeCategory[STARS_NN_cvtps2pi] = 14; // Packed Single-FP to Packed INT32 conversion + SMPTypeCategory[STARS_NN_cvtsi2ss] = 14; // Scalar signed INT32 to Single-FP conversion + SMPTypeCategory[STARS_NN_cvtss2si] = 14; // Scalar Single-FP to signed INT32 conversion + SMPTypeCategory[STARS_NN_cvttps2pi] = 14; // Packed Single-FP to Packed INT32 conversion (truncate) + SMPTypeCategory[STARS_NN_cvttss2si] = 14; // Scalar Single-FP to signed INT32 conversion (truncate) + SMPTypeCategory[STARS_NN_divps] = 14; // Packed Single-FP Divide + SMPTypeCategory[STARS_NN_divss] = 14; // Scalar Single-FP Divide + SMPTypeCategory[STARS_NN_ldmxcsr] = 14; // Load Streaming SIMD Extensions Technology Control/Status Register + SMPTypeCategory[STARS_NN_maxps] = 14; // Packed Single-FP Maximum + SMPTypeCategory[STARS_NN_maxss] = 14; // Scalar Single-FP Maximum + SMPTypeCategory[STARS_NN_minps] = 14; // Packed Single-FP Minimum + SMPTypeCategory[STARS_NN_minss] = 14; // Scalar Single-FP Minimum + SMPTypeCategory[STARS_NN_movaps] = 15; // Move Aligned Four Packed Single-FP ** infer memsrc 'n'? + SMPTypeCategory[STARS_NN_movhlps] = 15; // Move High to Low Packed Single-FP + SMPTypeCategory[STARS_NN_movhps] = 15; // Move High Packed Single-FP + SMPTypeCategory[STARS_NN_movlhps] = 15; // Move Low to High Packed Single-FP + SMPTypeCategory[STARS_NN_movlps] = 15; // Move Low Packed Single-FP + SMPTypeCategory[STARS_NN_movmskps] = 15; // Move Mask to Register + SMPTypeCategory[STARS_NN_movss] = 15; // Move Scalar Single-FP + SMPTypeCategory[STARS_NN_movups] = 15; // Move Unaligned Four Packed Single-FP + SMPTypeCategory[STARS_NN_mulps] = 14; // Packed Single-FP Multiply + SMPTypeCategory[STARS_NN_mulss] = 14; // Scalar Single-FP Multiply + SMPTypeCategory[STARS_NN_orps] = 14; // Bitwise Logical OR for Single-FP Data + SMPTypeCategory[STARS_NN_rcpps] = 14; // Packed Single-FP Reciprocal + SMPTypeCategory[STARS_NN_rcpss] = 14; // Scalar Single-FP Reciprocal + SMPTypeCategory[STARS_NN_rsqrtps] = 14; // Packed Single-FP Square Root Reciprocal + SMPTypeCategory[STARS_NN_rsqrtss] = 14; // Scalar Single-FP Square Root Reciprocal + SMPTypeCategory[STARS_NN_shufps] = 14; // Shuffle Single-FP + SMPTypeCategory[STARS_NN_sqrtps] = 14; // Packed Single-FP Square Root + SMPTypeCategory[STARS_NN_sqrtss] = 14; // Scalar Single-FP Square Root + SMPTypeCategory[STARS_NN_stmxcsr] = 15; // Store Streaming SIMD Extensions Technology Control/Status Register ** Infer dest is 'n' + SMPTypeCategory[STARS_NN_subps] = 14; // Packed Single-FP Subtract + SMPTypeCategory[STARS_NN_subss] = 14; // Scalar Single-FP Subtract + SMPTypeCategory[STARS_NN_ucomiss] = 14; // Scalar Unordered Single-FP Compare and Set EFLAGS + SMPTypeCategory[STARS_NN_unpckhps] = 14; // Unpack High Packed Single-FP Data + SMPTypeCategory[STARS_NN_unpcklps] = 14; // Unpack Low Packed Single-FP Data + SMPTypeCategory[STARS_NN_xorps] = 14; // Bitwise Logical XOR for Single-FP Data + SMPTypeCategory[STARS_NN_pavgb] = 14; // Packed Average (Byte) + SMPTypeCategory[STARS_NN_pavgw] = 14; // Packed Average (Word) + SMPTypeCategory[STARS_NN_pextrw] = 15; // Extract Word + SMPTypeCategory[STARS_NN_pinsrw] = 14; // Insert Word + SMPTypeCategory[STARS_NN_pmaxsw] = 14; // Packed Signed Integer Word Maximum + SMPTypeCategory[STARS_NN_pmaxub] = 14; // Packed Unsigned Integer Byte Maximum + SMPTypeCategory[STARS_NN_pminsw] = 14; // Packed Signed Integer Word Minimum + SMPTypeCategory[STARS_NN_pminub] = 14; // Packed Unsigned Integer Byte Minimum + SMPTypeCategory[STARS_NN_pmovmskb] = 2; // Move Byte Mask to Integer + SMPTypeCategory[STARS_NN_pmulhuw] = 14; // Packed Multiply High Unsigned + SMPTypeCategory[STARS_NN_psadbw] = 14; // Packed Sum of Absolute Differences + SMPTypeCategory[STARS_NN_pshufw] = 14; // Packed Shuffle Word + SMPTypeCategory[STARS_NN_maskmovq] = 15; // Byte Mask write ** Infer dest is 'n' + SMPTypeCategory[STARS_NN_movntps] = 13; // Move Aligned Four Packed Single-FP Non Temporal * infer dest is 'n' + SMPTypeCategory[STARS_NN_movntq] = 13; // Move 64 Bits Non Temporal ** Infer dest is 'n' + SMPTypeCategory[STARS_NN_prefetcht0] = 1; // Prefetch to all cache levels + SMPTypeCategory[STARS_NN_prefetcht1] = 1; // Prefetch to all cache levels + SMPTypeCategory[STARS_NN_prefetcht2] = 1; // Prefetch to L2 cache + SMPTypeCategory[STARS_NN_prefetchnta] = 1; // Prefetch to L1 cache + SMPTypeCategory[STARS_NN_sfence] = 1; // Store Fence + + // Pentium III Pseudo instructions + + SMPTypeCategory[STARS_NN_cmpeqps] = 14; // Packed Single-FP Compare EQ + SMPTypeCategory[STARS_NN_cmpltps] = 14; // Packed Single-FP Compare LT + SMPTypeCategory[STARS_NN_cmpleps] = 14; // Packed Single-FP Compare LE + SMPTypeCategory[STARS_NN_cmpunordps] = 14; // Packed Single-FP Compare UNORD + SMPTypeCategory[STARS_NN_cmpneqps] = 14; // Packed Single-FP Compare NOT EQ + SMPTypeCategory[STARS_NN_cmpnltps] = 14; // Packed Single-FP Compare NOT LT + SMPTypeCategory[STARS_NN_cmpnleps] = 14; // Packed Single-FP Compare NOT LE + SMPTypeCategory[STARS_NN_cmpordps] = 14; // Packed Single-FP Compare ORDERED + SMPTypeCategory[STARS_NN_cmpeqss] = 14; // Scalar Single-FP Compare EQ + SMPTypeCategory[STARS_NN_cmpltss] = 14; // Scalar Single-FP Compare LT + SMPTypeCategory[STARS_NN_cmpless] = 14; // Scalar Single-FP Compare LE + SMPTypeCategory[STARS_NN_cmpunordss] = 14; // Scalar Single-FP Compare UNORD + SMPTypeCategory[STARS_NN_cmpneqss] = 14; // Scalar Single-FP Compare NOT EQ + SMPTypeCategory[STARS_NN_cmpnltss] = 14; // Scalar Single-FP Compare NOT LT + SMPTypeCategory[STARS_NN_cmpnless] = 14; // Scalar Single-FP Compare NOT LE + SMPTypeCategory[STARS_NN_cmpordss] = 14; // Scalar Single-FP Compare ORDERED + + // AMD K7 instructions + + // Revisit AMD if we port to it. + SMPTypeCategory[STARS_NN_pf2iw] = 15; // Packed Floating-Point to Integer with Sign Extend + SMPTypeCategory[STARS_NN_pfnacc] = 15; // Packed Floating-Point Negative Accumulate + SMPTypeCategory[STARS_NN_pfpnacc] = 15; // Packed Floating-Point Mixed Positive-Negative Accumulate + SMPTypeCategory[STARS_NN_pi2fw] = 15; // Packed 16-bit Integer to Floating-Point + SMPTypeCategory[STARS_NN_pswapd] = 15; // Packed Swap Double Word + + // Undocumented FP instructions (thanks to norbert.juffa@adm.com) + + SMPTypeCategory[STARS_NN_fstp1] = 9; // Alias of Store Real and Pop + SMPTypeCategory[STARS_NN_fcom2] = 1; // Alias of Compare Real + SMPTypeCategory[STARS_NN_fcomp3] = 1; // Alias of Compare Real and Pop + SMPTypeCategory[STARS_NN_fxch4] = 1; // Alias of Exchange Registers + SMPTypeCategory[STARS_NN_fcomp5] = 1; // Alias of Compare Real and Pop + SMPTypeCategory[STARS_NN_ffreep] = 1; // Free Register and Pop + SMPTypeCategory[STARS_NN_fxch7] = 1; // Alias of Exchange Registers + SMPTypeCategory[STARS_NN_fstp8] = 9; // Alias of Store Real and Pop + SMPTypeCategory[STARS_NN_fstp9] = 9; // Alias of Store Real and Pop + + // Pentium 4 instructions + + SMPTypeCategory[STARS_NN_addpd] = 14; // Add Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_addsd] = 14; // Add Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_andnpd] = 14; // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_andpd] = 14; // Bitwise Logical AND of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_clflush] = 1; // Flush Cache Line + SMPTypeCategory[STARS_NN_cmppd] = 14; // Compare Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_cmpsd] = 14; // Compare Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_comisd] = 14; // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + SMPTypeCategory[STARS_NN_cvtdq2pd] = 14; // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_cvtdq2ps] = 14; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_cvtpd2dq] = 14; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + SMPTypeCategory[STARS_NN_cvtpd2pi] = 14; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + SMPTypeCategory[STARS_NN_cvtpd2ps] = 14; // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_cvtpi2pd] = 14; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_cvtps2dq] = 14; // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + SMPTypeCategory[STARS_NN_cvtps2pd] = 14; // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_cvtsd2si] = 14; // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer + SMPTypeCategory[STARS_NN_cvtsd2ss] = 14; // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value + SMPTypeCategory[STARS_NN_cvtsi2sd] = 14; // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value + SMPTypeCategory[STARS_NN_cvtss2sd] = 14; // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value + SMPTypeCategory[STARS_NN_cvttpd2dq] = 14; // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + SMPTypeCategory[STARS_NN_cvttpd2pi] = 14; // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + SMPTypeCategory[STARS_NN_cvttps2dq] = 14; // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + SMPTypeCategory[STARS_NN_cvttsd2si] = 14; // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer + SMPTypeCategory[STARS_NN_divpd] = 14; // Divide Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_divsd] = 14; // Divide Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_lfence] = 1; // Load Fence + SMPTypeCategory[STARS_NN_maskmovdqu] = 13; // Store Selected Bytes of Double Quadword ** Infer dest is 'n' + SMPTypeCategory[STARS_NN_maxpd] = 14; // Return Maximum Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_maxsd] = 14; // Return Maximum Scalar Double-Precision Floating-Point Value + SMPTypeCategory[STARS_NN_mfence] = 1; // Memory Fence + SMPTypeCategory[STARS_NN_minpd] = 14; // Return Minimum Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_minsd] = 14; // Return Minimum Scalar Double-Precision Floating-Point Value + SMPTypeCategory[STARS_NN_movapd] = 15; // Move Aligned Packed Double-Precision Floating-Point Values ** Infer dest is 'n' + SMPTypeCategory[STARS_NN_movdq2q] = 15; // Move Quadword from XMM to MMX Register + SMPTypeCategory[STARS_NN_movdqa] = 15; // Move Aligned Double Quadword ** Infer dest is 'n' + SMPTypeCategory[STARS_NN_movdqu] = 15; // Move Unaligned Double Quadword ** Infer dest is 'n' + SMPTypeCategory[STARS_NN_movhpd] = 15; // Move High Packed Double-Precision Floating-Point Values ** Infer dest is 'n' + SMPTypeCategory[STARS_NN_movlpd] = 15; // Move Low Packed Double-Precision Floating-Point Values ** Infer dest is 'n' + SMPTypeCategory[STARS_NN_movmskpd] = 15; // Extract Packed Double-Precision Floating-Point Sign Mask + SMPTypeCategory[STARS_NN_movntdq] = 13; // Store Double Quadword Using Non-Temporal Hint + SMPTypeCategory[STARS_NN_movnti] = 13; // Store Doubleword Using Non-Temporal Hint + SMPTypeCategory[STARS_NN_movntpd] = 13; // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint + SMPTypeCategory[STARS_NN_movq2dq] = 1; // Move Quadword from MMX to XMM Register + SMPTypeCategory[STARS_NN_movsd] = 15; // Move Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_movupd] = 15; // Move Unaligned Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_mulpd] = 14; // Multiply Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_mulsd] = 14; // Multiply Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_orpd] = 14; // Bitwise Logical OR of Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_paddq] = 14; // Add Packed Quadword Integers + SMPTypeCategory[STARS_NN_pause] = 1; // Spin Loop Hint + SMPTypeCategory[STARS_NN_pmuludq] = 14; // Multiply Packed Unsigned Doubleword Integers + SMPTypeCategory[STARS_NN_pshufd] = 14; // Shuffle Packed Doublewords + SMPTypeCategory[STARS_NN_pshufhw] = 14; // Shuffle Packed High Words + SMPTypeCategory[STARS_NN_pshuflw] = 14; // Shuffle Packed Low Words + SMPTypeCategory[STARS_NN_pslldq] = 14; // Shift Double Quadword Left Logical + SMPTypeCategory[STARS_NN_psrldq] = 14; // Shift Double Quadword Right Logical + SMPTypeCategory[STARS_NN_psubq] = 14; // Subtract Packed Quadword Integers + SMPTypeCategory[STARS_NN_punpckhqdq] = 14; // Unpack High Data + SMPTypeCategory[STARS_NN_punpcklqdq] = 14; // Unpack Low Data + SMPTypeCategory[STARS_NN_shufpd] = 14; // Shuffle Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_sqrtpd] = 1; // Compute Square Roots of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_sqrtsd] = 14; // Compute Square Rootof Scalar Double-Precision Floating-Point Value + SMPTypeCategory[STARS_NN_subpd] = 14; // Subtract Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_subsd] = 14; // Subtract Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_ucomisd] = 14; // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + SMPTypeCategory[STARS_NN_unpckhpd] = 14; // Unpack and Interleave High Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_unpcklpd] = 14; // Unpack and Interleave Low Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_xorpd] = 14; // Bitwise Logical OR of Double-Precision Floating-Point Values + + + // AMD syscall/sysret instructions NOTE: not AMD, found in Intel manual + + SMPTypeCategory[STARS_NN_syscall] = 1; // Low latency system call + SMPTypeCategory[STARS_NN_sysret] = 1; // Return from system call + + // AMD64 instructions NOTE: not AMD, found in Intel manual + + SMPTypeCategory[STARS_NN_swapgs] = 1; // Exchange GS base with KernelGSBase MSR + + // New Pentium instructions (SSE3) + + SMPTypeCategory[STARS_NN_movddup] = 14; // Move One Double-FP and Duplicate + SMPTypeCategory[STARS_NN_movshdup] = 14; // Move Packed Single-FP High and Duplicate + SMPTypeCategory[STARS_NN_movsldup] = 14; // Move Packed Single-FP Low and Duplicate + + // Missing AMD64 instructions NOTE: also found in Intel manual + + SMPTypeCategory[STARS_NN_movsxd] = 2; // Move with Sign-Extend Doubleword + SMPTypeCategory[STARS_NN_cmpxchg16b] = 0; // Compare and Exchange 16 Bytes + + // SSE3 instructions + + SMPTypeCategory[STARS_NN_addsubpd] = 14; // Add /Sub packed DP FP numbers + SMPTypeCategory[STARS_NN_addsubps] = 14; // Add /Sub packed SP FP numbers + SMPTypeCategory[STARS_NN_haddpd] = 14; // Add horizontally packed DP FP numbers + SMPTypeCategory[STARS_NN_haddps] = 14; // Add horizontally packed SP FP numbers + SMPTypeCategory[STARS_NN_hsubpd] = 14; // Sub horizontally packed DP FP numbers + SMPTypeCategory[STARS_NN_hsubps] = 14; // Sub horizontally packed SP FP numbers + SMPTypeCategory[STARS_NN_monitor] = 1; // Set up a linear address range to be monitored by hardware + SMPTypeCategory[STARS_NN_mwait] = 1; // Wait until write-back store performed within the range specified by the MONITOR instruction + SMPTypeCategory[STARS_NN_fisttp] = 13; // Store ST in intXX (chop) and pop + SMPTypeCategory[STARS_NN_lddqu] = 14; // Load unaligned integer 128-bit + + // SSSE3 instructions + + SMPTypeCategory[STARS_NN_psignb] = 14; // Packed SIGN Byte + SMPTypeCategory[STARS_NN_psignw] = 14; // Packed SIGN Word + SMPTypeCategory[STARS_NN_psignd] = 14; // Packed SIGN Doubleword + SMPTypeCategory[STARS_NN_pshufb] = 14; // Packed Shuffle Bytes + SMPTypeCategory[STARS_NN_pmulhrsw] = 14; // Packed Multiply High with Round and Scale + SMPTypeCategory[STARS_NN_pmaddubsw] = 14; // Multiply and Add Packed Signed and Unsigned Bytes + SMPTypeCategory[STARS_NN_phsubsw] = 14; // Packed Horizontal Subtract and Saturate + SMPTypeCategory[STARS_NN_phaddsw] = 14; // Packed Horizontal Add and Saturate + SMPTypeCategory[STARS_NN_phaddw] = 14; // Packed Horizontal Add Word + SMPTypeCategory[STARS_NN_phaddd] = 14; // Packed Horizontal Add Doubleword + SMPTypeCategory[STARS_NN_phsubw] = 14; // Packed Horizontal Subtract Word + SMPTypeCategory[STARS_NN_phsubd] = 14; // Packed Horizontal Subtract Doubleword + SMPTypeCategory[STARS_NN_palignr] = 15; // Packed Align Right + SMPTypeCategory[STARS_NN_pabsb] = 14; // Packed Absolute Value Byte + SMPTypeCategory[STARS_NN_pabsw] = 14; // Packed Absolute Value Word + SMPTypeCategory[STARS_NN_pabsd] = 14; // Packed Absolute Value Doubleword + + // VMX instructions + + SMPTypeCategory[STARS_NN_vmcall] = 1; // Call to VM Monitor + SMPTypeCategory[STARS_NN_vmclear] = 0; // Clear Virtual Machine Control Structure + SMPTypeCategory[STARS_NN_vmlaunch] = 1; // Launch Virtual Machine + SMPTypeCategory[STARS_NN_vmresume] = 1; // Resume Virtual Machine + SMPTypeCategory[STARS_NN_vmptrld] = 6; // Load Pointer to Virtual Machine Control Structure + SMPTypeCategory[STARS_NN_vmptrst] = 0; // Store Pointer to Virtual Machine Control Structure + SMPTypeCategory[STARS_NN_vmread] = 0; // Read Field from Virtual Machine Control Structure + SMPTypeCategory[STARS_NN_vmwrite] = 0; // Write Field from Virtual Machine Control Structure + SMPTypeCategory[STARS_NN_vmxoff] = 1; // Leave VMX Operation + SMPTypeCategory[STARS_NN_vmxon] = 1; // Enter VMX Operation + +#if 599 < IDA_SDK_VERSION + + SMPTypeCategory[STARS_NN_ud2] = 1; // Undefined Instruction + + // Added with x86-64 + + SMPTypeCategory[STARS_NN_rdtscp] = 8; // Read Time-Stamp Counter and Processor ID + + // Geode LX 3DNow! extensions + + SMPTypeCategory[STARS_NN_pfrcpv] = 1; // Reciprocal Approximation for a Pair of 32-bit Floats + SMPTypeCategory[STARS_NN_pfrsqrtv] = 1; // Reciprocal Square Root Approximation for a Pair of 32-bit Floats + + // SSE2 pseudoinstructions + + SMPTypeCategory[STARS_NN_cmpeqpd] = 1; // Packed Double-FP Compare EQ + SMPTypeCategory[STARS_NN_cmpltpd] = 1; // Packed Double-FP Compare LT + SMPTypeCategory[STARS_NN_cmplepd] = 1; // Packed Double-FP Compare LE + SMPTypeCategory[STARS_NN_cmpunordpd] = 1; // Packed Double-FP Compare UNORD + SMPTypeCategory[STARS_NN_cmpneqpd] = 1; // Packed Double-FP Compare NOT EQ + SMPTypeCategory[STARS_NN_cmpnltpd] = 1; // Packed Double-FP Compare NOT LT + SMPTypeCategory[STARS_NN_cmpnlepd] = 1; // Packed Double-FP Compare NOT LE + SMPTypeCategory[STARS_NN_cmpordpd] = 1; // Packed Double-FP Compare ORDERED + SMPTypeCategory[STARS_NN_cmpeqsd] = 1; // Scalar Double-FP Compare EQ + SMPTypeCategory[STARS_NN_cmpltsd] = 1; // Scalar Double-FP Compare LT + SMPTypeCategory[STARS_NN_cmplesd] = 1; // Scalar Double-FP Compare LE + SMPTypeCategory[STARS_NN_cmpunordsd] = 1; // Scalar Double-FP Compare UNORD + SMPTypeCategory[STARS_NN_cmpneqsd] = 1; // Scalar Double-FP Compare NOT EQ + SMPTypeCategory[STARS_NN_cmpnltsd] = 1; // Scalar Double-FP Compare NOT LT + SMPTypeCategory[STARS_NN_cmpnlesd] = 1; // Scalar Double-FP Compare NOT LE + SMPTypeCategory[STARS_NN_cmpordsd] = 1; // Scalar Double-FP Compare ORDERED + + // SSSE4.1 instructions + + SMPTypeCategory[STARS_NN_blendpd] = 14; // Blend Packed Double Precision Floating-Point Values + SMPTypeCategory[STARS_NN_blendps] = 14; // Blend Packed Single Precision Floating-Point Values + SMPTypeCategory[STARS_NN_blendvpd] = 14; // Variable Blend Packed Double Precision Floating-Point Values + SMPTypeCategory[STARS_NN_blendvps] = 14; // Variable Blend Packed Single Precision Floating-Point Values + SMPTypeCategory[STARS_NN_dppd] = 14; // Dot Product of Packed Double Precision Floating-Point Values + SMPTypeCategory[STARS_NN_dpps] = 14; // Dot Product of Packed Single Precision Floating-Point Values + SMPTypeCategory[STARS_NN_extractps] = 15; // Extract Packed Single Precision Floating-Point Value + SMPTypeCategory[STARS_NN_insertps] = 14; // Insert Packed Single Precision Floating-Point Value + SMPTypeCategory[STARS_NN_movntdqa] = 0; // Load Double Quadword Non-Temporal Aligned Hint + SMPTypeCategory[STARS_NN_mpsadbw] = 1; // Compute Multiple Packed Sums of Absolute Difference + SMPTypeCategory[STARS_NN_packusdw] = 14; // Pack with Unsigned Saturation + SMPTypeCategory[STARS_NN_pblendvb] = 14; // Variable Blend Packed Bytes + SMPTypeCategory[STARS_NN_pblendw] = 14; // Blend Packed Words + SMPTypeCategory[STARS_NN_pcmpeqq] = 14; // Compare Packed Qword Data for Equal + SMPTypeCategory[STARS_NN_pextrb] = 15; // Extract Byte + SMPTypeCategory[STARS_NN_pextrd] = 15; // Extract Dword + SMPTypeCategory[STARS_NN_pextrq] = 15; // Extract Qword + SMPTypeCategory[STARS_NN_phminposuw] = 14; // Packed Horizontal Word Minimum + SMPTypeCategory[STARS_NN_pinsrb] = 14; // Insert Byte !!! Could this be used as a generic move??? + SMPTypeCategory[STARS_NN_pinsrd] = 14; // Insert Dword !!! Could this be used as a generic move??? + SMPTypeCategory[STARS_NN_pinsrq] = 14; // Insert Qword !!! Could this be used as a generic move??? + SMPTypeCategory[STARS_NN_pmaxsb] = 14; // Maximum of Packed Signed Byte Integers + SMPTypeCategory[STARS_NN_pmaxsd] = 14; // Maximum of Packed Signed Dword Integers + SMPTypeCategory[STARS_NN_pmaxud] = 14; // Maximum of Packed Unsigned Dword Integers + SMPTypeCategory[STARS_NN_pmaxuw] = 14; // Maximum of Packed Word Integers + SMPTypeCategory[STARS_NN_pminsb] = 14; // Minimum of Packed Signed Byte Integers + SMPTypeCategory[STARS_NN_pminsd] = 14; // Minimum of Packed Signed Dword Integers + SMPTypeCategory[STARS_NN_pminud] = 14; // Minimum of Packed Unsigned Dword Integers + SMPTypeCategory[STARS_NN_pminuw] = 14; // Minimum of Packed Word Integers + SMPTypeCategory[STARS_NN_pmovsxbw] = 14; // Packed Move with Sign Extend + SMPTypeCategory[STARS_NN_pmovsxbd] = 14; // Packed Move with Sign Extend + SMPTypeCategory[STARS_NN_pmovsxbq] = 14; // Packed Move with Sign Extend + SMPTypeCategory[STARS_NN_pmovsxwd] = 14; // Packed Move with Sign Extend + SMPTypeCategory[STARS_NN_pmovsxwq] = 14; // Packed Move with Sign Extend + SMPTypeCategory[STARS_NN_pmovsxdq] = 14; // Packed Move with Sign Extend + SMPTypeCategory[STARS_NN_pmovzxbw] = 14; // Packed Move with Zero Extend + SMPTypeCategory[STARS_NN_pmovzxbd] = 14; // Packed Move with Zero Extend + SMPTypeCategory[STARS_NN_pmovzxbq] = 14; // Packed Move with Zero Extend + SMPTypeCategory[STARS_NN_pmovzxwd] = 14; // Packed Move with Zero Extend + SMPTypeCategory[STARS_NN_pmovzxwq] = 14; // Packed Move with Zero Extend + SMPTypeCategory[STARS_NN_pmovzxdq] = 14; // Packed Move with Zero Extend + SMPTypeCategory[STARS_NN_pmuldq] = 14; // Multiply Packed Signed Dword Integers + SMPTypeCategory[STARS_NN_pmulld] = 14; // Multiply Packed Signed Dword Integers and Store Low Result + SMPTypeCategory[STARS_NN_ptest] = 1; // Logical Compare + SMPTypeCategory[STARS_NN_roundpd] = 14; // Round Packed Double Precision Floating-Point Values + SMPTypeCategory[STARS_NN_roundps] = 14; // Round Packed Single Precision Floating-Point Values + SMPTypeCategory[STARS_NN_roundsd] = 14; // Round Scalar Double Precision Floating-Point Values + SMPTypeCategory[STARS_NN_roundss] = 14; // Round Scalar Single Precision Floating-Point Values + + // SSSE4.2 instructions + SMPTypeCategory[STARS_NN_crc32] = 14; // Accumulate CRC32 Value + SMPTypeCategory[STARS_NN_pcmpestri] = 2; // Packed Compare Explicit Length Strings, Return Index + SMPTypeCategory[STARS_NN_pcmpestrm] = 2; // Packed Compare Explicit Length Strings, Return Mask + SMPTypeCategory[STARS_NN_pcmpistri] = 2; // Packed Compare Implicit Length Strings, Return Index + SMPTypeCategory[STARS_NN_pcmpistrm] = 2; // Packed Compare Implicit Length Strings, Return Mask + SMPTypeCategory[STARS_NN_pcmpgtq] = 14; // Compare Packed Data for Greater Than + SMPTypeCategory[STARS_NN_popcnt] = 2; // Return the Count of Number of Bits Set to 1 + + // AMD SSE4a instructions + + SMPTypeCategory[STARS_NN_extrq] = 1; // Extract Field From Register + SMPTypeCategory[STARS_NN_insertq] = 1; // Insert Field + SMPTypeCategory[STARS_NN_movntsd] = 13; // Move Non-Temporal Scalar Double-Precision Floating-Point !!! Could this be used as a generic move??? + SMPTypeCategory[STARS_NN_movntss] = 13; // Move Non-Temporal Scalar Single-Precision Floating-Point !!! Could this be used as a generic move??? + SMPTypeCategory[STARS_NN_lzcnt] = 2; // Leading Zero Count + + // xsave/xrstor instructions + + SMPTypeCategory[STARS_NN_xgetbv] = 8; // Get Value of Extended Control Register + SMPTypeCategory[STARS_NN_xrstor] = 0; // Restore Processor Extended States + SMPTypeCategory[STARS_NN_xsave] = 1; // Save Processor Extended States + SMPTypeCategory[STARS_NN_xsetbv] = 1; // Set Value of Extended Control Register + + // Intel Safer Mode Extensions (SMX) + + SMPTypeCategory[STARS_NN_getsec] = 1; // Safer Mode Extensions (SMX) Instruction + + // AMD-V Virtualization ISA Extension + + SMPTypeCategory[STARS_NN_clgi] = 0; // Clear Global Interrupt Flag + SMPTypeCategory[STARS_NN_invlpga] = 1; // Invalidate TLB Entry in a Specified ASID + SMPTypeCategory[STARS_NN_skinit] = 1; // Secure Init and Jump with Attestation + SMPTypeCategory[STARS_NN_stgi] = 0; // Set Global Interrupt Flag + SMPTypeCategory[STARS_NN_vmexit] = 1; // Stop Executing Guest, Begin Executing Host + SMPTypeCategory[STARS_NN_vmload] = 0; // Load State from VMCB + SMPTypeCategory[STARS_NN_vmmcall] = 1; // Call VMM + SMPTypeCategory[STARS_NN_vmrun] = 1; // Run Virtual Machine + SMPTypeCategory[STARS_NN_vmsave] = 0; // Save State to VMCB + + // VMX+ instructions + + SMPTypeCategory[STARS_NN_invept] = 1; // Invalidate Translations Derived from EPT + SMPTypeCategory[STARS_NN_invvpid] = 1; // Invalidate Translations Based on VPID + + // Intel Atom instructions + + // !!!! continue work here + SMPTypeCategory[STARS_NN_movbe] = 3; // Move Data After Swapping Bytes + + // Intel AES instructions + + SMPTypeCategory[STARS_NN_aesenc] = 14; // Perform One Round of an AES Encryption Flow + SMPTypeCategory[STARS_NN_aesenclast] = 14; // Perform the Last Round of an AES Encryption Flow + SMPTypeCategory[STARS_NN_aesdec] = 14; // Perform One Round of an AES Decryption Flow + SMPTypeCategory[STARS_NN_aesdeclast] = 14; // Perform the Last Round of an AES Decryption Flow + SMPTypeCategory[STARS_NN_aesimc] = 14; // Perform the AES InvMixColumn Transformation + SMPTypeCategory[STARS_NN_aeskeygenassist] = 14; // AES Round Key Generation Assist + + // Carryless multiplication + + SMPTypeCategory[STARS_NN_pclmulqdq] = 14; // Carry-Less Multiplication Quadword + + // Returns modified by operand size prefixes + + SMPTypeCategory[STARS_NN_retnw] = 0; // Return Near from Procedure (use16) + SMPTypeCategory[STARS_NN_retnd] = 0; // Return Near from Procedure (use32) + SMPTypeCategory[STARS_NN_retnq] = 0; // Return Near from Procedure (use64) + SMPTypeCategory[STARS_NN_retfw] = 0; // Return Far from Procedure (use16) + SMPTypeCategory[STARS_NN_retfd] = 0; // Return Far from Procedure (use32) + SMPTypeCategory[STARS_NN_retfq] = 0; // Return Far from Procedure (use64) + + // RDRAND support + + SMPTypeCategory[STARS_NN_rdrand] = 2; // Read Random Number + + // new GPR instructions + + SMPTypeCategory[STARS_NN_adcx] = 5; // Unsigned Integer Addition of Two Operands with Carry Flag + SMPTypeCategory[STARS_NN_adox] = 5; // Unsigned Integer Addition of Two Operands with Overflow Flag + SMPTypeCategory[STARS_NN_andn] = 10; // Logical AND NOT + SMPTypeCategory[STARS_NN_bextr] = 14; // Bit Field Extract + SMPTypeCategory[STARS_NN_blsi] = 14; // Extract Lowest Set Isolated Bit + SMPTypeCategory[STARS_NN_blsmsk] = 2; // Get Mask Up to Lowest Set Bit + SMPTypeCategory[STARS_NN_blsr] = 2; // Reset Lowest Set Bit + SMPTypeCategory[STARS_NN_bzhi] = 2; // Zero High Bits Starting with Specified Bit Position + SMPTypeCategory[STARS_NN_clac] = 1; // Clear AC Flag in EFLAGS Register + SMPTypeCategory[STARS_NN_mulx] = 2; // Unsigned Multiply Without Affecting Flags + SMPTypeCategory[STARS_NN_pdep] = 2; // Parallel Bits Deposit + SMPTypeCategory[STARS_NN_pext] = 2; // Parallel Bits Extract + SMPTypeCategory[STARS_NN_rorx] = 2; // Rotate Right Logical Without Affecting Flags + SMPTypeCategory[STARS_NN_sarx] = 2; // Shift Arithmetically Right Without Affecting Flags + SMPTypeCategory[STARS_NN_shlx] = 2; // Shift Logically Left Without Affecting Flags + SMPTypeCategory[STARS_NN_shrx] = 2; // Shift Logically Right Without Affecting Flags + SMPTypeCategory[STARS_NN_stac] = 1; // Set AC Flag in EFLAGS Register + SMPTypeCategory[STARS_NN_tzcnt] = 2; // Count the Number of Trailing Zero Bits + SMPTypeCategory[STARS_NN_xsaveopt] = 1; // Save Processor Extended States Optimized + SMPTypeCategory[STARS_NN_invpcid] = 1; // Invalidate Processor Context ID + SMPTypeCategory[STARS_NN_rdseed] = 2; // Read Random Seed + SMPTypeCategory[STARS_NN_rdfsbase] = 6; // Read FS Segment Base + SMPTypeCategory[STARS_NN_rdgsbase] = 6; // Read GS Segment Base + SMPTypeCategory[STARS_NN_wrfsbase] = 6; // Write FS Segment Base + SMPTypeCategory[STARS_NN_wrgsbase] = 6; // Write GS Segment Base + + // new AVX instructions + + SMPTypeCategory[STARS_NN_vaddpd] = 14; // Add Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vaddps] = 14; // Packed Single-FP Add + SMPTypeCategory[STARS_NN_vaddsd] = 14; // Add Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vaddss] = 14; // Scalar Single-FP Add + SMPTypeCategory[STARS_NN_vaddsubpd] = 14; // Add /Sub packed DP FP numbers + SMPTypeCategory[STARS_NN_vaddsubps] = 14; // Add /Sub packed SP FP numbers + SMPTypeCategory[STARS_NN_vaesdec] = 14; // Perform One Round of an AES Decryption Flow + SMPTypeCategory[STARS_NN_vaesdeclast] = 14; // Perform the Last Round of an AES Decryption Flow + SMPTypeCategory[STARS_NN_vaesenc] = 14; // Perform One Round of an AES Encryption Flow + SMPTypeCategory[STARS_NN_vaesenclast] = 14; // Perform the Last Round of an AES Encryption Flow + SMPTypeCategory[STARS_NN_vaesimc] = 14; // Perform the AES InvMixColumn Transformation + SMPTypeCategory[STARS_NN_vaeskeygenassist] = 14; // AES Round Key Generation Assist + SMPTypeCategory[STARS_NN_vandnpd] = 14; // Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vandnps] = 14; // Bitwise Logical And Not for Single-FP + SMPTypeCategory[STARS_NN_vandpd] = 14; // Bitwise Logical AND of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vandps] = 14; // Bitwise Logical And for Single-FP + SMPTypeCategory[STARS_NN_vblendpd] = 14; // Blend Packed Double Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vblendps] = 14; // Blend Packed Single Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vblendvpd] = 14; // Variable Blend Packed Double Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vblendvps] = 14; // Variable Blend Packed Single Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vbroadcastf128] = 14; // Broadcast 128 Bits of Floating-Point Data + SMPTypeCategory[STARS_NN_vbroadcasti128] = 14; // Broadcast 128 Bits of Integer Data + SMPTypeCategory[STARS_NN_vbroadcastsd] = 14; // Broadcast Double-Precision Floating-Point Element + SMPTypeCategory[STARS_NN_vbroadcastss] = 14; // Broadcast Single-Precision Floating-Point Element + SMPTypeCategory[STARS_NN_vcmppd] = 14; // Compare Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vcmpps] = 14; // Packed Single-FP Compare + SMPTypeCategory[STARS_NN_vcmpsd] = 14; // Compare Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vcmpss] = 14; // Scalar Single-FP Compare + SMPTypeCategory[STARS_NN_vcomisd] = 14; // Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + SMPTypeCategory[STARS_NN_vcomiss] = 14; // Scalar Ordered Single-FP Compare and Set EFLAGS + SMPTypeCategory[STARS_NN_vcvtdq2pd] = 14; // Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vcvtdq2ps] = 14; // Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vcvtpd2dq] = 14; // Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + SMPTypeCategory[STARS_NN_vcvtpd2ps] = 14; // Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vcvtph2ps] = 14; // Convert 16-bit FP Values to Single-Precision FP Values + SMPTypeCategory[STARS_NN_vcvtps2dq] = 14; // Convert Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + SMPTypeCategory[STARS_NN_vcvtps2pd] = 14; // Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vcvtps2ph] = 14; // Convert Single-Precision FP value to 16-bit FP value + SMPTypeCategory[STARS_NN_vcvtsd2si] = 14; // Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer + SMPTypeCategory[STARS_NN_vcvtsd2ss] = 14; // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value + SMPTypeCategory[STARS_NN_vcvtsi2sd] = 14; // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value + SMPTypeCategory[STARS_NN_vcvtsi2ss] = 14; // Scalar signed INT32 to Single-FP conversion + SMPTypeCategory[STARS_NN_vcvtss2sd] = 14; // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value + SMPTypeCategory[STARS_NN_vcvtss2si] = 14; // Scalar Single-FP to signed INT32 conversion + SMPTypeCategory[STARS_NN_vcvttpd2dq] = 14; // Convert With Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers + SMPTypeCategory[STARS_NN_vcvttps2dq] = 14; // Convert With Truncation Packed Single-Precision Floating-Point Values to Packed Doubleword Integers + SMPTypeCategory[STARS_NN_vcvttsd2si] = 14; // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer + SMPTypeCategory[STARS_NN_vcvttss2si] = 14; // Scalar Single-FP to signed INT32 conversion (truncate) + SMPTypeCategory[STARS_NN_vdivpd] = 14; // Divide Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vdivps] = 14; // Packed Single-FP Divide + SMPTypeCategory[STARS_NN_vdivsd] = 14; // Divide Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vdivss] = 14; // Scalar Single-FP Divide + SMPTypeCategory[STARS_NN_vdppd] = 14; // Dot Product of Packed Double Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vdpps] = 14; // Dot Product of Packed Single Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vextractf128] = 14; // Extract Packed Floating-Point Values + SMPTypeCategory[STARS_NN_vextracti128] = 14; // Extract Packed Integer Values + SMPTypeCategory[STARS_NN_vextractps] = 14; // Extract Packed Floating-Point Values + SMPTypeCategory[STARS_NN_vfmadd132pd] = 14; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmadd132ps] = 14; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmadd132sd] = 14; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmadd132ss] = 14; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmadd213pd] = 14; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmadd213ps] = 14; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmadd213sd] = 14; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmadd213ss] = 14; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmadd231pd] = 14; // Fused Multiply-Add of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmadd231ps] = 14; // Fused Multiply-Add of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmadd231sd] = 14; // Fused Multiply-Add of Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmadd231ss] = 14; // Fused Multiply-Add of Scalar Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmaddsub132pd] = 14; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmaddsub132ps] = 14; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmaddsub213pd] = 14; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmaddsub213ps] = 14; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmaddsub231pd] = 14; // Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmaddsub231ps] = 14; // Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsub132pd] = 14; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsub132ps] = 14; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsub132sd] = 14; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsub132ss] = 14; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsub213pd] = 14; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsub213ps] = 14; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsub213sd] = 14; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsub213ss] = 14; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsub231pd] = 14; // Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsub231ps] = 14; // Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsub231sd] = 14; // Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsub231ss] = 14; // Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsubadd132pd] = 14; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsubadd132ps] = 14; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsubadd213pd] = 14; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsubadd213ps] = 14; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsubadd231pd] = 14; // Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfmsubadd231ps] = 14; // Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmadd132pd] = 14; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmadd132ps] = 14; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmadd132sd] = 14; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmadd132ss] = 14; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmadd213pd] = 14; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmadd213ps] = 14; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmadd213sd] = 14; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmadd213ss] = 14; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmadd231pd] = 14; // Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmadd231ps] = 14; // Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmadd231sd] = 14; // Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmadd231ss] = 14; // Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmsub132pd] = 14; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmsub132ps] = 14; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmsub132sd] = 14; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmsub132ss] = 14; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmsub213pd] = 14; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmsub213ps] = 14; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmsub213sd] = 14; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmsub213ss] = 14; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmsub231pd] = 14; // Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmsub231ps] = 14; // Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmsub231sd] = 14; // Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vfnmsub231ss] = 14; // Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vgatherdps] = 14; // Gather Packed SP FP Values Using Signed Dword Indices + SMPTypeCategory[STARS_NN_vgatherdpd] = 14; // Gather Packed DP FP Values Using Signed Dword Indices + SMPTypeCategory[STARS_NN_vgatherqps] = 14; // Gather Packed SP FP Values Using Signed Qword Indices + SMPTypeCategory[STARS_NN_vgatherqpd] = 14; // Gather Packed DP FP Values Using Signed Qword Indices + SMPTypeCategory[STARS_NN_vhaddpd] = 14; // Add horizontally packed DP FP numbers + SMPTypeCategory[STARS_NN_vhaddps] = 14; // Add horizontally packed SP FP numbers + SMPTypeCategory[STARS_NN_vhsubpd] = 14; // Sub horizontally packed DP FP numbers + SMPTypeCategory[STARS_NN_vhsubps] = 14; // Sub horizontally packed SP FP numbers + SMPTypeCategory[STARS_NN_vinsertf128] = 14; // Insert Packed Floating-Point Values + SMPTypeCategory[STARS_NN_vinserti128] = 14; // Insert Packed Integer Values + SMPTypeCategory[STARS_NN_vinsertps] = 14; // Insert Packed Single Precision Floating-Point Value + SMPTypeCategory[STARS_NN_vlddqu] = 14; // Load Unaligned Packed Integer Values + SMPTypeCategory[STARS_NN_vldmxcsr] = 14; // Load Streaming SIMD Extensions Technology Control/Status Register + SMPTypeCategory[STARS_NN_vmaskmovdqu] = 15; // Store Selected Bytes of Double Quadword with NT Hint + SMPTypeCategory[STARS_NN_vmaskmovpd] = 15; // Conditionally Load Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vmaskmovps] = 15; // Conditionally Load Packed Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vmaxpd] = 14; // Return Maximum Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vmaxps] = 14; // Packed Single-FP Maximum + SMPTypeCategory[STARS_NN_vmaxsd] = 14; // Return Maximum Scalar Double-Precision Floating-Point Value + SMPTypeCategory[STARS_NN_vmaxss] = 14; // Scalar Single-FP Maximum + SMPTypeCategory[STARS_NN_vminpd] = 14; // Return Minimum Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vminps] = 14; // Packed Single-FP Minimum + SMPTypeCategory[STARS_NN_vminsd] = 14; // Return Minimum Scalar Double-Precision Floating-Point Value + SMPTypeCategory[STARS_NN_vminss] = 14; // Scalar Single-FP Minimum + SMPTypeCategory[STARS_NN_vmovapd] = 15; // Move Aligned Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vmovaps] = 15; // Move Aligned Four Packed Single-FP + SMPTypeCategory[STARS_NN_vmovd] = 15; // Move 32 bits + SMPTypeCategory[STARS_NN_vmovddup] = 15; // Move One Double-FP and Duplicate + SMPTypeCategory[STARS_NN_vmovdqa] = 15; // Move Aligned Double Quadword + SMPTypeCategory[STARS_NN_vmovdqu] = 15; // Move Unaligned Double Quadword + SMPTypeCategory[STARS_NN_vmovhlps] = 15; // Move High to Low Packed Single-FP + SMPTypeCategory[STARS_NN_vmovhpd] = 15; // Move High Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vmovhps] = 15; // Move High Packed Single-FP + SMPTypeCategory[STARS_NN_vmovlhps] = 15; // Move Low to High Packed Single-FP + SMPTypeCategory[STARS_NN_vmovlpd] = 15; // Move Low Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vmovlps] = 15; // Move Low Packed Single-FP + SMPTypeCategory[STARS_NN_vmovmskpd] = 15; // Extract Packed Double-Precision Floating-Point Sign Mask + SMPTypeCategory[STARS_NN_vmovmskps] = 15; // Move Mask to Register + SMPTypeCategory[STARS_NN_vmovntdq] = 15; // Store Double Quadword Using Non-Temporal Hint + SMPTypeCategory[STARS_NN_vmovntdqa] = 15; // Load Double Quadword Non-Temporal Aligned Hint + SMPTypeCategory[STARS_NN_vmovntpd] = 15; // Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint + SMPTypeCategory[STARS_NN_vmovntps] = 15; // Move Aligned Four Packed Single-FP Non Temporal + SMPTypeCategory[STARS_NN_vmovntsd] = 15; // Move Non-Temporal Scalar Double-Precision Floating-Point + SMPTypeCategory[STARS_NN_vmovntss] = 15; // Move Non-Temporal Scalar Single-Precision Floating-Point + SMPTypeCategory[STARS_NN_vmovq] = 15; // Move 64 bits + SMPTypeCategory[STARS_NN_vmovsd] = 15; // Move Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vmovshdup] = 15; // Move Packed Single-FP High and Duplicate + SMPTypeCategory[STARS_NN_vmovsldup] = 15; // Move Packed Single-FP Low and Duplicate + SMPTypeCategory[STARS_NN_vmovss] = 15; // Move Scalar Single-FP + SMPTypeCategory[STARS_NN_vmovupd] = 15; // Move Unaligned Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vmovups] = 15; // Move Unaligned Four Packed Single-FP + SMPTypeCategory[STARS_NN_vmpsadbw] = 14; // Compute Multiple Packed Sums of Absolute Difference + SMPTypeCategory[STARS_NN_vmulpd] = 14; // Multiply Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vmulps] = 14; // Packed Single-FP Multiply + SMPTypeCategory[STARS_NN_vmulsd] = 14; // Multiply Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vmulss] = 14; // Scalar Single-FP Multiply + SMPTypeCategory[STARS_NN_vorpd] = 14; // Bitwise Logical OR of Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vorps] = 14; // Bitwise Logical OR for Single-FP Data + SMPTypeCategory[STARS_NN_vpabsb] = 14; // Packed Absolute Value Byte + SMPTypeCategory[STARS_NN_vpabsd] = 14; // Packed Absolute Value Doubleword + SMPTypeCategory[STARS_NN_vpabsw] = 14; // Packed Absolute Value Word + SMPTypeCategory[STARS_NN_vpackssdw] = 14; // Pack with Signed Saturation (Dword->Word) + SMPTypeCategory[STARS_NN_vpacksswb] = 14; // Pack with Signed Saturation (Word->Byte) + SMPTypeCategory[STARS_NN_vpackusdw] = 14; // Pack with Unsigned Saturation + SMPTypeCategory[STARS_NN_vpackuswb] = 14; // Pack with Unsigned Saturation (Word->Byte) + SMPTypeCategory[STARS_NN_vpaddb] = 14; // Packed Add Byte + SMPTypeCategory[STARS_NN_vpaddd] = 14; // Packed Add Dword + SMPTypeCategory[STARS_NN_vpaddq] = 14; // Add Packed Quadword Integers + SMPTypeCategory[STARS_NN_vpaddsb] = 14; // Packed Add with Saturation (Byte) + SMPTypeCategory[STARS_NN_vpaddsw] = 14; // Packed Add with Saturation (Word) + SMPTypeCategory[STARS_NN_vpaddusb] = 14; // Packed Add Unsigned with Saturation (Byte) + SMPTypeCategory[STARS_NN_vpaddusw] = 14; // Packed Add Unsigned with Saturation (Word) + SMPTypeCategory[STARS_NN_vpaddw] = 14; // Packed Add Word + SMPTypeCategory[STARS_NN_vpalignr] = 14; // Packed Align Right + SMPTypeCategory[STARS_NN_vpand] = 14; // Bitwise Logical And + SMPTypeCategory[STARS_NN_vpandn] = 14; // Bitwise Logical And Not + SMPTypeCategory[STARS_NN_vpavgb] = 14; // Packed Average (Byte) + SMPTypeCategory[STARS_NN_vpavgw] = 14; // Packed Average (Word) + SMPTypeCategory[STARS_NN_vpblendd] = 14; // Blend Packed Dwords + SMPTypeCategory[STARS_NN_vpblendvb] = 14; // Variable Blend Packed Bytes + SMPTypeCategory[STARS_NN_vpblendw] = 14; // Blend Packed Words + SMPTypeCategory[STARS_NN_vpbroadcastb] = 14; // Broadcast a Byte Integer + SMPTypeCategory[STARS_NN_vpbroadcastd] = 14; // Broadcast a Dword Integer + SMPTypeCategory[STARS_NN_vpbroadcastq] = 14; // Broadcast a Qword Integer + SMPTypeCategory[STARS_NN_vpbroadcastw] = 14; // Broadcast a Word Integer + SMPTypeCategory[STARS_NN_vpclmulqdq] = 14; // Carry-Less Multiplication Quadword + SMPTypeCategory[STARS_NN_vpcmpeqb] = 14; // Packed Compare for Equal (Byte) + SMPTypeCategory[STARS_NN_vpcmpeqd] = 14; // Packed Compare for Equal (Dword) + SMPTypeCategory[STARS_NN_vpcmpeqq] = 14; // Compare Packed Qword Data for Equal + SMPTypeCategory[STARS_NN_vpcmpeqw] = 14; // Packed Compare for Equal (Word) + SMPTypeCategory[STARS_NN_vpcmpestri] = 14; // Packed Compare Explicit Length Strings, Return Index + SMPTypeCategory[STARS_NN_vpcmpestrm] = 14; // Packed Compare Explicit Length Strings, Return Mask + SMPTypeCategory[STARS_NN_vpcmpgtb] = 14; // Packed Compare for Greater Than (Byte) + SMPTypeCategory[STARS_NN_vpcmpgtd] = 14; // Packed Compare for Greater Than (Dword) + SMPTypeCategory[STARS_NN_vpcmpgtq] = 14; // Compare Packed Data for Greater Than + SMPTypeCategory[STARS_NN_vpcmpgtw] = 14; // Packed Compare for Greater Than (Word) + SMPTypeCategory[STARS_NN_vpcmpistri] = 14; // Packed Compare Implicit Length Strings, Return Index + SMPTypeCategory[STARS_NN_vpcmpistrm] = 14; // Packed Compare Implicit Length Strings, Return Mask + SMPTypeCategory[STARS_NN_vperm2f128] = 14; // Permute Floating-Point Values + SMPTypeCategory[STARS_NN_vperm2i128] = 14; // Permute Integer Values + SMPTypeCategory[STARS_NN_vpermd] = 14; // Full Doublewords Element Permutation + SMPTypeCategory[STARS_NN_vpermilpd] = 14; // Permute Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vpermilps] = 14; // Permute Single-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vpermpd] = 14; // Permute Double-Precision Floating-Point Elements + SMPTypeCategory[STARS_NN_vpermps] = 14; // Permute Single-Precision Floating-Point Elements + SMPTypeCategory[STARS_NN_vpermq] = 14; // Qwords Element Permutation + SMPTypeCategory[STARS_NN_vpextrb] = 14; // Extract Byte + SMPTypeCategory[STARS_NN_vpextrd] = 14; // Extract Dword + SMPTypeCategory[STARS_NN_vpextrq] = 14; // Extract Qword + SMPTypeCategory[STARS_NN_vpextrw] = 14; // Extract Word + SMPTypeCategory[STARS_NN_vpgatherdd] = 14; // Gather Packed Dword Values Using Signed Dword Indices + SMPTypeCategory[STARS_NN_vpgatherdq] = 14; // Gather Packed Qword Values Using Signed Dword Indices + SMPTypeCategory[STARS_NN_vpgatherqd] = 14; // Gather Packed Dword Values Using Signed Qword Indices + SMPTypeCategory[STARS_NN_vpgatherqq] = 14; // Gather Packed Qword Values Using Signed Qword Indices + SMPTypeCategory[STARS_NN_vphaddd] = 14; // Packed Horizontal Add Doubleword + SMPTypeCategory[STARS_NN_vphaddsw] = 14; // Packed Horizontal Add and Saturate + SMPTypeCategory[STARS_NN_vphaddw] = 14; // Packed Horizontal Add Word + SMPTypeCategory[STARS_NN_vphminposuw] = 14; // Packed Horizontal Word Minimum + SMPTypeCategory[STARS_NN_vphsubd] = 14; // Packed Horizontal Subtract Doubleword + SMPTypeCategory[STARS_NN_vphsubsw] = 14; // Packed Horizontal Subtract and Saturate + SMPTypeCategory[STARS_NN_vphsubw] = 14; // Packed Horizontal Subtract Word + SMPTypeCategory[STARS_NN_vpinsrb] = 14; // Insert Byte + SMPTypeCategory[STARS_NN_vpinsrd] = 14; // Insert Dword + SMPTypeCategory[STARS_NN_vpinsrq] = 14; // Insert Qword + SMPTypeCategory[STARS_NN_vpinsrw] = 14; // Insert Word + SMPTypeCategory[STARS_NN_vpmaddubsw] = 14; // Multiply and Add Packed Signed and Unsigned Bytes + SMPTypeCategory[STARS_NN_vpmaddwd] = 14; // Packed Multiply and Add + SMPTypeCategory[STARS_NN_vpmaskmovd] = 15; // Conditionally Store Dword Values Using Mask + SMPTypeCategory[STARS_NN_vpmaskmovq] = 15; // Conditionally Store Qword Values Using Mask + SMPTypeCategory[STARS_NN_vpmaxsb] = 14; // Maximum of Packed Signed Byte Integers + SMPTypeCategory[STARS_NN_vpmaxsd] = 14; // Maximum of Packed Signed Dword Integers + SMPTypeCategory[STARS_NN_vpmaxsw] = 14; // Packed Signed Integer Word Maximum + SMPTypeCategory[STARS_NN_vpmaxub] = 14; // Packed Unsigned Integer Byte Maximum + SMPTypeCategory[STARS_NN_vpmaxud] = 14; // Maximum of Packed Unsigned Dword Integers + SMPTypeCategory[STARS_NN_vpmaxuw] = 14; // Maximum of Packed Word Integers + SMPTypeCategory[STARS_NN_vpminsb] = 14; // Minimum of Packed Signed Byte Integers + SMPTypeCategory[STARS_NN_vpminsd] = 14; // Minimum of Packed Signed Dword Integers + SMPTypeCategory[STARS_NN_vpminsw] = 14; // Packed Signed Integer Word Minimum + SMPTypeCategory[STARS_NN_vpminub] = 14; // Packed Unsigned Integer Byte Minimum + SMPTypeCategory[STARS_NN_vpminud] = 14; // Minimum of Packed Unsigned Dword Integers + SMPTypeCategory[STARS_NN_vpminuw] = 14; // Minimum of Packed Word Integers + SMPTypeCategory[STARS_NN_vpmovmskb] = 15; // Move Byte Mask to Integer + SMPTypeCategory[STARS_NN_vpmovsxbd] = 15; // Packed Move with Sign Extend + SMPTypeCategory[STARS_NN_vpmovsxbq] = 15; // Packed Move with Sign Extend + SMPTypeCategory[STARS_NN_vpmovsxbw] = 15; // Packed Move with Sign Extend + SMPTypeCategory[STARS_NN_vpmovsxdq] = 15; // Packed Move with Sign Extend + SMPTypeCategory[STARS_NN_vpmovsxwd] = 15; // Packed Move with Sign Extend + SMPTypeCategory[STARS_NN_vpmovsxwq] = 15; // Packed Move with Sign Extend + SMPTypeCategory[STARS_NN_vpmovzxbd] = 15; // Packed Move with Zero Extend + SMPTypeCategory[STARS_NN_vpmovzxbq] = 15; // Packed Move with Zero Extend + SMPTypeCategory[STARS_NN_vpmovzxbw] = 15; // Packed Move with Zero Extend + SMPTypeCategory[STARS_NN_vpmovzxdq] = 15; // Packed Move with Zero Extend + SMPTypeCategory[STARS_NN_vpmovzxwd] = 15; // Packed Move with Zero Extend + SMPTypeCategory[STARS_NN_vpmovzxwq] = 15; // Packed Move with Zero Extend + SMPTypeCategory[STARS_NN_vpmuldq] = 14; // Multiply Packed Signed Dword Integers + SMPTypeCategory[STARS_NN_vpmulhrsw] = 14; // Packed Multiply High with Round and Scale + SMPTypeCategory[STARS_NN_vpmulhuw] = 14; // Packed Multiply High Unsigned + SMPTypeCategory[STARS_NN_vpmulhw] = 14; // Packed Multiply High + SMPTypeCategory[STARS_NN_vpmulld] = 14; // Multiply Packed Signed Dword Integers and Store Low Result + SMPTypeCategory[STARS_NN_vpmullw] = 14; // Packed Multiply Low + SMPTypeCategory[STARS_NN_vpmuludq] = 14; // Multiply Packed Unsigned Doubleword Integers + SMPTypeCategory[STARS_NN_vpor] = 14; // Bitwise Logical Or + SMPTypeCategory[STARS_NN_vpsadbw] = 14; // Packed Sum of Absolute Differences + SMPTypeCategory[STARS_NN_vpshufb] = 14; // Packed Shuffle Bytes + SMPTypeCategory[STARS_NN_vpshufd] = 14; // Shuffle Packed Doublewords + SMPTypeCategory[STARS_NN_vpshufhw] = 14; // Shuffle Packed High Words + SMPTypeCategory[STARS_NN_vpshuflw] = 14; // Shuffle Packed Low Words + SMPTypeCategory[STARS_NN_vpsignb] = 14; // Packed SIGN Byte + SMPTypeCategory[STARS_NN_vpsignd] = 14; // Packed SIGN Doubleword + SMPTypeCategory[STARS_NN_vpsignw] = 14; // Packed SIGN Word + SMPTypeCategory[STARS_NN_vpslld] = 14; // Packed Shift Left Logical (Dword) + SMPTypeCategory[STARS_NN_vpslldq] = 14; // Shift Double Quadword Left Logical + SMPTypeCategory[STARS_NN_vpsllq] = 14; // Packed Shift Left Logical (Qword) + SMPTypeCategory[STARS_NN_vpsllvd] = 14; // Variable Bit Shift Left Logical (Dword) + SMPTypeCategory[STARS_NN_vpsllvq] = 14; // Variable Bit Shift Left Logical (Qword) + SMPTypeCategory[STARS_NN_vpsllw] = 14; // Packed Shift Left Logical (Word) + SMPTypeCategory[STARS_NN_vpsrad] = 14; // Packed Shift Right Arithmetic (Dword) + SMPTypeCategory[STARS_NN_vpsravd] = 14; // Variable Bit Shift Right Arithmetic + SMPTypeCategory[STARS_NN_vpsraw] = 14; // Packed Shift Right Arithmetic (Word) + SMPTypeCategory[STARS_NN_vpsrld] = 14; // Packed Shift Right Logical (Dword) + SMPTypeCategory[STARS_NN_vpsrldq] = 14; // Shift Double Quadword Right Logical (Qword) + SMPTypeCategory[STARS_NN_vpsrlq] = 14; // Packed Shift Right Logical (Qword) + SMPTypeCategory[STARS_NN_vpsrlvd] = 14; // Variable Bit Shift Right Logical (Dword) + SMPTypeCategory[STARS_NN_vpsrlvq] = 14; // Variable Bit Shift Right Logical (Qword) + SMPTypeCategory[STARS_NN_vpsrlw] = 14; // Packed Shift Right Logical (Word) + SMPTypeCategory[STARS_NN_vpsubb] = 14; // Packed Subtract Byte + SMPTypeCategory[STARS_NN_vpsubd] = 14; // Packed Subtract Dword + SMPTypeCategory[STARS_NN_vpsubq] = 14; // Subtract Packed Quadword Integers + SMPTypeCategory[STARS_NN_vpsubsb] = 14; // Packed Subtract with Saturation (Byte) + SMPTypeCategory[STARS_NN_vpsubsw] = 14; // Packed Subtract with Saturation (Word) + SMPTypeCategory[STARS_NN_vpsubusb] = 14; // Packed Subtract Unsigned with Saturation (Byte) + SMPTypeCategory[STARS_NN_vpsubusw] = 14; // Packed Subtract Unsigned with Saturation (Word) + SMPTypeCategory[STARS_NN_vpsubw] = 14; // Packed Subtract Word + SMPTypeCategory[STARS_NN_vptest] = 14; // Logical Compare + SMPTypeCategory[STARS_NN_vpunpckhbw] = 14; // Unpack High Packed Data (Byte->Word) + SMPTypeCategory[STARS_NN_vpunpckhdq] = 14; // Unpack High Packed Data (Dword->Qword) + SMPTypeCategory[STARS_NN_vpunpckhqdq] = 14; // Unpack High Packed Data (Qword->Xmmword) + SMPTypeCategory[STARS_NN_vpunpckhwd] = 14; // Unpack High Packed Data (Word->Dword) + SMPTypeCategory[STARS_NN_vpunpcklbw] = 14; // Unpack Low Packed Data (Byte->Word) + SMPTypeCategory[STARS_NN_vpunpckldq] = 14; // Unpack Low Packed Data (Dword->Qword) + SMPTypeCategory[STARS_NN_vpunpcklqdq] = 14; // Unpack Low Packed Data (Qword->Xmmword) + SMPTypeCategory[STARS_NN_vpunpcklwd] = 14; // Unpack Low Packed Data (Word->Dword) + SMPTypeCategory[STARS_NN_vpxor] = 14; // Bitwise Logical Exclusive Or + SMPTypeCategory[STARS_NN_vrcpps] = 14; // Packed Single-FP Reciprocal + SMPTypeCategory[STARS_NN_vrcpss] = 14; // Scalar Single-FP Reciprocal + SMPTypeCategory[STARS_NN_vroundpd] = 14; // Round Packed Double Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vroundps] = 14; // Round Packed Single Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vroundsd] = 14; // Round Scalar Double Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vroundss] = 14; // Round Scalar Single Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vrsqrtps] = 14; // Packed Single-FP Square Root Reciprocal + SMPTypeCategory[STARS_NN_vrsqrtss] = 14; // Scalar Single-FP Square Root Reciprocal + SMPTypeCategory[STARS_NN_vshufpd] = 14; // Shuffle Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vshufps] = 14; // Shuffle Single-FP + SMPTypeCategory[STARS_NN_vsqrtpd] = 14; // Compute Square Roots of Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vsqrtps] = 14; // Packed Single-FP Square Root + SMPTypeCategory[STARS_NN_vsqrtsd] = 14; // Compute Square Rootof Scalar Double-Precision Floating-Point Value + SMPTypeCategory[STARS_NN_vsqrtss] = 14; // Scalar Single-FP Square Root + SMPTypeCategory[STARS_NN_vstmxcsr] = 14; // Store Streaming SIMD Extensions Technology Control/Status Register + SMPTypeCategory[STARS_NN_vsubpd] = 14; // Subtract Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vsubps] = 14; // Packed Single-FP Subtract + SMPTypeCategory[STARS_NN_vsubsd] = 14; // Subtract Scalar Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vsubss] = 14; // Scalar Single-FP Subtract + SMPTypeCategory[STARS_NN_vtestpd] = 14; // Packed Double-Precision Floating-Point Bit Test + SMPTypeCategory[STARS_NN_vtestps] = 14; // Packed Single-Precision Floating-Point Bit Test + SMPTypeCategory[STARS_NN_vucomisd] = 14; // Unordered Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS + SMPTypeCategory[STARS_NN_vucomiss] = 14; // Scalar Unordered Single-FP Compare and Set EFLAGS + SMPTypeCategory[STARS_NN_vunpckhpd] = 14; // Unpack and Interleave High Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vunpckhps] = 14; // Unpack High Packed Single-FP Data + SMPTypeCategory[STARS_NN_vunpcklpd] = 14; // Unpack and Interleave Low Packed Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vunpcklps] = 14; // Unpack Low Packed Single-FP Data + SMPTypeCategory[STARS_NN_vxorpd] = 14; // Bitwise Logical OR of Double-Precision Floating-Point Values + SMPTypeCategory[STARS_NN_vxorps] = 14; // Bitwise Logical XOR for Single-FP Data + SMPTypeCategory[STARS_NN_vzeroall] = 14; // Zero All YMM Registers + SMPTypeCategory[STARS_NN_vzeroupper] = 14; // Zero Upper Bits of YMM Registers + + // Transactional Synchronization Extensions + + SMPTypeCategory[STARS_NN_xabort] = 1; // Transaction Abort + SMPTypeCategory[STARS_NN_xbegin] = 1; // Transaction Begin + SMPTypeCategory[STARS_NN_xend] = 1; // Transaction End + SMPTypeCategory[STARS_NN_xtest] = 1; // Test If In Transactional Execution + + // Virtual PC synthetic instructions + + SMPTypeCategory[STARS_NN_vmgetinfo] = 1; // Virtual PC - Get VM Information + SMPTypeCategory[STARS_NN_vmsetinfo] = 1; // Virtual PC - Set VM Information + SMPTypeCategory[STARS_NN_vmdxdsbl] = 1; // Virtual PC - Disable Direct Execution + SMPTypeCategory[STARS_NN_vmdxenbl] = 1; // Virtual PC - Enable Direct Execution + SMPTypeCategory[STARS_NN_vmcpuid] = 1; // Virtual PC - Virtualized CPU Information + SMPTypeCategory[STARS_NN_vmhlt] = 1; // Virtual PC - Halt + SMPTypeCategory[STARS_NN_vmsplaf] = 1; // Virtual PC - Spin Lock Acquisition Failed + SMPTypeCategory[STARS_NN_vmpushfd] = 1; // Virtual PC - Push virtualized flags register + SMPTypeCategory[STARS_NN_vmpopfd] = 1; // Virtual PC - Pop virtualized flags register + SMPTypeCategory[STARS_NN_vmcli] = 1; // Virtual PC - Clear Interrupt Flag + SMPTypeCategory[STARS_NN_vmsti] = 1; // Virtual PC - Set Interrupt Flag + SMPTypeCategory[STARS_NN_vmiretd] = 1; // Virtual PC - Return From Interrupt + SMPTypeCategory[STARS_NN_vmsgdt] = 1; // Virtual PC - Store Global Descriptor Table + SMPTypeCategory[STARS_NN_vmsidt] = 1; // Virtual PC - Store Interrupt Descriptor Table + SMPTypeCategory[STARS_NN_vmsldt] = 1; // Virtual PC - Store Local Descriptor Table + SMPTypeCategory[STARS_NN_vmstr] = 1; // Virtual PC - Store Task Register + SMPTypeCategory[STARS_NN_vmsdte] = 1; // Virtual PC - Store to Descriptor Table Entry + SMPTypeCategory[STARS_NN_vpcext] = 1; // Virtual PC - ISA extension + +#endif // 599 < IDA_SDK_VERSION + + SMPTypeCategory[STARS_NN_last] = 1; + + return; + +} // end of STARS_Program_t::InitTypeCategory() + + diff --git a/src/interfaces/idapro/Makefile.in b/src/interfaces/idapro/Makefile.in index d57b178d..4c02e581 100644 --- a/src/interfaces/idapro/Makefile.in +++ b/src/interfaces/idapro/Makefile.in @@ -1,5 +1,5 @@ -OBJS=STARSFunction.o STARSInterface.o STARSIDAInstruction.o STARSIDAOp.o +OBJS=STARSIDAProgram.o STARSFunction.o STARSInterface.o STARSIDAInstruction.o STARSIDAOp.o CXX=@CXX@ LD=@LD@ EXTRA_CXXFLAGS=@EXTRA_CXXFLAGS@ diff --git a/src/interfaces/idapro/STARSFunction.cpp b/src/interfaces/idapro/STARSFunction.cpp index c08914f4..965b5be9 100644 --- a/src/interfaces/idapro/STARSFunction.cpp +++ b/src/interfaces/idapro/STARSFunction.cpp @@ -9,7 +9,6 @@ #include "base/SMPBasicBlock.h" #include "base/SMPFunction.h" #include "base/SMPProgram.h" -#include "base/SMPStaticAnalyzer.h" using namespace std; @@ -244,7 +243,7 @@ void STARS_IDA_Function_t::BuildFuncIR(SMPFunction *func) for (bool ok = xrefs.SMP_first_from(addr, XREF_ALL); ok; ok = xrefs.SMP_next_from()) { if ((xrefs.GetTo() != 0) && (!xrefs.GetIscode())) { // Found a code target, with its address in xrefs.to - PrintDataToCodeXref(addr, xrefs.GetTo(), 0); + global_STARS_program->PrintDataToCodeXref(addr, xrefs.GetTo(), 0); } } } @@ -303,7 +302,7 @@ void STARS_IDA_Function_t::BuildFuncIR(SMPFunction *func) } } else { // Data xref - PrintDataToCodeXref(FromAddr, addr, 0); + global_STARS_program->PrintDataToCodeXref(FromAddr, addr, 0); func->PossibleIndirectCallTarget = true; // Code xrefs all precede the first data xref, so // we do not need to process any more xrefs. One diff --git a/src/interfaces/idapro/STARSIDAInstruction.cpp b/src/interfaces/idapro/STARSIDAInstruction.cpp index 74f2fa66..4ff01c6b 100644 --- a/src/interfaces/idapro/STARSIDAInstruction.cpp +++ b/src/interfaces/idapro/STARSIDAInstruction.cpp @@ -6,7 +6,6 @@ // #include "interfaces/STARSTypes.h" #include "base/SMPDataFlowAnalysis.h" -#include "base/SMPStaticAnalyzer.h" #include "interfaces/SMPDBInterface.h" #include "interfaces/abstract/all.h" #include "interfaces/idapro/all.h" @@ -35,6 +34,32 @@ STARS_InstructionID_t STARS_IDA_Instruction_t::GetTargetInstructionID(void) { return STARS_InstructionID_t(TargetAddr); } +void STARS_IDA_Instruction_t::InitOperand(op_t &InitOp) const { +#if 0 + InitOp.n = 0; + InitOp.type = o_void; + InitOp.offb = 0; + InitOp.offo = 0; + InitOp.flags = 0; + InitOp.set_showed(); + // NOTE: InitOp.dtyp field is initialized in IDAP_run() to 32 or 64 bits. + InitOp.reg = R_none; + InitOp.value = 0; + InitOp.addr = 0; + InitOp.specval = 0; + InitOp.specflag1 = 0; + InitOp.specflag2 = 0; + InitOp.specflag3 = 0; + InitOp.specflag4 = 0; +#else + (void) memset(&InitOp, 0, sizeof(op_t)); + InitOp.dtyp = global_STARS_program->GetSTARS_ISA_dtyp(); + InitOp.set_showed(); +#endif + + return; +} // end of STARS_IDA_Instruction_t::InitOperand() + // Get instruction info by address from IDA Pro. bool STARS_IDA_Instruction_t::STARS_GetCmd(void) { bool success = true; @@ -75,7 +100,7 @@ bool STARS_IDA_Instruction_t::STARS_GetCmd(void) { this->STARScmd.Operands.push_back(std::make_shared<STARS_IDA_op_t>(cmd.Operands[i])); this->STARScmd.Operands[i]->SetSpecFlag4(0); #ifdef __EA64__ - if (STARS_ISA_Bitwidth == 64) { + if (global_STARS_program->GetSTARS_ISA_Bitwidth() == 64) { // Copy the cmd.rex prefix into the op_t.specflag4 field for each operand // that has a SIB byte. this->STARScmd.Operands[i]->SetSpecFlag4(this->STARScmd.rex); @@ -237,18 +262,22 @@ void STARS_IDA_Instruction_t::RemoveIDAOp1ForIMUL(void) { } STARSOpndTypePtr STARS_IDA_Instruction_t::MakeVoidOpnd(void) const { - return dynamic_pointer_cast<STARS_op_t>(std::make_shared<STARS_IDA_op_t>(InitOp)); + op_t TempOp; + this->InitOperand(TempOp); + return dynamic_pointer_cast<STARS_op_t>(std::make_shared<STARS_IDA_op_t>(TempOp)); } // end of STARS_IDA_Instruction_t::MakeVoidOpnd() STARSOpndTypePtr STARS_IDA_Instruction_t::MakeImmediateOpnd(STARS_uval_t value) const { - op_t TempOp = InitOp; + op_t TempOp; + this->InitOperand(TempOp); TempOp.type = o_imm; TempOp.value = value; return dynamic_pointer_cast<STARS_op_t>(std::make_shared<STARS_IDA_op_t>(TempOp)); } // end of STARS_IDA_Instruction_t::MakeVoidOpnd() STARSOpndTypePtr STARS_IDA_Instruction_t::MakeRegOpnd(uint16_t RegNum) const { - op_t TempOp = InitOp; + op_t TempOp; + this->InitOperand(TempOp); TempOp.type = o_reg; TempOp.dtyp = GetRegDtyp(RegNum, this->Has64BitOperands()); TempOp.reg = RegNum; @@ -256,7 +285,8 @@ STARSOpndTypePtr STARS_IDA_Instruction_t::MakeRegOpnd(uint16_t RegNum) const { } // end of STARS_IDA_Instruction_t::MakeRegOpnd() STARSOpndTypePtr STARS_IDA_Instruction_t::MakeFloatingPointRegOpnd(uint16_t RegNum) const { - op_t TempOp = InitOp; + op_t TempOp; + this->InitOperand(TempOp); TempOp.type = o_fpreg; TempOp.dtyp = GetRegDtyp(RegNum, false); TempOp.reg = RegNum; @@ -264,7 +294,8 @@ STARSOpndTypePtr STARS_IDA_Instruction_t::MakeFloatingPointRegOpnd(uint16_t RegN } // end of STARS_IDA_Instruction_t::MakeFloatingPointRegOpnd() STARSOpndTypePtr STARS_IDA_Instruction_t::MakeMMXRegOpnd(uint16_t RegNum) const { - op_t TempOp = InitOp; + op_t TempOp; + this->InitOperand(TempOp); TempOp.type = o_mmxreg; TempOp.reg = RegNum; TempOp.dtyp = GetRegDtyp(RegNum, false); @@ -272,7 +303,8 @@ STARSOpndTypePtr STARS_IDA_Instruction_t::MakeMMXRegOpnd(uint16_t RegNum) const } // end of STARS_IDA_Instruction_t::MakeMMXRegOpnd() STARSOpndTypePtr STARS_IDA_Instruction_t::MakeXMMRegOpnd(uint16_t RegNum) const { - op_t TempOp = InitOp; + op_t TempOp; + this->InitOperand(TempOp); TempOp.type = o_xmmreg; TempOp.reg = RegNum; TempOp.dtyp = GetRegDtyp(RegNum, false); @@ -280,7 +312,8 @@ STARSOpndTypePtr STARS_IDA_Instruction_t::MakeXMMRegOpnd(uint16_t RegNum) const } // end of STARS_IDA_Instruction_t::MakeXMMRegOpnd() STARSOpndTypePtr STARS_IDA_Instruction_t::MakeYMMRegOpnd(uint16_t RegNum) const { - op_t TempOp = InitOp; + op_t TempOp; + this->InitOperand(TempOp); TempOp.type = o_ymmreg; TempOp.reg = RegNum; TempOp.dtyp = GetRegDtyp(RegNum, false); @@ -289,7 +322,8 @@ STARSOpndTypePtr STARS_IDA_Instruction_t::MakeYMMRegOpnd(uint16_t RegNum) const STARSOpndTypePtr STARS_IDA_Instruction_t::MakeMemPhraseOpnd(uint16_t BaseRegNum, uint16_t IndexRegNum, uint16_t ScaleFactor) const { // TODO: Construct SIB byte when IndexRegNum is used. - op_t TempOp = InitOp; + op_t TempOp; + this->InitOperand(TempOp); TempOp.type = o_phrase; TempOp.reg = BaseRegNum; TempOp.dtyp = GetRegDtyp(BaseRegNum, this->Has64BitOperands()); @@ -298,7 +332,8 @@ STARSOpndTypePtr STARS_IDA_Instruction_t::MakeMemPhraseOpnd(uint16_t BaseRegNum, STARSOpndTypePtr STARS_IDA_Instruction_t::MakeMemDisplacementOpnd(uint16_t BaseRegNum, uint16_t IndexRegNum, uint16_t ScaleFactor, STARS_ea_t offset) const { // TODO: Construct SIB byte when IndexRegNum is used. - op_t TempOp = InitOp; + op_t TempOp; + this->InitOperand(TempOp); TempOp.type = o_displ; TempOp.reg = BaseRegNum; TempOp.addr = (ea_t) offset; diff --git a/src/interfaces/idapro/STARSIDAOp.cpp b/src/interfaces/idapro/STARSIDAOp.cpp index ff9cea20..1a0ba2fa 100644 --- a/src/interfaces/idapro/STARSIDAOp.cpp +++ b/src/interfaces/idapro/STARSIDAOp.cpp @@ -6,7 +6,6 @@ using namespace std; // #include "interfaces/STARSTypes.h" #include "base/SMPDataFlowAnalysis.h" -#include "base/SMPStaticAnalyzer.h" #include "interfaces/SMPDBInterface.h" #include "interfaces/abstract/all.h" #include "interfaces/idapro/all.h" @@ -14,7 +13,7 @@ using namespace std; // Constructors STARS_IDA_op_t::STARS_IDA_op_t(op_t IDAOp) : m_Opnd(IDAOp) { if ((this->m_Opnd.dtyp == ((char)-1)) && (this->m_Opnd.type != o_imm)) { - this->m_Opnd.dtyp = STARS_ISA_dtyp; + this->m_Opnd.dtyp = global_STARS_program->GetSTARS_ISA_dtyp(); } }; @@ -24,29 +23,6 @@ STARSOpndTypePtr STARS_IDA_op_t::clone(void) const { return std::dynamic_pointer_cast<STARS_op_t>(TempOpPtr); } // end of STARS_IDA_op_t::clone() -#if 0 -// Clone only if subword register. -STARSOpndTypePtr STARS_IDA_op_t::CloneIfSubwordReg(void) const { - if (this->IsRegOp() && ((this->m_Opnd.reg >= FIRST_X86_SUBWORD_REG) && (this->m_Opnd.reg <= LAST_X86_SUBWORD_REG))) { - return this->clone(); - } - else { - return STARS_op_t::shared_from_this(); - } -} - -// Clone operands that will be changed (e.g. normalized) later. -// Otherwise, just return the shared_ptr. -STARSOpndTypePtr STARS_IDA_op_t::CloneIfNecessary(bool UseFP) const { - if (MDIsStackAccessOpnd(this, UseFP)) { - return this->clone(); - } - else { - return this->CloneIfSubwordReg(); - } -} // end of STARS_IDA_op_t::CloneIfNecessary() -#endif - // Less-than operator for use in STL ordered containers, e.g. sets. bool STARS_IDA_op_t::operator<(const STARS_op_t &rOp) const { unsigned char Type1 = this->GetOpType(); @@ -151,7 +127,7 @@ uint16_t STARS_IDA_op_t::GetByteWidth(void) const { break; default: SMP_msg("ERROR: unexpected data type %d in STARS_IDA_op_t::GetByteWidth() \n", OpDtyp); - DataSize = (uint16_t) STARS_ISA_dtyp; + DataSize = (uint16_t) global_STARS_program->GetSTARS_ISA_dtyp(); break; } return DataSize; @@ -194,7 +170,7 @@ void STARS_IDA_op_t::DoubleRegWidth(void) { } // end of STARS_IDA_op_t::DoubleRegWidth() // Set STARS SSA name index into three unused bytes of the op_t structure. -void STARS_IDA_op_t::SetOpGlobalIndex(size_t index) { +void STARS_IDA_op_t::SetOpGlobalIndex(std::size_t index) { this->m_Opnd.n = (char)(index & 0x000000ff); this->m_Opnd.offb = (char)((index & 0x0000ff00) >> 8); this->m_Opnd.offo = (char)((index & 0x00ff0000) >> 16); diff --git a/src/interfaces/idapro/STARSIDAProgram.cpp b/src/interfaces/idapro/STARSIDAProgram.cpp new file mode 100644 index 00000000..706f8c08 --- /dev/null +++ b/src/interfaces/idapro/STARSIDAProgram.cpp @@ -0,0 +1,136 @@ + +#include <cstdint> +#include <cstdio> + +#include <fpro.h> +#include <ua.hpp> +#include <kernwin.hpp> +#include <nalt.hpp> +#include <intel.hpp> + +#include "interfaces/STARSTypes.h" +#include "interfaces/SMPDBInterface.h" +#include "interfaces/idapro/STARSProgram.h" + +using namespace std; + +// Limit on bytes of code for full analysis +#define STARS_CODESIZE_FULL_ANALYSIS_LIMIT 8000000 + +// Set internal state to handle a 32-bit binary +void STARS_IDA_Program_t::Set32BitBinary(void) { + STARS_Program_t::SetBitwidth32(); + this->STARS_ISA_dtyp = dt_dword; + this->STARS_MD_LAST_SAVED_REG_NUM = R_di; + return; +} + +// Set internal state to handle a 64-bit binary +void STARS_IDA_Program_t::Set64BitBinary(void) { + STARS_Program_t::SetBitwidth64(); + this->STARS_ISA_dtyp = dt_qword; + this->STARS_MD_LAST_SAVED_REG_NUM = R_r15; + return; +} + +// Set flags, take actions based on code size. +void STARS_IDA_Program_t::ReportTotalCodeSize(unsigned long long TotalCodeSize) { + this->SetTotalCodeSize(TotalCodeSize); + this->SetReducedProcessingFlag(TotalCodeSize > STARS_CODESIZE_FULL_ANALYSIS_LIMIT); + return; +} + +bool STARS_IDA_Program_t::OpenFiles(void) { + // Open all the common files via the base class. + return STARS_Program_t::OpenFiles(); +} // end of STARS_IDA_Program_t::OpenFiles() + +void STARS_IDA_Program_t::CloseFiles(void) { + // Close all the common files via the base class. + STARS_Program_t::CloseFiles(); + return; +} // end of STARS_IDA_Program_t::CloseFiles() + +void STARS_IDA_Program_t::InitData(void) { + SMP_msg("INFO: Reach STARS_IDA_Program_t::InitData method.\n"); + + this->MDInitializeArgumentRegs(); + this->MDInitializeCallerSavedRegs(); + + // Init everything else through the base class. + STARS_Program_t::InitData(); + + // Record the start and end addresses for all function entry + // chunks in the program. + this->FuncBounds.reserve(10 + SMP_get_func_qty()); + for (std::size_t FuncIndex = 0; FuncIndex < SMP_get_func_qty(); ++FuncIndex) { + STARS_Function_t *FuncInfo = SMP_getn_func(FuncIndex); + SMP_bounds_t temp; + temp.startEA = FuncInfo->get_startEA(); + temp.endEA = FuncInfo->get_endEA(); + FuncBounds.push_back(temp); + } + + return; +} // end of STARS_IDA_Program_t::InitData() + +void STARS_IDA_Program_t::DetermineRootFileName(void) { + SMP_msg("INFO: Reached DetermineRootFileName method.\n"); + // Get the root file name from IDA Pro, e.g. "foo" when analyzing "foo.exe" + char TempRootName[STARS_MAXSTR]; + STARS_ssize_t FileLen = ::get_root_filename(TempRootName, sizeof(TempRootName)-1); + string TempRootString(TempRootName); + this->SetRootFileName(TempRootString); + return; +} + +void STARS_IDA_Program_t::MDInitializeCallerSavedRegs(void) { + this->STARS_MDCallerSavedRegs.clear(); + bool x86_64_ISA_flag = false; +#ifdef __EA64__ + x86_64_ISA_flag = (this->GetSTARS_ISA_Bitwidth() == 64); +#endif + if (!x86_64_ISA_flag) { + // 32-bit x86 uses EAX, ECX, EDX as caller-saved. + this->STARS_MDCallerSavedRegs.push_back(R_ax); + this->STARS_MDCallerSavedRegs.push_back(R_cx); + this->STARS_MDCallerSavedRegs.push_back(R_dx); + } + else { + // 64-bit x86 uses EDI, ESI, EDX, ECX, R8 and R9 + // in that order. After six arguments that fit into + // these regs, arguments are passed on the stack. + // In addition, registers EAX, R10 and R11 are caller-saved + // but are not used to pass arguments. + this->STARS_MDCallerSavedRegs.push_back(R_ax); + this->STARS_MDCallerSavedRegs.push_back(R_cx); + this->STARS_MDCallerSavedRegs.push_back(R_dx); + this->STARS_MDCallerSavedRegs.push_back(R_si); + this->STARS_MDCallerSavedRegs.push_back(R_di); + this->STARS_MDCallerSavedRegs.push_back(R_r8); + this->STARS_MDCallerSavedRegs.push_back(R_r9); + this->STARS_MDCallerSavedRegs.push_back(R_r10); + this->STARS_MDCallerSavedRegs.push_back(R_r11); + } + return; +} // end of STARS_IDA_Program_t::MDInitializeCallerSavedRegs() + +void STARS_IDA_Program_t::MDInitializeArgumentRegs(void) { + bool x86_64_ISA_flag = false; +#ifdef __EA64__ + x86_64_ISA_flag = (this->GetSTARS_ISA_Bitwidth() == 64); +#endif + if (x86_64_ISA_flag) { + this->STARS_MDArgumentRegs.push_back(R_di); + this->STARS_MDArgumentRegs.push_back(R_si); + this->STARS_MDArgumentRegs.push_back(R_dx); + this->STARS_MDArgumentRegs.push_back(R_cx); + this->STARS_MDArgumentRegs.push_back(R_r8); + this->STARS_MDArgumentRegs.push_back(R_r9); + } + else { + this->STARS_MDArgumentRegs.clear(); + } + return; +} // end of STARS_IDA_Program_t::MDInitializeArgumentRegs() + diff --git a/src/interfaces/idapro/STARSInterface.cpp b/src/interfaces/idapro/STARSInterface.cpp index 6f90847d..c6824dd7 100644 --- a/src/interfaces/idapro/STARSInterface.cpp +++ b/src/interfaces/idapro/STARSInterface.cpp @@ -7,7 +7,6 @@ #include "base/SMPBasicBlock.h" #include "base/SMPFunction.h" #include "base/SMPProgram.h" -#include "base/SMPStaticAnalyzer.h" using namespace std; @@ -76,8 +75,8 @@ void STARS_IDA_Interface_t::AuditTailChunkOwnership(void) SMP_msg("Finding parent func candidates for %x:", ChunkInfo->startEA); #endif SMP_bounds_t CurrFunc; - for (std::size_t FuncIndex = 0; FuncIndex < FuncBounds.size(); ++FuncIndex) { - CurrFunc = FuncBounds[FuncIndex]; + for (std::size_t FuncIndex = 0; FuncIndex < global_STARS_program->GetFuncBoundsSize(); ++FuncIndex) { + CurrFunc = global_STARS_program->GetFuncBounds(FuncIndex); if ((CurrFunc.startEA < ChunkInfo->startEA) && (CurrFunc.startEA > BestCandidate)) { BestCandidate = CurrFunc.startEA; @@ -135,7 +134,7 @@ static STARS_ea_t FindNewFuncLimit(STARS_ea_t StartAddr) return LimitAddr; STARS_ea_t SegLimit = seg->get_endEA(); - for (STARS_ea_t addr = get_item_end(StartAddr); addr < SegLimit; addr = get_item_end(addr)) { + for (STARS_ea_t addr = SMP_get_item_end(StartAddr); addr < SegLimit; addr = SMP_get_item_end(addr)) { flags_t InstrFlags = getFlags(addr); if (isCode(InstrFlags) && isHead(InstrFlags)) { LimitAddr = addr; @@ -218,7 +217,7 @@ void STARS_IDA_Interface_t::AuditCodeTargets(void) // IDA database. If it is a branch target, not a call target, // create a new TAIL chunk for the current parent functions. for (STARS_ea_t addr = ChunkInfo->startEA; addr < ChunkInfo->endEA; - addr = get_item_end(addr)) { + addr = SMP_get_item_end(addr)) { flags_t InstrFlags = getFlags(addr); if (isCode(InstrFlags) && isHead(InstrFlags)) { SMPInstr CurrInst(addr); -- GitLab