/* STARSProgram.cpp: Base class
 * Copyright 2015 by Zephyr Software LLC 
 */

#include <cstring>
#include <algorithm>
#include <iostream>
#include <sstream>

#include "interfaces/STARSTypes.h"
#include "interfaces/SMPDBInterface.h"
// #include "interfaces/abstract/all.h"
#include "base/SMPDataFlowAnalysis.h"
#include "base/SMPProgram.h"

using namespace std;

// Data initialization


void STARS_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(STARS_x86_R_ax);
		this->STARS_MDCallerSavedRegs.push_back(STARS_x86_R_cx);
		this->STARS_MDCallerSavedRegs.push_back(STARS_x86_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(STARS_x86_R_ax);
		this->STARS_MDCallerSavedRegs.push_back(STARS_x86_R_cx);
		this->STARS_MDCallerSavedRegs.push_back(STARS_x86_R_dx);
		this->STARS_MDCallerSavedRegs.push_back(STARS_x86_R_si);
		this->STARS_MDCallerSavedRegs.push_back(STARS_x86_R_di);
		this->STARS_MDCallerSavedRegs.push_back(STARS_x86_R_r8);
		this->STARS_MDCallerSavedRegs.push_back(STARS_x86_R_r9);
		this->STARS_MDCallerSavedRegs.push_back(STARS_x86_R_r10);
		this->STARS_MDCallerSavedRegs.push_back(STARS_x86_R_r11);
	}
	return;
} // end of STARS_IDA_Program_t::MDInitializeCallerSavedRegs()

void STARS_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(STARS_x86_R_di);
		this->STARS_MDArgumentRegs.push_back(STARS_x86_R_si);
		this->STARS_MDArgumentRegs.push_back(STARS_x86_R_dx);
		this->STARS_MDArgumentRegs.push_back(STARS_x86_R_cx);
		this->STARS_MDArgumentRegs.push_back(STARS_x86_R_r8);
		this->STARS_MDArgumentRegs.push_back(STARS_x86_R_r9);
	}
	else {
		this->STARS_MDArgumentRegs.clear();
	}
	return;
} // end of STARS_IDA_Program_t::MDInitializeArgumentRegs()

void STARS_Program_t::MDInitializeCalleeSavedRegs(void) {
	this->STARS_MDCalleeSavedRegs.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, EBX, EBP, ESI, EDI as callee-saved.
		this->STARS_MDCalleeSavedRegs.push_back(STARS_x86_R_bx);
		this->STARS_MDCalleeSavedRegs.push_back(STARS_x86_R_bp);
		this->STARS_MDCalleeSavedRegs.push_back(STARS_x86_R_si);
		this->STARS_MDCalleeSavedRegs.push_back(STARS_x86_R_di);
	}
	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. The rest, besides RSP,
		//  are callee-saved.
		this->STARS_MDCalleeSavedRegs.push_back(STARS_x86_R_bx);
		this->STARS_MDCalleeSavedRegs.push_back(STARS_x86_R_bp);
		this->STARS_MDCalleeSavedRegs.push_back(STARS_x86_R_r12);
		this->STARS_MDCalleeSavedRegs.push_back(STARS_x86_R_r13);
		this->STARS_MDCalleeSavedRegs.push_back(STARS_x86_R_r14);
		this->STARS_MDCalleeSavedRegs.push_back(STARS_x86_R_r15);
	}
	return;
} // end of STARS_IDA_Program_t::MDInitializeCalleeSavedRegs()

bool STARS_Program_t::OpenFiles(void) {
	// Open the output files.
	bool success = this->OpenSecondaryFilesOnly();
	if (success) {
		this->STARS_AnnotFile = SMP_fopen(this->AnnotFileName.c_str(), "w");
		if (NULL == this->STARS_AnnotFile) {
			SMP_msg("FATAL ERROR: Cannot open annotations file %s\n", this->AnnotFileName.c_str());
			(void)SMP_fclose(this->STARS_XrefsFile);
			(void)SMP_fclose(this->STARS_CallReturnFile);
			(void)SMP_fclose(this->STARS_UninitVarFile);
			(void)SMP_fclose(this->ZST_AlarmFile);
			(void)SMP_fclose(this->STARS_InfoAnnotFile);
			if (global_STARS_program->ShouldSTARSTranslateToSPARKAda()) {
				(void)SMP_fclose(this->ZST_SPARKHeaderFile);
				(void)SMP_fclose(this->ZST_SPARKSourceFile);
			}
			success = false;
		}
	}

	return success;
} // end of STARS_Program_t::OpenFiles()

bool STARS_Program_t::OpenMainAnnotationFile(void) {
	bool success = true;
	this->STARS_AnnotFile = SMP_fopen(this->AnnotFileName.c_str(), "w");
	if (NULL == this->STARS_AnnotFile) {
		SMP_msg("FATAL ERROR: Cannot open annotations file %s\n", this->AnnotFileName.c_str());
		success = false;
	}
	return success;
} // end of STARS_Program_t::OpenMainAnnotationFile()


bool STARS_Program_t::OpenSecondaryFilesOnly(void) {
	// Open the output files except for the main annotation file.
	assert(0 < this->RootFileName.size());  // SetRootFileName() must be called previously.

	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;
	string UninitVarFileName(this->GetRootFileName());
	string UninitVarFileSuffix(".STARSuninit");
	UninitVarFileName += UninitVarFileSuffix;
	string LoopsFileName(this->GetRootFileName());
	string LoopsFileSuffix(".STARSloops");
	LoopsFileName += LoopsFileSuffix;

	string SPARKSourceFileName("");
	string SPARKHeaderFileName("");
	if (global_STARS_program->ShouldSTARSTranslateToSPARKAda()) {
		// Extract "foo" from "foo.exe" to get the Ada package name
		istringstream StreamRootName(this->RootFileName);
		(void)std::getline(StreamRootName, this->PackageName, '.');
		if (this->PackageName.empty()) {
			SMP_msg("ERROR: Could not extract an Ada package name from the root of file name %s\n", this->RootFileName.c_str());
			return false;
		}


		// Convert dashes to underscores in the package name to suit Ada standards.
		replace(this->PackageName.begin(), this->PackageName.end(), '-', '_');

		SPARKSourceFileName += this->PackageName;
		string SPARKSourceFileSuffix(".ZSTSPARK.adb");
		SPARKSourceFileName += SPARKSourceFileSuffix;
		SPARKHeaderFileName += this->PackageName;
		string SPARKHeaderFileSuffix(".ZSTSPARK.ads");
		SPARKHeaderFileName += SPARKHeaderFileSuffix;
	}

	this->STARS_XrefsFile = SMP_fopen(XrefsFileName.c_str(), "w");
	if (NULL == this->STARS_XrefsFile) {
		SMP_msg("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) {
		SMP_msg("FATAL ERROR: Cannot open STARS calls and returns info file %s\n", CallRetFileName.c_str());
		(void)SMP_fclose(this->STARS_XrefsFile);
		return false;
	}

	this->STARS_UninitVarFile = SMP_fopen(UninitVarFileName.c_str(), "w");
	if (NULL == this->STARS_UninitVarFile) {
		SMP_msg("FATAL ERROR: Cannot open STARS uninitialized vars info file %s\n", UninitVarFileName.c_str());
		(void)SMP_fclose(this->STARS_XrefsFile);
		(void)SMP_fclose(this->STARS_CallReturnFile);
		return false;
	}

	this->ZST_AlarmFile = SMP_fopen(ZSTAlarmFileName.c_str(), "w");
	if (NULL == this->ZST_AlarmFile) {
		SMP_msg("FATAL ERROR: Cannot open security alarms file %s\n", ZSTAlarmFileName.c_str());
		(void)SMP_fclose(this->STARS_XrefsFile);
		(void)SMP_fclose(this->STARS_CallReturnFile);
		(void)SMP_fclose(this->STARS_UninitVarFile);
		return false;
	}

	this->STARS_InfoAnnotFile = SMP_fopen(this->InfoAnnotFileName.c_str(), "w");
	if (NULL == this->STARS_InfoAnnotFile) {
		SMP_msg("FATAL ERROR: Cannot open annotations file %s\n", this->InfoAnnotFileName.c_str());
		(void)SMP_fclose(this->STARS_XrefsFile);
		(void)SMP_fclose(this->STARS_CallReturnFile);
		(void)SMP_fclose(this->STARS_UninitVarFile);
		(void)SMP_fclose(this->ZST_AlarmFile);
		return false;
	}

	this->STARS_LoopsAnnotFile = SMP_fopen(LoopsFileName.c_str(), "w");
	if (NULL == this->STARS_LoopsAnnotFile) {
		SMP_msg("FATAL ERROR: Cannot open loops annotations file %s\n", LoopsFileName.c_str());
		(void)SMP_fclose(this->STARS_XrefsFile);
		(void)SMP_fclose(this->STARS_CallReturnFile);
		(void)SMP_fclose(this->STARS_UninitVarFile);
		(void)SMP_fclose(this->ZST_AlarmFile);
		(void)SMP_fclose(this->STARS_InfoAnnotFile);
		return false;
	}

	if (global_STARS_program->ShouldSTARSTranslateToSPARKAda()) {
		this->ZST_SPARKSourceFile = SMP_fopen(SPARKSourceFileName.c_str(), "w");
		if (NULL == this->ZST_SPARKSourceFile) {
			SMP_msg("FATAL ERROR: Cannot open SPARK-Ada source output file %s\n", SPARKSourceFileName.c_str());
			(void)SMP_fclose(this->STARS_XrefsFile);
			(void)SMP_fclose(this->STARS_CallReturnFile);
			(void)SMP_fclose(this->STARS_UninitVarFile);
			(void)SMP_fclose(this->ZST_AlarmFile);
			(void)SMP_fclose(this->STARS_InfoAnnotFile);
			(void)SMP_fclose(this->STARS_LoopsAnnotFile);
			return false;
		}
		this->ZST_SPARKHeaderFile = SMP_fopen(SPARKHeaderFileName.c_str(), "w");
		if (NULL == this->ZST_SPARKHeaderFile) {
			SMP_msg("FATAL ERROR: Cannot open SPARK-Ada header output file %s\n", SPARKHeaderFileName.c_str());
			(void)SMP_fclose(this->STARS_XrefsFile);
			(void)SMP_fclose(this->STARS_CallReturnFile);
			(void)SMP_fclose(this->STARS_UninitVarFile);
			(void)SMP_fclose(this->ZST_AlarmFile);
			(void)SMP_fclose(this->STARS_InfoAnnotFile);
			(void)SMP_fclose(this->STARS_LoopsAnnotFile);
			(void)SMP_fclose(this->ZST_SPARKSourceFile);
			return false;
		}
	}

	return true;

} // end of STARS_Program_t::OpenSecondaryFilesOnly()

void STARS_Program_t::CloseFiles(void) {
	(void) SMP_fclose(this->STARS_AnnotFile);
	(void) SMP_fclose(this->STARS_InfoAnnotFile);

	if (global_STARS_program->ShouldSTARSTranslateToSPARKAda()) {
		(void)SMP_fclose(this->ZST_SPARKSourceFile);
		(void)SMP_fclose(this->ZST_SPARKHeaderFile);
	}
	(void) SMP_fclose(this->ZST_AlarmFile);
	(void) SMP_fclose(this->STARS_CallReturnFile);
	(void) SMP_fclose(this->STARS_XrefsFile);
	(void) SMP_fclose(this->STARS_UninitVarFile);
	(void) SMP_fclose(this->GetLoopsAnnotFile());

	return;
} // end of STARS_Program_t::CloseFiles()

// Apply new mode to the AnnotFile.
bool STARS_Program_t::ReopenAnnotFile(const char *mode) {
	FILE *TempHandle = freopen(NULL, mode, this->GetAnnotFile());
	bool success = (NULL != TempHandle);
	if  (success) {
		this->STARS_AnnotFile = TempHandle;
	}
	return success;
}

void STARS_Program_t::InitData(void) {
	this->IDAProDriver = false;  // default; set to true explicitly from IDA Pro code.
	this->CurrentFileNumber = 0;
	this->ZST_AlarmFile = NULL;
	this->STARS_CallReturnFile = NULL;
	this->STARS_XrefsFile = NULL;

	this->MDInitializeArgumentRegs();
	this->MDInitializeCallerSavedRegs(); 
	this->MDInitializeCalleeSavedRegs();

	// 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;
	LoopInvariantDEFCount = 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;
	STARS_LoopInductionVarIDSuccesses = 0;
	STARS_LoopInductionVarIDFailures = 0;
	STARS_LoopIterationExprSuccesses = 0;
	STARS_LoopIterationExprFailures = 0;

	(void) memset(this->OptCount, 0, sizeof(this->OptCount));
	(void) memset(this->AnnotationCount, 0, sizeof(this->AnnotationCount));
	this->STARS_PerformReducedAnalysis = false;
	this->STARS_PerformLevel2ReducedAnalysis = false;
	this->STARS_PerformFuncPtrShadowing = false;
	this->STARS_PerformArgShadowing = false;
	this->STARS_PerformCFGImprovement = false;
	this->STARS_PerformDeepLoopAnalyses = false;
	this->STARS_PerformConstantPropagation = false;
	this->STARS_TranslateToSPARKAda = false;
	this->DataReferentID = 1;
	this->ShadowID = 1;
	this->ExprSerialNumber = 0;
	this->STARS_TotalCodeSize = 0;

	this->InitOptCategory();
	this->InitStackAlteration();
	this->InitDFACategory();
	this->InitTypeCategory();
	this->InitSMPDefsFlags();
	this->InitSMPUsesFlags();
	this->InitLibFuncFGInfoMaps();
	InitIntegerErrorCallSinkMap();
	InitUnsignedArgPositionMap();
	InitTaintWarningArgPositionMap();
	InitPointerArgPositionMap();
	InitLibraryFuncNames();
	this->InitDebuggingDeadregs();

	return;
} // end of STARS_Program_t::InitData()

// Initialize the DeadregsDebugBitset based on environment var STARS_DEADREGS_ONLY.
//  Initialize the DeadregsDebugLimit based on environment var STARS_DEADREGS_DEBUG_LIMIT.
void STARS_Program_t::InitDebuggingDeadregs(void) {
	char DeadregsLimitString[STARS_MAXSTR];
	if (global_stars_interface->STARS_getenv("STARS_DEADREGS_DEBUG_LIMIT", DeadregsLimitString)) {
		const char *TempPtr = (const char *)&DeadregsLimitString[0];
		this->DeadregsDebugLimit = (uint32_t)strtoul(TempPtr, nullptr, 0);
		SMP_msg("DEBUG: DEADREGS: Annotation counter limit is %lu from string %s\n", this->DeadregsDebugLimit, TempPtr);
	}
	else {
		this->DeadregsDebugLimit = UINT32_MAX - 1;
	}

	this->DeadregsAnnotCounter = 0;

	char DeadregsOnlyString[STARS_MAXSTR];
	if (global_stars_interface->STARS_getenv("STARS_DEADREGS_ONLY", DeadregsOnlyString)) {
		if (strstr(DeadregsOnlyString, "RAX") || strstr(DeadregsOnlyString, "EAX")) {
			this->DeadregsDebugBitset.set((size_t) STARS_x86_R_ax);
		}
		if (strstr(DeadregsOnlyString, "RCX") || strstr(DeadregsOnlyString, "ECX")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_cx);
		}
		if (strstr(DeadregsOnlyString, "RDX") || strstr(DeadregsOnlyString, "EDX")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_dx);
		}
		if (strstr(DeadregsOnlyString, "RBX") || strstr(DeadregsOnlyString, "EBX")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_bx);
		}
		if (strstr(DeadregsOnlyString, "RSP") || strstr(DeadregsOnlyString, "ESP")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_sp);
		}
		if (strstr(DeadregsOnlyString, "RBP") || strstr(DeadregsOnlyString, "EBP")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_bp);
		}
		if (strstr(DeadregsOnlyString, "RSI") || strstr(DeadregsOnlyString, "ESI")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_si);
		}
		if (strstr(DeadregsOnlyString, "RDI") || strstr(DeadregsOnlyString, "EDI")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_di);
		}
		if (strstr(DeadregsOnlyString, "R8")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_r8);
		}
		if (strstr(DeadregsOnlyString, "R9")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_r9);
		}
		if (strstr(DeadregsOnlyString, "R10")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_r10);
		}
		if (strstr(DeadregsOnlyString, "R11")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_r11);
		}
		if (strstr(DeadregsOnlyString, "R12")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_r12);
		}
		if (strstr(DeadregsOnlyString, "R13")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_r13);
		}
		if (strstr(DeadregsOnlyString, "R14")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_r14);
		}
		if (strstr(DeadregsOnlyString, "R15")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_r15);
		}
		if (strstr(DeadregsOnlyString, "EFLAGS")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_efl);
		}
		if (strstr(DeadregsOnlyString, "XMM0")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm0);
		}
		if (strstr(DeadregsOnlyString, "XMM1")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm1);
		}
		if (strstr(DeadregsOnlyString, "XMM2")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm2);
		}
		if (strstr(DeadregsOnlyString, "XMM3")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm3);
		}
		if (strstr(DeadregsOnlyString, "XMM4")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm4);
		}
		if (strstr(DeadregsOnlyString, "XMM5")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm5);
		}
		if (strstr(DeadregsOnlyString, "XMM6")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm6);
		}
		if (strstr(DeadregsOnlyString, "XMM7")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm7);
		}
		if (strstr(DeadregsOnlyString, "XMM8")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm8);
		}
		if (strstr(DeadregsOnlyString, "XMM9")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm9);
		}
		if (strstr(DeadregsOnlyString, "XMM10")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm10);
		}
		if (strstr(DeadregsOnlyString, "XMM11")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm11);
		}
		if (strstr(DeadregsOnlyString, "XMM12")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm12);
		}
		if (strstr(DeadregsOnlyString, "XMM13")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm13);
		}
		if (strstr(DeadregsOnlyString, "XMM14")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm14);
		}
		if (strstr(DeadregsOnlyString, "XMM15")) {
			this->DeadregsDebugBitset.set((size_t)STARS_x86_R_xmm15);
		}
	}
	return;
} // end of STARS_Program_t::InitDebuggingDeadregs()

bool STARS_Program_t::IsRegAllowedInDeadregsAnnots(const std::size_t RegNum) const {
	assert(RegNum < this->DeadregsDebugBitset.size());
	return this->DeadregsDebugBitset[RegNum];
};

// 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;
}

bool STARS_Program_t::IsCalleeSavedReg(STARS_regnum_t RegNum) const {
	bool found = false;
	std::list<STARS_regnum_t>::const_iterator CalleeSavedIter = this->STARS_MDCalleeSavedRegs.cbegin();
	while (CalleeSavedIter != this->STARS_MDCalleeSavedRegs.cend()) {
		if (*CalleeSavedIter == RegNum) {
			found = true;
			break;
		}
		++CalleeSavedIter;
	}
	return found;
}

bool STARS_Program_t::IsCallerSavedReg(STARS_regnum_t RegNum) const {
	bool found = false;
	std::list<STARS_regnum_t>::const_iterator CallerSavedIter = this->STARS_MDCallerSavedRegs.cbegin();
	while (CallerSavedIter != this->STARS_MDCallerSavedRegs.cend()) {
		if (*CallerSavedIter == RegNum) {
			found = true;
			break;
		}
		else if (*CallerSavedIter > RegNum) {
			break; // passed it in sorted list; return false
		}
		++CallerSavedIter;
	}
	return found;
}

// return true and set ArgPos if RegNum is an InArg
bool STARS_Program_t::GetArgRegPosition(STARS_regnum_t RegNum, std::size_t &ArgPos) const {
	bool found = false;
	std::list<STARS_regnum_t>::const_iterator ArgRegsIter = this->STARS_MDArgumentRegs.cbegin();
	ArgPos = 0;
	while (ArgRegsIter != this->STARS_MDArgumentRegs.cend()) {
		if (*ArgRegsIter == RegNum) {
			found = true;
			break;
		}
		++ArgRegsIter;
		++ArgPos;
	}
	return found;
}

bool STARS_Program_t::IsArgumentReg(STARS_regnum_t RegNum) const {
	bool found = false;
	std::list<STARS_regnum_t>::const_iterator ArgRegsIter = this->STARS_MDArgumentRegs.cbegin();
	while (ArgRegsIter != this->STARS_MDArgumentRegs.cend()) {
		if (*ArgRegsIter == RegNum) {
			found = true;
			break;
		}
		++ArgRegsIter;
	}
	return found;
}

bool STARS_Program_t::AreInstIDsInSameFunction(const STARS_ea_t InstID1, const STARS_ea_t InstID2) const {
	STARS_Function_t *Func1 = SMP_get_func(InstID1);
	STARS_Function_t *Func2 = SMP_get_func(InstID2);
	return ((NULL != Func1) && (NULL != Func2) && (Func1->get_startEA() == Func2->get_startEA()));
}

void STARS_Program_t::PrintTypeCode(IBType TypeCode){
	if (ZST_RETURN == TypeCode) {
		SMP_fprintf(this->GetXrefsFile(), "RETURNTARGET\n");
	}
	else if (ZST_SWITCHTABLE == TypeCode) {
		SMP_fprintf(this->GetXrefsFile(), "SWITCHTABLE\n");
	}
	else if (ZST_INDIRCALL == TypeCode) {
		SMP_fprintf(this->GetXrefsFile(), "INDIRCALL\n");
	}
	else if (ZST_COMPUTEDGOTO == TypeCode) {
		SMP_fprintf(this->GetXrefsFile(), "COMPUTEDGOTOHEURISTIC\n");
	}
	else if (ZST_CODEADDRESSTAKEN == TypeCode) {
		SMP_fprintf(this->GetXrefsFile(), "CODEADDRESSTAKEN\n");
	}
	else if (ZST_UNREACHABLEBLOCK == TypeCode) {
		SMP_fprintf(this->GetXrefsFile(), "UNREACHABLEBLOCK\n");
	}
	else {
		SMP_fprintf(this->GetXrefsFile(), "UNKNOWN\n");
	}
	return;
}


// Utility functions to print code xrefs to STARS_XrefsFile
void STARS_Program_t::PrintAddressInCode(STARS_ea_t FromAddr, STARS_ea_t ToAddr, std::size_t InstrSize, bool is_to_code)
{
	if(is_to_code)
		SMP_fprintf(this->GetXrefsFile(), "%18llx %6zu INSTR XREF TAKES_ADDRESS_OF CODE %18llx\n",
			(unsigned long long) FromAddr, InstrSize, (unsigned long long) ToAddr);
	else
		SMP_fprintf(this->GetXrefsFile(), "%18llx %6zu INSTR XREF TAKES_ADDRESS_OF DATA %18llx\n",
			(unsigned long long) FromAddr, InstrSize, (unsigned long long) ToAddr);

}

// Utility functions to print code xrefs to STARS_XrefsFile
bool STARS_Program_t::PrintCodeToCodeXref(STARS_ea_t FromAddr, STARS_ea_t ToAddr, std::size_t InstrSize, IBType TypeCode) {
	bool success = false;
	if (IsAddressInCodeRange(ToAddr)) {
		success = true;
		SMP_fprintf(this->GetXrefsFile(), "%18llx %6zu INSTR XREF IBT FROMIB %18llx ",
			(unsigned long long) ToAddr, InstrSize, (unsigned long long) FromAddr);
		this->PrintTypeCode(TypeCode);
	}
	return success;
}

// Utility functions to print code xrefs to STARS_XrefsFile
bool STARS_Program_t::PrintReturnInstXref(STARS_ea_t RetInstAddr, STARS_ea_t TargetAddr, std::size_t InstrSize, bool TailCallTargetAddr) {
	bool success = false;
	if (IsAddressInCodeRange(TargetAddr)) {
		success = true;
		FILE *XrefsFile = this->GetXrefsFile();
		SMP_fprintf(XrefsFile, "%18llx %6zu INSTR XREF IBT FROMIB %18llx ",
			(unsigned long long) TargetAddr, InstrSize, (unsigned long long) RetInstAddr);
		if (!TailCallTargetAddr) {
			SMP_fprintf(XrefsFile, "RETURNTARGET\n");
		}
		else {
			SMP_fprintf(XrefsFile, "TAILCALLRETURNTARGET\n");
		}
	}
	
	return success;
}

void STARS_Program_t::PrintDataToCodeXref(STARS_ea_t FromDataAddr, STARS_ea_t ToCodeAddr, std::size_t InstrSize) {
	if (IsAddressInCodeRange(ToCodeAddr)) {
		SMP_fprintf(this->GetXrefsFile(), "%18llx %6zu INSTR XREF IBT FROMDATA %18llx \n",
			(unsigned long long) ToCodeAddr, InstrSize, (unsigned long long) FromDataAddr);
	}
	return;
}

void STARS_Program_t::PrintUnknownCodeXref(STARS_ea_t ToAddr, std::size_t InstrSize, IBType TypeCode) {
	SMP_fprintf(this->GetXrefsFile(), "%18llx %6zu INSTR XREF IBT FROMUNKNOWN ",
		(unsigned long long) ToAddr, InstrSize);
	this->PrintTypeCode(TypeCode);
	return;
}


// Utility functions to signify code xrefs are complete in STARS_XrefsFile for FromAddr
void STARS_Program_t::PrintCodeToCodeXrefComplete(STARS_ea_t FromAddr, std::size_t InstrSize, std::size_t IBTCount, IBType TypeCode) {
	if (IsAddressInCodeRange(FromAddr)) {
		SMP_fprintf(this->GetXrefsFile(), "%18llx %6zu INSTR XREF FROMIB COMPLETE %6zu ",
			(unsigned long long) FromAddr, InstrSize, IBTCount);
		this->PrintTypeCode(TypeCode);
	}
	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 = SMP_fscanf(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

	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
#if (IDA_SDK_VERSION < 700)      // Incredibly, these opcodes were removed in IDA Pro 7.0
	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
#endif
	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

	// FMA4
	OptCategory[STARS_NN_vfmaddsubps] = 1;          // Multiply with Alternating Add/Subtract of Packed Single-Precision Floating-Point
	OptCategory[STARS_NN_vfmaddsubpd] = 1;          // Multiply with Alternating Add/Subtract of Packed Double-Precision Floating-Point
	OptCategory[STARS_NN_vfmsubaddps] = 1;          // Multiply with Alternating Subtract/Add of Packed Single-Precision Floating-Point
	OptCategory[STARS_NN_vfmsubaddpd] = 1;          // Multiply with Alternating Subtract/Add of Packed Double-Precision Floating-Point
	OptCategory[STARS_NN_vfmaddps] = 1;             // Multiply and Add Packed Single-Precision Floating-Point
	OptCategory[STARS_NN_vfmaddpd] = 1;             // Multiply and Add Packed Double-Precision Floating-Point
	OptCategory[STARS_NN_vfmaddss] = 1;             // Multiply and Add Scalar Single-Precision Floating-Point
	OptCategory[STARS_NN_vfmaddsd] = 1;             // Multiply and Add Scalar Double-Precision Floating-Point
	OptCategory[STARS_NN_vfmsubps] = 1;             // Multiply and Subtract Packed Single-Precision Floating-Point
	OptCategory[STARS_NN_vfmsubpd] = 1;             // Multiply and Subtract Packed Double-Precision Floating-Point
	OptCategory[STARS_NN_vfmsubss] = 1;             // Multiply and Subtract Scalar Single-Precision Floating-Point
	OptCategory[STARS_NN_vfmsubsd] = 1;             // Multiply and Subtract Scalar Double-Precision Floating-Point
	OptCategory[STARS_NN_vfnmaddps] = 1;            // Negative Multiply and Add Packed Single-Precision Floating-Point
	OptCategory[STARS_NN_vfnmaddpd] = 1;            // Negative Multiply and Add Packed Double-Precision Floating-Point
	OptCategory[STARS_NN_vfnmaddss] = 1;            // Negative Multiply and Add Scalar Single-Precision Floating-Point
	OptCategory[STARS_NN_vfnmaddsd] = 1;            // Negative Multiply and Add Double Single-Precision Floating-Point
	OptCategory[STARS_NN_vfnmsubps] = 1;            // Negative Multiply and Subtract Packed Single-Precision Floating-Point
	OptCategory[STARS_NN_vfnmsubpd] = 1;            // Negative Multiply and Subtract Packed Double-Precision Floating-Point
	OptCategory[STARS_NN_vfnmsubss] = 1;            // Negative Multiply and Subtract Scalar Single-Precision Floating-Point
	OptCategory[STARS_NN_vfnmsubsd] = 1;            // Negative Multiply and Subtract Double Single-Precision Floating-Point

	// Intel Memory Protection Extensions (MPX)

	OptCategory[STARS_NN_bndmk] = 1;                // Make Bounds
	OptCategory[STARS_NN_bndcl] = 1;                // Check Lower Bound
	OptCategory[STARS_NN_bndcu] = 1;                // Check Upper Bound
	OptCategory[STARS_NN_bndcn] = 1;                // Check Upper Bound
	OptCategory[STARS_NN_bndmov] = 1;               // Move Bounds
	OptCategory[STARS_NN_bndldx] = 1;               // Load Extended Bounds Using Address Translation
	OptCategory[STARS_NN_bndstx] = 1;               // Store Extended Bounds Using Address Translation

	// New xstate instructions

	OptCategory[STARS_NN_xrstors] = 1;              // Restore Processor Extended States Supervisor
	OptCategory[STARS_NN_xsavec] = 1;               // Save Processor Extended States with Compaction
	OptCategory[STARS_NN_xsaves] = 1;               // Save Processor Extended States Supervisor

	// PREFETCHWT1 support

	OptCategory[STARS_NN_prefetchwt1] = 1;          // Prefetch Vector Data Into Caches with Intent to Write and T1 Hint

	// Memory instructions

	OptCategory[STARS_NN_clflushopt] = 1;           // Flush a Cache Line Optimized
	OptCategory[STARS_NN_clwb] = 1;                 // Cache Line Write Back
	OptCategory[STARS_NN_pcommit] = 1;              // Persistent Commit (deprecated by Intel)

	// Protection Key Rights for User Pages

	OptCategory[STARS_NN_rdpkru] = 1;               // Read Protection Key Rights for User Pages
	OptCategory[STARS_NN_wrpkru] = 1;               // Write Data to User Page Key Register

	// AVX comparison pseudo-ops

	OptCategory[STARS_NN_vcmpeqpd] = 1;             // Compare Packed Double-Precision Floating-Point Values - Equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpltpd] = 1;             // Compare Packed Double-Precision Floating-Point Values - Less-than (ordered, signaling)
	OptCategory[STARS_NN_vcmplepd] = 1;             // Compare Packed Double-Precision Floating-Point Values - Less-than-or-equal (ordered, signaling)
	OptCategory[STARS_NN_vcmpunordpd] = 1;          // Compare Packed Double-Precision Floating-Point Values - Unordered (non-signaling)
	OptCategory[STARS_NN_vcmpneqpd] = 1;            // Compare Packed Double-Precision Floating-Point Values - Not-equal (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpnltpd] = 1;            // Compare Packed Double-Precision Floating-Point Values - Not-less-than (unordered, signaling)
	OptCategory[STARS_NN_vcmpnlepd] = 1;            // Compare Packed Double-Precision Floating-Point Values - Not-less-than-or-equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpordpd] = 1;            // Compare Packed Double-Precision Floating-Point Values - Ordered (non-signaling)
	OptCategory[STARS_NN_vcmpeq_uqpd] = 1;          // Compare Packed Double-Precision Floating-Point Values - Equal (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpngepd] = 1;            // Compare Packed Double-Precision Floating-Point Values - Not-greater-than-or-equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpngtpd] = 1;            // Compare Packed Double-Precision Floating-Point Values - Not-greater-than (unordered, signaling)
	OptCategory[STARS_NN_vcmpfalsepd] = 1;          // Compare Packed Double-Precision Floating-Point Values - False (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpneq_oqpd] = 1;         // Compare Packed Double-Precision Floating-Point Values - Not-equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpgepd] = 1;             // Compare Packed Double-Precision Floating-Point Values - Greater-than-or-equal (ordered, signaling)
	OptCategory[STARS_NN_vcmpgtpd] = 1;             // Compare Packed Double-Precision Floating-Point Values - Greater-than (ordered, signaling)
	OptCategory[STARS_NN_vcmptruepd] = 1;           // Compare Packed Double-Precision Floating-Point Values - True (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpeq_ospd] = 1;          // Compare Packed Double-Precision Floating-Point Values - Equal (ordered, signaling)
	OptCategory[STARS_NN_vcmplt_oqpd] = 1;          // Compare Packed Double-Precision Floating-Point Values - Less-than (ordered, non-signaling)
	OptCategory[STARS_NN_vcmple_oqpd] = 1;          // Compare Packed Double-Precision Floating-Point Values - Less-than-or-equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpunord_spd] = 1;        // Compare Packed Double-Precision Floating-Point Values - Unordered (signaling)
	OptCategory[STARS_NN_vcmpneq_uspd] = 1;         // Compare Packed Double-Precision Floating-Point Values - Not-equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpnlt_uqpd] = 1;         // Compare Packed Double-Precision Floating-Point Values - Not-less-than (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpnle_uqpd] = 1;         // Compare Packed Double-Precision Floating-Point Values - Not-less-than-or-equal (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpord_spd] = 1;          // Compare Packed Double-Precision Floating-Point Values - Ordered (signaling)
	OptCategory[STARS_NN_vcmpeq_uspd] = 1;          // Compare Packed Double-Precision Floating-Point Values - Equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpnge_uqpd] = 1;         // Compare Packed Double-Precision Floating-Point Values - Not-greater-than-or-equal (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpngt_uqpd] = 1;         // Compare Packed Double-Precision Floating-Point Values - Not-greater-than (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpfalse_ospd] = 1;       // Compare Packed Double-Precision Floating-Point Values - False (ordered, signaling)
	OptCategory[STARS_NN_vcmpneq_ospd] = 1;         // Compare Packed Double-Precision Floating-Point Values - Not-equal (ordered, signaling)
	OptCategory[STARS_NN_vcmpge_oqpd] = 1;          // Compare Packed Double-Precision Floating-Point Values - Greater-than-or-equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpgt_oqpd] = 1;          // Compare Packed Double-Precision Floating-Point Values - Greater-than (ordered, non-signaling)
	OptCategory[STARS_NN_vcmptrue_uspd] = 1;        // Compare Packed Double-Precision Floating-Point Values - True (unordered, signaling)

	OptCategory[STARS_NN_vcmpeqps] = 1;             // Packed Single-FP Compare - Equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpltps] = 1;             // Packed Single-FP Compare - Less-than (ordered, signaling)
	OptCategory[STARS_NN_vcmpleps] = 1;             // Packed Single-FP Compare - Less-than-or-equal (ordered, signaling)
	OptCategory[STARS_NN_vcmpunordps] = 1;          // Packed Single-FP Compare - Unordered (non-signaling)
	OptCategory[STARS_NN_vcmpneqps] = 1;            // Packed Single-FP Compare - Not-equal (unordered, non-signaling)

	OptCategory[STARS_NN_vcmpnltps] = 1;            // Packed Single-FP Compare - Not-less-than (unordered, signaling)
	OptCategory[STARS_NN_vcmpnleps] = 1;            // Packed Single-FP Compare - Not-less-than-or-equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpordps] = 1;            // Packed Single-FP Compare - Ordered (non-signaling)
	OptCategory[STARS_NN_vcmpeq_uqps] = 1;          // Packed Single-FP Compare - Equal (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpngeps] = 1;            // Packed Single-FP Compare - Not-greater-than-or-equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpngtps] = 1;            // Packed Single-FP Compare - Not-greater-than (unordered, signaling)
	OptCategory[STARS_NN_vcmpfalseps] = 1;          // Packed Single-FP Compare - False (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpneq_oqps] = 1;         // Packed Single-FP Compare - Not-equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpgeps] = 1;             // Packed Single-FP Compare - Greater-than-or-equal (ordered, signaling)
	OptCategory[STARS_NN_vcmpgtps] = 1;             // Packed Single-FP Compare - Greater-than (ordered, signaling)
	OptCategory[STARS_NN_vcmptrueps] = 1;           // Packed Single-FP Compare - True (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpeq_osps] = 1;          // Packed Single-FP Compare - Equal (ordered, signaling)
	OptCategory[STARS_NN_vcmplt_oqps] = 1;          // Packed Single-FP Compare - Less-than (ordered, non-signaling)
	OptCategory[STARS_NN_vcmple_oqps] = 1;          // Packed Single-FP Compare - Less-than-or-equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpunord_sps] = 1;        // Packed Single-FP Compare - Unordered (signaling)
	OptCategory[STARS_NN_vcmpneq_usps] = 1;         // Packed Single-FP Compare - Not-equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpnlt_uqps] = 1;         // Packed Single-FP Compare - Not-less-than (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpnle_uqps] = 1;         // Packed Single-FP Compare - Not-less-than-or-equal (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpord_sps] = 1;          // Packed Single-FP Compare - Ordered (signaling)
	OptCategory[STARS_NN_vcmpeq_usps] = 1;          // Packed Single-FP Compare - Equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpnge_uqps] = 1;         // Packed Single-FP Compare - Not-greater-than-or-equal (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpngt_uqps] = 1;         // Packed Single-FP Compare - Not-greater-than (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpfalse_osps] = 1;       // Packed Single-FP Compare - False (ordered, signaling)
	OptCategory[STARS_NN_vcmpneq_osps] = 1;         // Packed Single-FP Compare - Not-equal (ordered, signaling)
	OptCategory[STARS_NN_vcmpge_oqps] = 1;          // Packed Single-FP Compare - Greater-than-or-equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpgt_oqps] = 1;          // Packed Single-FP Compare - Greater-than (ordered, non-signaling)
	OptCategory[STARS_NN_vcmptrue_usps] = 1;        // Packed Single-FP Compare - True (unordered, signaling)


	OptCategory[STARS_NN_vcmpeqsd] = 1;             // Compare Scalar Double-Precision Floating-Point Values - Equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpltsd] = 1;             // Compare Scalar Double-Precision Floating-Point Values - Less-than (ordered, signaling)
	OptCategory[STARS_NN_vcmplesd] = 1;             // Compare Scalar Double-Precision Floating-Point Values - Less-than-or-equal (ordered, signaling)
	OptCategory[STARS_NN_vcmpunordsd] = 1;          // Compare Scalar Double-Precision Floating-Point Values - Unordered (non-signaling)
	OptCategory[STARS_NN_vcmpneqsd] = 1;            // Compare Scalar Double-Precision Floating-Point Values - Not-equal (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpnltsd] = 1;            // Compare Scalar Double-Precision Floating-Point Values - Not-less-than (unordered, signaling)
	OptCategory[STARS_NN_vcmpnlesd] = 1;            // Compare Scalar Double-Precision Floating-Point Values - Not-less-than-or-equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpordsd] = 1;            // Compare Scalar Double-Precision Floating-Point Values - Ordered (non-signaling)
	OptCategory[STARS_NN_vcmpeq_uqsd] = 1;          // Compare Scalar Double-Precision Floating-Point Values - Equal (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpngesd] = 1;            // Compare Scalar Double-Precision Floating-Point Values - Not-greater-than-or-equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpngtsd] = 1;            // Compare Scalar Double-Precision Floating-Point Values - Not-greater-than (unordered, signaling)
	OptCategory[STARS_NN_vcmpfalsesd] = 1;          // Compare Scalar Double-Precision Floating-Point Values - False (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpneq_oqsd] = 1;         // Compare Scalar Double-Precision Floating-Point Values - Not-equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpgesd] = 1;             // Compare Scalar Double-Precision Floating-Point Values - Greater-than-or-equal (ordered, signaling)
	OptCategory[STARS_NN_vcmpgtsd] = 1;             // Compare Scalar Double-Precision Floating-Point Values - Greater-than (ordered, signaling)
	OptCategory[STARS_NN_vcmptruesd] = 1;           // Compare Scalar Double-Precision Floating-Point Values - True (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpeq_ossd] = 1;          // Compare Scalar Double-Precision Floating-Point Values - Equal (ordered, signaling)
	OptCategory[STARS_NN_vcmplt_oqsd] = 1;          // Compare Scalar Double-Precision Floating-Point Values - Less-than (ordered, non-signaling)
	OptCategory[STARS_NN_vcmple_oqsd] = 1;          // Compare Scalar Double-Precision Floating-Point Values - Less-than-or-equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpunord_ssd] = 1;        // Compare Scalar Double-Precision Floating-Point Values - Unordered (signaling)
	OptCategory[STARS_NN_vcmpneq_ussd] = 1;         // Compare Scalar Double-Precision Floating-Point Values - Not-equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpnlt_uqsd] = 1;         // Compare Scalar Double-Precision Floating-Point Values - Not-less-than (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpnle_uqsd] = 1;         // Compare Scalar Double-Precision Floating-Point Values - Not-less-than-or-equal (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpord_ssd] = 1;          // Compare Scalar Double-Precision Floating-Point Values - Ordered (signaling)
	OptCategory[STARS_NN_vcmpeq_ussd] = 1;          // Compare Scalar Double-Precision Floating-Point Values - Equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpnge_uqsd] = 1;         // Compare Scalar Double-Precision Floating-Point Values - Not-greater-than-or-equal (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpngt_uqsd] = 1;         // Compare Scalar Double-Precision Floating-Point Values - Not-greater-than (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpfalse_ossd] = 1;       // Compare Scalar Double-Precision Floating-Point Values - False (ordered, signaling)
	OptCategory[STARS_NN_vcmpneq_ossd] = 1;         // Compare Scalar Double-Precision Floating-Point Values - Not-equal (ordered, signaling)
	OptCategory[STARS_NN_vcmpge_oqsd] = 1;          // Compare Scalar Double-Precision Floating-Point Values - Greater-than-or-equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpgt_oqsd] = 1;          // Compare Scalar Double-Precision Floating-Point Values - Greater-than (ordered, non-signaling)
	OptCategory[STARS_NN_vcmptrue_ussd] = 1;        // Compare Scalar Double-Precision Floating-Point Values - True (unordered, signaling)


	OptCategory[STARS_NN_vcmpeqss] = 1;             // Scalar Single-FP Compare - Equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpltss] = 1;             // Scalar Single-FP Compare - Less-than (ordered, signaling)
	OptCategory[STARS_NN_vcmpless] = 1;             // Scalar Single-FP Compare - Less-than-or-equal (ordered, signaling)
	OptCategory[STARS_NN_vcmpunordss] = 1;          // Scalar Single-FP Compare - Unordered (non-signaling)
	OptCategory[STARS_NN_vcmpneqss] = 1;            // Scalar Single-FP Compare - Not-equal (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpnltss] = 1;            // Scalar Single-FP Compare - Not-less-than (unordered, signaling)
	OptCategory[STARS_NN_vcmpnless] = 1;            // Scalar Single-FP Compare - Not-less-than-or-equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpordss] = 1;            // Scalar Single-FP Compare - Ordered (non-signaling)
	OptCategory[STARS_NN_vcmpeq_uqss] = 1;          // Scalar Single-FP Compare - Equal (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpngess] = 1;            // Scalar Single-FP Compare - Not-greater-than-or-equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpngtss] = 1;            // Scalar Single-FP Compare - Not-greater-than (unordered, signaling)
	OptCategory[STARS_NN_vcmpfalsess] = 1;          // Scalar Single-FP Compare - False (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpneq_oqss] = 1;         // Scalar Single-FP Compare - Not-equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpgess] = 1;             // Scalar Single-FP Compare - Greater-than-or-equal (ordered, signaling)
	OptCategory[STARS_NN_vcmpgtss] = 1;             // Scalar Single-FP Compare - Greater-than (ordered, signaling)
	OptCategory[STARS_NN_vcmptruess] = 1;           // Scalar Single-FP Compare - True (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpeq_osss] = 1;          // Scalar Single-FP Compare - Equal (ordered, signaling)
	OptCategory[STARS_NN_vcmplt_oqss] = 1;          // Scalar Single-FP Compare - Less-than (ordered, non-signaling)
	OptCategory[STARS_NN_vcmple_oqss] = 1;          // Scalar Single-FP Compare - Less-than-or-equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpunord_sss] = 1;        // Scalar Single-FP Compare - Unordered (signaling)
	OptCategory[STARS_NN_vcmpneq_usss] = 1;         // Scalar Single-FP Compare - Not-equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpnlt_uqss] = 1;         // Scalar Single-FP Compare - Not-less-than (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpnle_uqss] = 1;         // Scalar Single-FP Compare - Not-less-than-or-equal (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpord_sss] = 1;          // Scalar Single-FP Compare - Ordered (signaling)
	OptCategory[STARS_NN_vcmpeq_usss] = 1;          // Scalar Single-FP Compare - Equal (unordered, signaling)
	OptCategory[STARS_NN_vcmpnge_uqss] = 1;         // Scalar Single-FP Compare - Not-greater-than-or-equal (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpngt_uqss] = 1;         // Scalar Single-FP Compare - Not-greater-than (unordered, non-signaling)
	OptCategory[STARS_NN_vcmpfalse_osss] = 1;       // Scalar Single-FP Compare - False (ordered, signaling)
	OptCategory[STARS_NN_vcmpneq_osss] = 1;         // Scalar Single-FP Compare - Not-equal (ordered, signaling)
	OptCategory[STARS_NN_vcmpge_oqss] = 1;          // Scalar Single-FP Compare - Greater-than-or-equal (ordered, non-signaling)
	OptCategory[STARS_NN_vcmpgt_oqss] = 1;          // Scalar Single-FP Compare - Greater-than (ordered, non-signaling)
	OptCategory[STARS_NN_vcmptrue_usss] = 1;        // Scalar Single-FP Compare - True (unordered, signaling)

	// AVX-512 instructions

	OptCategory[STARS_NN_valignd] = 1;              // Align Doubleword Vectors
	OptCategory[STARS_NN_valignq] = 1;              // Align Quadword Vectors
	OptCategory[STARS_NN_vblendmpd] = 1;            // Blend Float64 Vectors Using an OpMask Control
	OptCategory[STARS_NN_vblendmps] = 1;            // Blend Float32 Vectors Using an OpMask Control
	OptCategory[STARS_NN_vpblendmb] = 1;            // Blend Byte Vectors Using an Opmask Control
	OptCategory[STARS_NN_vpblendmw] = 1;            // Blend Word Vectors Using an Opmask Control
	OptCategory[STARS_NN_vpblendmd] = 1;            // Blend Int32 Vectors Using an OpMask Control
	OptCategory[STARS_NN_vpblendmq] = 1;            // Blend Int64 Vectors Using an OpMask Control
	OptCategory[STARS_NN_vbroadcastf32x2] = 1;      // Load with Broadcast Floating-Point Data
	OptCategory[STARS_NN_vbroadcastf32x4] = 1;      // Load with Broadcast Floating-Point Data
	OptCategory[STARS_NN_vbroadcastf64x2] = 1;      // Load with Broadcast Floating-Point Data
	OptCategory[STARS_NN_vbroadcastf32x8] = 1;      // Load with Broadcast Floating-Point Data
	OptCategory[STARS_NN_vbroadcastf64x4] = 1;      // Load with Broadcast Floating-Point Data
	OptCategory[STARS_NN_vbroadcasti32x2] = 1;      // Load Integer and Broadcast
	OptCategory[STARS_NN_vbroadcasti32x4] = 1;      // Load Integer and Broadcast
	OptCategory[STARS_NN_vbroadcasti64x2] = 1;      // Load Integer and Broadcast
	OptCategory[STARS_NN_vbroadcasti32x8] = 1;      // Load Integer and Broadcast
	OptCategory[STARS_NN_vbroadcasti64x4] = 1;      // Load Integer and Broadcast
	OptCategory[STARS_NN_vcompresspd] = 1;          // Store Sparse Packed Double-Precision Floating-Point Values into Dense Memory
	OptCategory[STARS_NN_vcompressps] = 1;          // Store Sparse Packed Single-Precision Floating-Point Values into Dense Memory
	OptCategory[STARS_NN_vcvtpd2qq] = 1;            // Convert Packed Double-Precision Floating-Point Values to Packed Quadword Integers
	OptCategory[STARS_NN_vcvtpd2udq] = 1;           // Convert Packed Double-Precision Floating-Point Values to Packed Unsigned Doubleword Integers
	OptCategory[STARS_NN_vcvtpd2uqq] = 1;           // Convert Packed Double-Precision Floating-Point Values to Packed Unsigned Quadword Integers
	OptCategory[STARS_NN_vcvtps2udq] = 1;           // Convert Packed Single-Precision Floating-Point Values to Packed Unsigned Doubleword Integer Values
	OptCategory[STARS_NN_vcvtps2qq] = 1;            // Convert Packed Single Precision Floating-Point Values to Packed Singed Quadword Integer Values
	OptCategory[STARS_NN_vcvtps2uqq] = 1;           // Convert Packed Single Precision Floating-Point Values to Packed Unsigned Quadword Integer Values
	OptCategory[STARS_NN_vcvtqq2pd] = 1;            // Convert Packed Quadword Integers to Packed Double-Precision Floating-Point Values
	OptCategory[STARS_NN_vcvtqq2ps] = 1;            // Convert Packed Quadword Integers to Packed Single-Precision Floating-Point Values
	OptCategory[STARS_NN_vcvtsd2usi] = 1;           // Convert Scalar Double-Precision Floating-Point Value to Unsigned Doubleword Integer
	OptCategory[STARS_NN_vcvtss2usi] = 1;           // Convert Scalar Single-Precision Floating-Point Value to Unsigned Doubleword Integer
	OptCategory[STARS_NN_vcvttpd2qq] = 1;           // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Quadword Integers
	OptCategory[STARS_NN_vcvttpd2udq] = 1;          // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Unsigned Doubleword Integers
	OptCategory[STARS_NN_vcvttpd2uqq] = 1;          // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Unsigned Quadword Integers
	OptCategory[STARS_NN_vcvttps2udq] = 1;          // Convert with Truncation Packed Single-Precision Floating-Point Values to Packed Unsigned Doubleword Integer Values
	OptCategory[STARS_NN_vcvttps2qq] = 1;           // Convert with Truncation Packed Single Precision Floating-Point Values to Packed Singed Quadword Integer Values
	OptCategory[STARS_NN_vcvttps2uqq] = 1;          // Convert with Truncation Packed Single Precision Floating-Point Values to Packed Unsigned Quadword Integer Values
	OptCategory[STARS_NN_vcvttsd2usi] = 1;          // Convert with Truncation Scalar Double-Precision Floating-Point Value to Unsigned Integer
	OptCategory[STARS_NN_vcvttss2usi] = 1;          // Convert with Truncation Scalar Single-Precision Floating-Point Value to Unsigned Integer
	OptCategory[STARS_NN_vcvtudq2pd] = 1;           // Convert Packed Unsigned Doubleword Integers to Packed Double-Precision Floating-Point Values
	OptCategory[STARS_NN_vcvtudq2ps] = 1;           // Convert Packed Unsigned Doubleword Integers to Packed Single-Precision Floating-Point Values
	OptCategory[STARS_NN_vcvtuqq2pd] = 1;           // Convert Packed Unsigned Quadword Integers to Packed Double-Precision Floating-Point Values
	OptCategory[STARS_NN_vcvtuqq2ps] = 1;           // Convert Packed Unsigned Quadword Integers to Packed Single-Precision Floating-Point Values
	OptCategory[STARS_NN_vcvtusi2sd] = 1;           // Convert Unsigned Integer to Scalar Double-Precision Floating-Point Value
	OptCategory[STARS_NN_vcvtusi2ss] = 1;           // Convert Unsigned Integer to Scalar Single-Precision Floating-Point Value
	OptCategory[STARS_NN_vdbpsadbw] = 1;            // Double Block Packed Sum-Absolute-Differences (SAD) on Unsigned Bytes
	OptCategory[STARS_NN_vexpandpd] = 1;            // Load Sparse Packed Double-Precision Floating-Point Values from Dense Memory
	OptCategory[STARS_NN_vexpandps] = 1;            // Load Sparse Packed Single-Precision Floating-Point Values from Dense Memory
	OptCategory[STARS_NN_vextractf32x4] = 1;        // Extract Packed Floating-Point Values
	OptCategory[STARS_NN_vextractf64x2] = 1;        // Extract Packed Floating-Point Values
	OptCategory[STARS_NN_vextractf32x8] = 1;        // Extract Packed Floating-Point Values
	OptCategory[STARS_NN_vextractf64x4] = 1;        // Extract Packed Floating-Point Values
	OptCategory[STARS_NN_vextracti32x4] = 1;        // Extract packed Integer Values
	OptCategory[STARS_NN_vextracti64x2] = 1;        // Extract packed Integer Values
	OptCategory[STARS_NN_vextracti32x8] = 1;        // Extract packed Integer Values
	OptCategory[STARS_NN_vextracti64x4] = 1;        // Extract packed Integer Values
	OptCategory[STARS_NN_vfixupimmpd] = 1;          // Fix Up Special Packed Float64 Values
	OptCategory[STARS_NN_vfixupimmps] = 1;          // Fix Up Special Packed Float32 Values
	OptCategory[STARS_NN_vfixupimmsd] = 1;          // Fix Up Special Scalar Float64 Value
	OptCategory[STARS_NN_vfixupimmss] = 1;          // Fix Up Special Scalar Float32 Value
	OptCategory[STARS_NN_vfpclasspd] = 1;           // Tests Types Of a Packed Float64 Values
	OptCategory[STARS_NN_vfpclassps] = 1;           // Tests Types Of a Packed Float32 Values
	OptCategory[STARS_NN_vfpclasssd] = 1;           // Tests Types Of a Scalar Float64 Values
	OptCategory[STARS_NN_vfpclassss] = 1;           // Tests Types Of a Scalar Float32 Values
	OptCategory[STARS_NN_vgetexppd] = 1;            // Convert Exponents of Packed DP FP Values to DP FP Values
	OptCategory[STARS_NN_vgetexpps] = 1;            // Convert Exponents of Packed SP FP Values to SP FP Values
	OptCategory[STARS_NN_vgetexpsd] = 1;            // Convert Exponents of Scalar DP FP Values to DP FP Value
	OptCategory[STARS_NN_vgetexpss] = 1;            // Convert Exponents of Scalar SP FP Values to SP FP Value
	OptCategory[STARS_NN_vgetmantpd] = 1;           // Extract Float64 Vector of Normalized Mantissas from Float64 Vector
	OptCategory[STARS_NN_vgetmantps] = 1;           // Extract Float32 Vector of Normalized Mantissas from Float32 Vector
	OptCategory[STARS_NN_vgetmantsd] = 1;           // Extract Float64 of Normalized Mantissas from Float64 Scalar
	OptCategory[STARS_NN_vgetmantss] = 1;           // Extract Float32 Vector of Normalized Mantissa from Float32 Vector
	OptCategory[STARS_NN_vinsertf32x4] = 1;         // Insert Packed Floating-Point Values
	OptCategory[STARS_NN_vinsertf64x2] = 1;         // Insert Packed Floating-Point Values
	OptCategory[STARS_NN_vinsertf32x8] = 1;         // Insert Packed Floating-Point Values
	OptCategory[STARS_NN_vinsertf64x4] = 1;         // Insert Packed Floating-Point Values
	OptCategory[STARS_NN_vinserti32x4] = 1;         // Insert Packed Integer Values
	OptCategory[STARS_NN_vinserti64x2] = 1;         // Insert Packed Integer Values
	OptCategory[STARS_NN_vinserti32x8] = 1;         // Insert Packed Integer Values
	OptCategory[STARS_NN_vinserti64x4] = 1;         // Insert Packed Integer Values
	OptCategory[STARS_NN_vmovdqa32] = 1;            // Move Aligned Packed Integer Values
	OptCategory[STARS_NN_vmovdqa64] = 1;            // Move Aligned Packed Integer Values
	OptCategory[STARS_NN_vmovdqu8] = 1;             // Move Unaligned Packed Integer Values
	OptCategory[STARS_NN_vmovdqu16] = 1;            // Move Unaligned Packed Integer Values
	OptCategory[STARS_NN_vmovdqu32] = 1;            // Move Unaligned Packed Integer Values
	OptCategory[STARS_NN_vmovdqu64] = 1;            // Move Unaligned Packed Integer Values
	OptCategory[STARS_NN_vpabsq] = 1;               // Packed Absolute Value
	OptCategory[STARS_NN_vpandd] = 1;               // Logical AND
	OptCategory[STARS_NN_vpandq] = 1;               // Logical AND
	OptCategory[STARS_NN_vpandnd] = 1;              // Logical AND NOT
	OptCategory[STARS_NN_vpandnq] = 1;              // Logical AND NOT
	OptCategory[STARS_NN_vpbroadcastmb2q] = 1;      // Broadcast Mask to Vector Register
	OptCategory[STARS_NN_vpbroadcastmw2d] = 1;      // Broadcast Mask to Vector Register
	OptCategory[STARS_NN_vpcmpb] = 1;               // Compare Packed Byte Values Into Mask
	OptCategory[STARS_NN_vpcmpub] = 1;              // Compare Packed Byte Values Into Mask
	OptCategory[STARS_NN_vpcmpd] = 1;               // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpud] = 1;              // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpq] = 1;               // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpuq] = 1;              // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpw] = 1;               // Compare Packed Word Values Into Mask
	OptCategory[STARS_NN_vpcmpuw] = 1;              // Compare Packed Word Values Into Mask
	OptCategory[STARS_NN_vpcompressd] = 1;          // Store Sparse Packed Doubleword Integer Values into Dense Memory/Register
	OptCategory[STARS_NN_vpcompressq] = 1;          // Store Sparse Packed Quadword Integer Values into Dense Memory/Register
	OptCategory[STARS_NN_vpconflictd] = 1;          // Detect Conflicts Within a Vector of Packed Dword Values into Dense Memory/Register
	OptCategory[STARS_NN_vpconflictq] = 1;          // Detect Conflicts Within a Vector of Packed Qword Values into Dense Memory/Register
	OptCategory[STARS_NN_vpermb] = 1;               // Permute Packed Bytes Elements
	OptCategory[STARS_NN_vpermw] = 1;               // Permute Packed Words Elements
	OptCategory[STARS_NN_vpermi2b] = 1;             // Full Permute of Bytes From Two Tables Overwriting the Index
	OptCategory[STARS_NN_vpermi2w] = 1;             // Full Permute From Two Tables Overwriting the Index
	OptCategory[STARS_NN_vpermi2d] = 1;             // Full Permute From Two Tables Overwriting the Index
	OptCategory[STARS_NN_vpermi2q] = 1;             // Full Permute From Two Tables Overwriting the Index
	OptCategory[STARS_NN_vpermi2ps] = 1;            // Full Permute From Two Tables Overwriting the Index
	OptCategory[STARS_NN_vpermi2pd] = 1;            // Full Permute From Two Tables Overwriting the Index
	OptCategory[STARS_NN_vpermt2b] = 1;             // Full Permute of Bytes From Two Tables Overwriting a Table
	OptCategory[STARS_NN_vpermt2w] = 1;             // Full Permute from Two Tables Overwriting one Table
	OptCategory[STARS_NN_vpermt2d] = 1;             // Full Permute from Two Tables Overwriting one Table
	OptCategory[STARS_NN_vpermt2q] = 1;             // Full Permute from Two Tables Overwriting one Table
	OptCategory[STARS_NN_vpermt2ps] = 1;            // Full Permute from Two Tables Overwriting one Table
	OptCategory[STARS_NN_vpermt2pd] = 1;            // Full Permute from Two Tables Overwriting one Table
	OptCategory[STARS_NN_vpexpandd] = 1;            // Load Sparse Packed Doubleword Integer Values from Dense Memory/Register
	OptCategory[STARS_NN_vpexpandq] = 1;            // Load Sparse Packed Quadword Integer Values from Dense Memory/Register
	OptCategory[STARS_NN_vplzcntd] = 1;             // Count the Number of Leading Zero Bits for Packed Dword Values
	OptCategory[STARS_NN_vplzcntq] = 1;             // Count the Number of Leading Zero Bits for Packed Qword Values
	OptCategory[STARS_NN_vpmadd52luq] = 1;          // Packed Multiply of Unsigned 52-bit Integers and Add the Low 52-bit Products to Qword Accumulators
	OptCategory[STARS_NN_vpmadd52huq] = 1;          // Packed Multiply of Unsigned 52-bit Unsigned Integers and Add High 52-bit Products to 64-bit Accumulators
	OptCategory[STARS_NN_vpmaxsq] = 1;              // Maximum of Packed Signed Integers
	OptCategory[STARS_NN_vpmaxuq] = 1;              // Maximum of Packed Unsigned Integers
	OptCategory[STARS_NN_vpminsq] = 1;              // Minimum of Packed Signed Integers
	OptCategory[STARS_NN_vpminuq] = 1;              // Minimum of Packed Unsigned Integers
	OptCategory[STARS_NN_vpmovm2b] = 1;             // Convert a Mask Register to a Vector Register
	OptCategory[STARS_NN_vpmovm2w] = 1;             // Convert a Mask Register to a Vector Register
	OptCategory[STARS_NN_vpmovm2d] = 1;             // Convert a Mask Register to a Vector Register
	OptCategory[STARS_NN_vpmovm2q] = 1;             // Convert a Mask Register to a Vector Register
	OptCategory[STARS_NN_vpmovb2m] = 1;             // Convert a Vector Register to a Mask
	OptCategory[STARS_NN_vpmovw2m] = 1;             // Convert a Vector Register to a Mask
	OptCategory[STARS_NN_vpmovd2m] = 1;             // Convert a Vector Register to a Mask
	OptCategory[STARS_NN_vpmovq2m] = 1;             // Convert a Vector Register to a Mask
	OptCategory[STARS_NN_vpmovqb] = 1;              // Down Convert QWord to Byte
	OptCategory[STARS_NN_vpmovsqb] = 1;             // Down Convert QWord to Byte
	OptCategory[STARS_NN_vpmovusqb] = 1;            // Down Convert QWord to Byte
	OptCategory[STARS_NN_vpmovqw] = 1;              // Down Convert QWord to Word
	OptCategory[STARS_NN_vpmovsqw] = 1;             // Down Convert QWord to Word
	OptCategory[STARS_NN_vpmovusqw] = 1;            // Down Convert QWord to Word
	OptCategory[STARS_NN_vpmovqd] = 1;              // Down Convert QWord to DWord
	OptCategory[STARS_NN_vpmovsqd] = 1;             // Down Convert QWord to DWord
	OptCategory[STARS_NN_vpmovusqd] = 1;            // Down Convert QWord to DWord
	OptCategory[STARS_NN_vpmovdb] = 1;              // Down Convert DWord to Byte
	OptCategory[STARS_NN_vpmovsdb] = 1;             // Down Convert DWord to Byte
	OptCategory[STARS_NN_vpmovusdb] = 1;            // Down Convert DWord to Byte
	OptCategory[STARS_NN_vpmovdw] = 1;              // Down Convert DWord to Word
	OptCategory[STARS_NN_vpmovsdw] = 1;             // Down Convert DWord to Word
	OptCategory[STARS_NN_vpmovusdw] = 1;            // Down Convert DWord to Word
	OptCategory[STARS_NN_vpmovwb] = 1;              // Down Convert Word to Byte
	OptCategory[STARS_NN_vpmovswb] = 1;             // Down Convert Word to Byte
	OptCategory[STARS_NN_vpmovuswb] = 1;            // Down Convert Word to Byte
	OptCategory[STARS_NN_vpmullq] = 1;              // Multiply Packed Integers and Store Low Result
	OptCategory[STARS_NN_vpmultishiftqb] = 1;       // Select Packed Unaligned Bytes from Quadword Sources
	OptCategory[STARS_NN_vpord] = 1;                // Bitwise Logical Or
	OptCategory[STARS_NN_vporq] = 1;                // Bitwise Logical Or
	OptCategory[STARS_NN_vprold] = 1;               // Bit Rotate Left
	OptCategory[STARS_NN_vprolvd] = 1;              // Bit Rotate Left
	OptCategory[STARS_NN_vprolq] = 1;               // Bit Rotate Left
	OptCategory[STARS_NN_vprolvq] = 1;              // Bit Rotate Left
	OptCategory[STARS_NN_vprord] = 1;               // Bit Rotate Right
	OptCategory[STARS_NN_vprorvd] = 1;              // Bit Rotate Right
	OptCategory[STARS_NN_vprorq] = 1;               // Bit Rotate Right
	OptCategory[STARS_NN_vprorvq] = 1;              // Bit Rotate Right
	OptCategory[STARS_NN_vpscatterdd] = 1;          // Scatter Packed Dword with Signed Dword
	OptCategory[STARS_NN_vpscatterdq] = 1;          // Scatter Packed Qword with Signed Qword Indices
	OptCategory[STARS_NN_vpscatterqd] = 1;          // Scatter Packed Dword with Signed Dword
	OptCategory[STARS_NN_vpscatterqq] = 1;          // Scatter Packed Qword with Signed Qword Indices
	OptCategory[STARS_NN_vpsraq] = 1;               // Bit Shift Arithmetic Right
	OptCategory[STARS_NN_vpsllvw] = 1;              // Variable Bit Shift Left Logical
	OptCategory[STARS_NN_vpsrlvw] = 1;              // Variable Bit Shift Right Logical
	OptCategory[STARS_NN_vptestnmb] = 1;            // Logical NAND and Set
	OptCategory[STARS_NN_vptestnmw] = 1;            // Logical NAND and Set
	OptCategory[STARS_NN_vptestnmd] = 1;            // Logical NAND and Set
	OptCategory[STARS_NN_vptestnmq] = 1;            // Logical NAND and Set
	OptCategory[STARS_NN_vshuff32x4] = 1;           // Shuffle Packed Values at 128-bit Granularity
	OptCategory[STARS_NN_vshuff64x2] = 1;           // Shuffle Packed Values at 128-bit Granularity
	OptCategory[STARS_NN_vshufi32x4] = 1;           // Shuffle Packed Values at 128-bit Granularity
	OptCategory[STARS_NN_vshufi64x2] = 1;           // Shuffle Packed Values at 128-bit Granularity
	OptCategory[STARS_NN_vpternlogd] = 1;           // Bitwise Ternary Logic
	OptCategory[STARS_NN_vpternlogq] = 1;           // Bitwise Ternary Logic
	OptCategory[STARS_NN_vptestmb] = 1;             // Logical AND and Set Mask
	OptCategory[STARS_NN_vptestmw] = 1;             // Logical AND and Set Mask
	OptCategory[STARS_NN_vptestmd] = 1;             // Logical AND and Set Mask
	OptCategory[STARS_NN_vptestmq] = 1;             // Logical AND and Set Mask
	OptCategory[STARS_NN_vpsravw] = 1;              // Variable Bit Shift Right Arithmetic
	OptCategory[STARS_NN_vpsravq] = 1;              // Variable Bit Shift Right Arithmetic
	OptCategory[STARS_NN_vpxord] = 1;               // Exclusive Or
	OptCategory[STARS_NN_vpxorq] = 1;               // Exclusive Or
	OptCategory[STARS_NN_vrangepd] = 1;             // Range Restriction Calculation For Packed Pairs of Float64 Values
	OptCategory[STARS_NN_vrangeps] = 1;             // Range Restriction Calculation For Packed Pairs of Float32 Values
	OptCategory[STARS_NN_vrangesd] = 1;             // Range Restriction Calculation From a pair of Scalar Float64 Values
	OptCategory[STARS_NN_vrangess] = 1;             // Range Restriction Calculation From a Pair of Scalar Float32 Values
	OptCategory[STARS_NN_vrcp14pd] = 1;             // Compute Approximate Reciprocals of Packed Float64 Values
	OptCategory[STARS_NN_vrcp14sd] = 1;             // Compute Approximate Reciprocal of Scalar Float64 Value
	OptCategory[STARS_NN_vrcp14ps] = 1;             // Compute Approximate Reciprocals of Packed Float32 Values
	OptCategory[STARS_NN_vrcp14ss] = 1;             // Compute Approximate Reciprocal of Scalar Float32 Value
	OptCategory[STARS_NN_vreducepd] = 1;            // Perform Reduction Transformation on Packed Float64 Values
	OptCategory[STARS_NN_vreducesd] = 1;            // Perform a Reduction Transformation on a Scalar Float64 Value
	OptCategory[STARS_NN_vreduceps] = 1;            // Perform Reduction Transformation on Packed Float32 Values
	OptCategory[STARS_NN_vreducess] = 1;            // Perform a Reduction Transformation on a Scalar Float32 Value
	OptCategory[STARS_NN_vrndscalepd] = 1;          // Round Packed Float64 Values To Include A Given Number Of Fraction Bits
	OptCategory[STARS_NN_vrndscalesd] = 1;          // Round Scalar Float64 Value To Include A Given Number Of Fraction Bits
	OptCategory[STARS_NN_vrndscaleps] = 1;          // Round Packed Float32 Values To Include A Given Number Of Fraction Bits
	OptCategory[STARS_NN_vrndscaless] = 1;          // Round Scalar Float32 Value To Include A Given Number Of Fraction Bits
	OptCategory[STARS_NN_vrsqrt14pd] = 1;           // Compute Approximate Reciprocals of Square Roots of Packed Float64 Values
	OptCategory[STARS_NN_vrsqrt14sd] = 1;           // Compute Approximate Reciprocal of Square Root of Scalar Float64 Value
	OptCategory[STARS_NN_vrsqrt14ps] = 1;           // Compute Approximate Reciprocals of Square Roots of Packed Float32 Values
	OptCategory[STARS_NN_vrsqrt14ss] = 1;           // Compute Approximate Reciprocal of Square Root of Scalar Float32 Value
	OptCategory[STARS_NN_vscalefpd] = 1;            // Scale Packed Float64 Values With Float64 Values
	OptCategory[STARS_NN_vscalefsd] = 1;            // Scale Scalar Float64 Values With Float64 Values
	OptCategory[STARS_NN_vscalefps] = 1;            // Scale Packed Float32 Values With Float32 Values
	OptCategory[STARS_NN_vscalefss] = 1;            // Scale Scalar Float32 Value With Float32 Value
	OptCategory[STARS_NN_vscatterdps] = 1;          // Scatter Packed Single, Packed Double with Signed Dword and Qword Indices
	OptCategory[STARS_NN_vscatterdpd] = 1;          // Scatter Packed Single, Packed Double with Signed Dword and Qword Indices
	OptCategory[STARS_NN_vscatterqps] = 1;          // Scatter Packed Single, Packed Double with Signed Dword and Qword Indices
	OptCategory[STARS_NN_vscatterqpd] = 1;          // Scatter Packed Single, Packed Double with Signed Dword and Qword Indices

	OptCategory[STARS_NN_vexp2pd] = 1;              // Approximation to the Exponential 2^x of Packed Double-Precision Floating-Point Values with Less Than 2^-23 Relative Error
	OptCategory[STARS_NN_vexp2ps] = 1;              // Approximation to the Exponential 2^x of Packed Single-Precision Floating-Point Values with Less Than 2^-23 Relative Error
	OptCategory[STARS_NN_vrcp28pd] = 1;             // Approximation to the Reciprocal of Packed Double-Precision Floating-Point Values with Less Than 2^-28 Relative Error
	OptCategory[STARS_NN_vrcp28sd] = 1;             // Approximation to the Reciprocal of Scalar Double-Precision Floating-Point Value with Less Than 2^-28 Relative Error
	OptCategory[STARS_NN_vrcp28ps] = 1;             // Approximation to the Reciprocal of Packed Single-Precision Floating-Point Values with Less Than 2^-28 Relative Error
	OptCategory[STARS_NN_vrcp28ss] = 1;             // Approximation to the Reciprocal of Scalar Single-Precision Floating-Point Value with Less Than 2^-28 Relative Error
	OptCategory[STARS_NN_vrsqrt28pd] = 1;           // Approximation to the Reciprocal Square Root of Packed Double-Precision Floating-Point Values with Less Than 2^-28 Relative Error
	OptCategory[STARS_NN_vrsqrt28sd] = 1;           // Approximation to the Reciprocal Square Root of Scalar Double-Precision Floating-Point Value with Less Than 2^-28 Relative Error
	OptCategory[STARS_NN_vrsqrt28ps] = 1;           // Approximation to the Reciprocal Square Root of Packed Single-Precision Floating-Point Values with Less Than 2^-28 Relative Error
	OptCategory[STARS_NN_vrsqrt28ss] = 1;           // Approximation to the Reciprocal Square Root of Scalar Single-Precision Floating-Point Value with Less Than 2^-28 Relative Error

	OptCategory[STARS_NN_vgatherpf0dps] = 1;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint
	OptCategory[STARS_NN_vgatherpf0qps] = 1;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint
	OptCategory[STARS_NN_vgatherpf0dpd] = 1;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint
	OptCategory[STARS_NN_vgatherpf0qpd] = 1;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint
	OptCategory[STARS_NN_vgatherpf1dps] = 1;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint
	OptCategory[STARS_NN_vgatherpf1qps] = 1;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint
	OptCategory[STARS_NN_vgatherpf1dpd] = 1;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint
	OptCategory[STARS_NN_vgatherpf1qpd] = 1;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint
	OptCategory[STARS_NN_vscatterpf0dps] = 1;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write
	OptCategory[STARS_NN_vscatterpf0qps] = 1;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write
	OptCategory[STARS_NN_vscatterpf0dpd] = 1;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write
	OptCategory[STARS_NN_vscatterpf0qpd] = 1;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write
	OptCategory[STARS_NN_vscatterpf1dps] = 1;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write
	OptCategory[STARS_NN_vscatterpf1qps] = 1;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write
	OptCategory[STARS_NN_vscatterpf1dpd] = 1;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write
	OptCategory[STARS_NN_vscatterpf1qpd] = 1;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write

	// AVX-512 comparison pseudo-ops

	OptCategory[STARS_NN_vpcmpltd] = 1;             // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpled] = 1;             // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpneqd] = 1;            // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpnltd] = 1;            // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpnled] = 1;            // Compare Packed Integer Values into Mask

	OptCategory[STARS_NN_vpcmpequd] = 1;            // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpltud] = 1;            // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpleud] = 1;            // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpnequd] = 1;           // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpnltud] = 1;           // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpnleud] = 1;           // Compare Packed Integer Values into Mask

	OptCategory[STARS_NN_vpcmpltq] = 1;             // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpleq] = 1;             // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpneqq] = 1;            // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpnltq] = 1;            // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpnleq] = 1;            // Compare Packed Integer Values into Mask

	OptCategory[STARS_NN_vpcmpequq] = 1;            // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpltuq] = 1;            // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpleuq] = 1;            // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpnequq] = 1;           // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpnltuq] = 1;           // Compare Packed Integer Values into Mask
	OptCategory[STARS_NN_vpcmpnleuq] = 1;           // Compare Packed Integer Values into Mask

	// Opmask instructions

	OptCategory[STARS_NN_kaddw] = 1;                // ADD Two Masks
	OptCategory[STARS_NN_kaddb] = 1;                // ADD Two Masks
	OptCategory[STARS_NN_kaddq] = 1;                // ADD Two Masks
	OptCategory[STARS_NN_kaddd] = 1;                // ADD Two Masks
	OptCategory[STARS_NN_kandw] = 1;                // Bitwise Logical AND Masks
	OptCategory[STARS_NN_kandb] = 1;                // Bitwise Logical AND Masks
	OptCategory[STARS_NN_kandq] = 1;                // Bitwise Logical AND Masks
	OptCategory[STARS_NN_kandd] = 1;                // Bitwise Logical AND Masks
	OptCategory[STARS_NN_kandnw] = 1;               // Bitwise Logical AND NOT Masks
	OptCategory[STARS_NN_kandnb] = 1;               // Bitwise Logical AND NOT Masks
	OptCategory[STARS_NN_kandnq] = 1;               // Bitwise Logical AND NOT Masks
	OptCategory[STARS_NN_kandnd] = 1;               // Bitwise Logical AND NOT Masks
	OptCategory[STARS_NN_kmovw] = 1;                // Move from and to Mask Registers
	OptCategory[STARS_NN_kmovb] = 1;                // Move from and to Mask Registers
	OptCategory[STARS_NN_kmovq] = 1;                // Move from and to Mask Registers
	OptCategory[STARS_NN_kmovd] = 1;                // Move from and to Mask Registers
	OptCategory[STARS_NN_kunpckbw] = 1;             // Unpack for Mask Registers
	OptCategory[STARS_NN_kunpckwd] = 1;             // Unpack for Mask Registers
	OptCategory[STARS_NN_kunpckdq] = 1;             // Unpack for Mask Registers
	OptCategory[STARS_NN_knotw] = 1;                // NOT Mask Register
	OptCategory[STARS_NN_knotb] = 1;                // NOT Mask Register
	OptCategory[STARS_NN_knotq] = 1;                // NOT Mask Register
	OptCategory[STARS_NN_knotd] = 1;                // NOT Mask Register
	OptCategory[STARS_NN_korw] = 1;                 // Bitwise Logical OR Masks
	OptCategory[STARS_NN_korb] = 1;                 // Bitwise Logical OR Masks
	OptCategory[STARS_NN_korq] = 1;                 // Bitwise Logical OR Masks
	OptCategory[STARS_NN_kord] = 1;                 // Bitwise Logical OR Masks
	OptCategory[STARS_NN_kortestw] = 1;             // OR Masks And Set Flags
	OptCategory[STARS_NN_kortestb] = 1;             // OR Masks And Set Flags
	OptCategory[STARS_NN_kortestq] = 1;             // OR Masks And Set Flags
	OptCategory[STARS_NN_kortestd] = 1;             // OR Masks And Set Flags
	OptCategory[STARS_NN_kshiftlw] = 1;             // Shift Left Mask Registers
	OptCategory[STARS_NN_kshiftlb] = 1;             // Shift Left Mask Registers
	OptCategory[STARS_NN_kshiftlq] = 1;             // Shift Left Mask Registers
	OptCategory[STARS_NN_kshiftld] = 1;             // Shift Left Mask Registers
	OptCategory[STARS_NN_kshiftrw] = 1;             // Shift Right Mask Registers
	OptCategory[STARS_NN_kshiftrb] = 1;             // Shift Right Mask Registers
	OptCategory[STARS_NN_kshiftrq] = 1;             // Shift Right Mask Registers
	OptCategory[STARS_NN_kshiftrd] = 1;             // Shift Right Mask Registers
	OptCategory[STARS_NN_kxnorw] = 1;               // Bitwise Logical XNOR Masks
	OptCategory[STARS_NN_kxnorb] = 1;               // Bitwise Logical XNOR Masks
	OptCategory[STARS_NN_kxnorq] = 1;               // Bitwise Logical XNOR Masks
	OptCategory[STARS_NN_kxnord] = 1;               // Bitwise Logical XNOR Masks
	OptCategory[STARS_NN_ktestw] = 1;               // Packed Bit Test Masks and Set Flags
	OptCategory[STARS_NN_ktestb] = 1;               // Packed Bit Test Masks and Set Flags
	OptCategory[STARS_NN_ktestq] = 1;               // Packed Bit Test Masks and Set Flags
	OptCategory[STARS_NN_ktestd] = 1;               // Packed Bit Test Masks and Set Flags
	OptCategory[STARS_NN_kxorw] = 1;                // Bitwise Logical XOR Masks
	OptCategory[STARS_NN_kxorb] = 1;                // Bitwise Logical XOR Masks
	OptCategory[STARS_NN_kxorq] = 1;                // Bitwise Logical XOR Masks
	OptCategory[STARS_NN_kxord] = 1;                // Bitwise Logical XOR Masks

	// SHA Extensions

	OptCategory[STARS_NN_sha1rnds4] = 1;            // Perform Four Rounds of SHA1 Operation
	OptCategory[STARS_NN_sha1nexte] = 1;            // Calculate SHA1 State Variable E after Four Rounds
	OptCategory[STARS_NN_sha1msg1] = 1;             // Perform an Intermediate Calculation for the Next Four SHA1 Message Dwords
	OptCategory[STARS_NN_sha1msg2] = 1;             // Perform a Final Calculation for the Next Four SHA1 Message Dwords
	OptCategory[STARS_NN_sha256rnds2] = 1;          // Perform Two Rounds of SHA256 Operation
	OptCategory[STARS_NN_sha256msg1] = 1;           // Perform an Intermediate Calculation for the Next Four SHA256 Message Dwords
	OptCategory[STARS_NN_sha256msg2] = 1;           // Perform a Final Calculation for the Next Four SHA256 Message Dwords

	// Intel Software Guard Extensions

	OptCategory[STARS_NN_encls] = 1;                // Execute an Enclave System Function of Specified Leaf Number
	OptCategory[STARS_NN_enclu] = 1;                // Execute an Enclave User Function of Specified Leaf Number

	// AMD XOP

	OptCategory[STARS_NN_vfrczpd] = 1;              // Extract Fraction Packed Double-Precision Floating-Point
	OptCategory[STARS_NN_vfrczps] = 1;              // Extract Fraction Packed Single-Precision Floating-Point
	OptCategory[STARS_NN_vfrczsd] = 1;              // Extract Fraction Scalar Double-Precision Floating-Point
	OptCategory[STARS_NN_vfrczss] = 1;              // Extract Fraction Scalar Single-Precision Floating Point
	OptCategory[STARS_NN_vpcmov] = 1;               // Vector Conditional Moves
	OptCategory[STARS_NN_vpcomb] = 1;               // Compare Vector Signed Bytes
	OptCategory[STARS_NN_vpcomd] = 1;               // Compare Vector Signed Doublewords
	OptCategory[STARS_NN_vpcomq] = 1;               // Compare Vector Signed Quadwords
	OptCategory[STARS_NN_vpcomub] = 1;              // Compare Vector Unsigned Bytes
	OptCategory[STARS_NN_vpcomud] = 1;              // Compare Vector Unsigned Doublewords
	OptCategory[STARS_NN_vpcomuq] = 1;              // Compare Vector Unsigned Quadwords
	OptCategory[STARS_NN_vpcomuw] = 1;              // Compare Vector Unsigned Words
	OptCategory[STARS_NN_vpcomw] = 1;               // Compare Vector Signed Words
	OptCategory[STARS_NN_vpermil2pd] = 1;           // Permute Two-Source Double-Precision Floating-Point Values
	OptCategory[STARS_NN_vpermil2ps] = 1;           // Permute Two-Source Single-Precision Floating-Point Values
	OptCategory[STARS_NN_vphaddbd] = 1;             // Packed Horizontal Add Signed Byte to Signed Doubleword
	OptCategory[STARS_NN_vphaddbq] = 1;             // Packed Horizontal Add Signed Byte to Signed Quadword
	OptCategory[STARS_NN_vphaddbw] = 1;             // Packed Horizontal Add Signed Byte to Signed Word
	OptCategory[STARS_NN_vphadddq] = 1;             // Packed Horizontal Add Signed Doubleword to Signed Quadword
	OptCategory[STARS_NN_vphaddubd] = 1;            // Packed Horizontal Add Unsigned Byte to Doubleword
	OptCategory[STARS_NN_vphaddubq] = 1;            // Packed Horizontal Add Unsigned Byte to Quadword
	OptCategory[STARS_NN_vphaddubw] = 1;            // Packed Horizontal Add Unsigned Byte to Word
	OptCategory[STARS_NN_vphaddudq] = 1;            // Packed Horizontal Add Unsigned Doubleword to Quadword
	OptCategory[STARS_NN_vphadduwd] = 1;            // Packed Horizontal Add Unsigned Word to Doubleword
	OptCategory[STARS_NN_vphadduwq] = 1;            // Packed Horizontal Add Unsigned Word to Quadword
	OptCategory[STARS_NN_vphaddwd] = 1;             // Packed Horizontal Add Signed Word to Signed Doubleword
	OptCategory[STARS_NN_vphaddwq] = 1;             // Packed Horizontal Add Signed Word to Signed Quadword
	OptCategory[STARS_NN_vphsubbw] = 1;             // Packed Horizontal Subtract Signed Byte to Signed Word
	OptCategory[STARS_NN_vphsubdq] = 1;             // Packed Horizontal Subtract Signed Doubleword to Signed Quadword
	OptCategory[STARS_NN_vphsubwd] = 1;             // Packed Horizontal Subtract Signed Word to Signed Doubleword
	OptCategory[STARS_NN_vpmacsdd] = 1;             // Packed Multiply Accumulate Signed Doubleword to Signed Doubleword
	OptCategory[STARS_NN_vpmacsdqh] = 1;            // Packed Multiply Accumulate Signed High Doubleword to Signed Quadword
	OptCategory[STARS_NN_vpmacsdql] = 1;            // Packed Multiply Accumulate Signed Low Doubleword to Signed Quadword
	OptCategory[STARS_NN_vpmacssdd] = 1;            // Packed Multiply Accumulate Signed Doubleword to Signed Doubleword with Saturation
	OptCategory[STARS_NN_vpmacssdqh] = 1;           // Packed Multiply Accumulate Signed High Doubleword to Signed Quadword with Saturation
	OptCategory[STARS_NN_vpmacssdql] = 1;           // Packed Multiply Accumulate Signed Low Doubleword to Signed Quadword with Saturation
	OptCategory[STARS_NN_vpmacsswd] = 1;            // Packed Multiply Accumulate Signed Word to Signed Doubleword with Saturation
	OptCategory[STARS_NN_vpmacssww] = 1;            // Packed Multiply Accumulate Signed Word to Signed Word with Saturation
	OptCategory[STARS_NN_vpmacswd] = 1;             // Packed Multiply Accumulate Signed Word to Signed Doubleword
	OptCategory[STARS_NN_vpmacsww] = 1;             // Packed Multiply Accumulate Signed Word to Signed Word
	OptCategory[STARS_NN_vpmadcsswd] = 1;           // Packed Multiply, Add and Accumulate Signed Word to Signed Doubleword with Saturation
	OptCategory[STARS_NN_vpmadcswd] = 1;            // Packed Multiply Add and Accumulate Signed Word to Signed Doubleword
	OptCategory[STARS_NN_vpperm] = 1;               // Packed Permute Bytes
	OptCategory[STARS_NN_vprotb] = 1;               // Packed Rotate Bytes
	OptCategory[STARS_NN_vprotd] = 1;               // Packed Rotate Doublewords
	OptCategory[STARS_NN_vprotq] = 1;               // Packed Rotate Quadwords
	OptCategory[STARS_NN_vprotw] = 1;               // Packed Rotate Words
	OptCategory[STARS_NN_vpshab] = 1;               // Packed Shift Arithmetic Bytes
	OptCategory[STARS_NN_vpshad] = 1;               // Packed Shift Arithmetic Doublewords
	OptCategory[STARS_NN_vpshaq] = 1;               // Packed Shift Arithmetic Quadwords
	OptCategory[STARS_NN_vpshaw] = 1;               // Packed Shift Arithmetic Words
	OptCategory[STARS_NN_vpshlb] = 1;               // Packed Shift Logical Bytes
	OptCategory[STARS_NN_vpshld] = 1;               // Packed Shift Logical Doublewords
	OptCategory[STARS_NN_vpshlq] = 1;               // Packed Shift Logical Quadwords
	OptCategory[STARS_NN_vpshlw] = 1;               // Packed Shift Logical Words

	// AMP XOP comparison pseudo-ops

	OptCategory[STARS_NN_vpcomltb] = 1;             // Compare Vector Signed Bytes
	OptCategory[STARS_NN_vpcomleb] = 1;             // Compare Vector Signed Bytes
	OptCategory[STARS_NN_vpcomgtb] = 1;             // Compare Vector Signed Bytes
	OptCategory[STARS_NN_vpcomgeb] = 1;             // Compare Vector Signed Bytes
	OptCategory[STARS_NN_vpcomeqb] = 1;             // Compare Vector Signed Bytes
	OptCategory[STARS_NN_vpcomneqb] = 1;            // Compare Vector Signed Bytes
	OptCategory[STARS_NN_vpcomfalseb] = 1;          // Compare Vector Signed Bytes
	OptCategory[STARS_NN_vpcomtrueb] = 1;           // Compare Vector Signed Bytes

	OptCategory[STARS_NN_vpcomltw] = 1;             // Compare Vector Signed Words
	OptCategory[STARS_NN_vpcomlew] = 1;             // Compare Vector Signed Words
	OptCategory[STARS_NN_vpcomgtw] = 1;             // Compare Vector Signed Words
	OptCategory[STARS_NN_vpcomgew] = 1;             // Compare Vector Signed Words
	OptCategory[STARS_NN_vpcomeqw] = 1;             // Compare Vector Signed Words
	OptCategory[STARS_NN_vpcomneqw] = 1;            // Compare Vector Signed Words
	OptCategory[STARS_NN_vpcomfalsew] = 1;          // Compare Vector Signed Words
	OptCategory[STARS_NN_vpcomtruew] = 1;           // Compare Vector Signed Words

	OptCategory[STARS_NN_vpcomltd] = 1;             // Compare Vector Signed Doublewords
	OptCategory[STARS_NN_vpcomled] = 1;             // Compare Vector Signed Doublewords
	OptCategory[STARS_NN_vpcomgtd] = 1;             // Compare Vector Signed Doublewords
	OptCategory[STARS_NN_vpcomged] = 1;             // Compare Vector Signed Doublewords
	OptCategory[STARS_NN_vpcomeqd] = 1;             // Compare Vector Signed Doublewords
	OptCategory[STARS_NN_vpcomneqd] = 1;            // Compare Vector Signed Doublewords
	OptCategory[STARS_NN_vpcomfalsed] = 1;          // Compare Vector Signed Doublewords
	OptCategory[STARS_NN_vpcomtrued] = 1;           // Compare Vector Signed Doublewords

	OptCategory[STARS_NN_vpcomltq] = 1;             // Compare Vector Signed Quadwords
	OptCategory[STARS_NN_vpcomleq] = 1;             // Compare Vector Signed Quadwords
	OptCategory[STARS_NN_vpcomgtq] = 1;             // Compare Vector Signed Quadwords
	OptCategory[STARS_NN_vpcomgeq] = 1;             // Compare Vector Signed Quadwords
	OptCategory[STARS_NN_vpcomeqq] = 1;             // Compare Vector Signed Quadwords
	OptCategory[STARS_NN_vpcomneqq] = 1;            // Compare Vector Signed Quadwords
	OptCategory[STARS_NN_vpcomfalseq] = 1;          // Compare Vector Signed Quadwords
	OptCategory[STARS_NN_vpcomtrueq] = 1;           // Compare Vector Signed Quadwords

	OptCategory[STARS_NN_vpcomltub] = 1;            // Compare Vector Unsigned Bytes
	OptCategory[STARS_NN_vpcomleub] = 1;            // Compare Vector Unsigned Bytes
	OptCategory[STARS_NN_vpcomgtub] = 1;            // Compare Vector Unsigned Bytes
	OptCategory[STARS_NN_vpcomgeub] = 1;            // Compare Vector Unsigned Bytes
	OptCategory[STARS_NN_vpcomequb] = 1;            // Compare Vector Unsigned Bytes
	OptCategory[STARS_NN_vpcomnequb] = 1;           // Compare Vector Unsigned Bytes
	OptCategory[STARS_NN_vpcomfalseub] = 1;         // Compare Vector Unsigned Bytes
	OptCategory[STARS_NN_vpcomtrueub] = 1;          // Compare Vector Unsigned Bytes

	OptCategory[STARS_NN_vpcomltuw] = 1;            // Compare Vector Unsigned Words
	OptCategory[STARS_NN_vpcomleuw] = 1;            // Compare Vector Unsigned Words
	OptCategory[STARS_NN_vpcomgtuw] = 1;            // Compare Vector Unsigned Words
	OptCategory[STARS_NN_vpcomgeuw] = 1;            // Compare Vector Unsigned Words
	OptCategory[STARS_NN_vpcomequw] = 1;            // Compare Vector Unsigned Words
	OptCategory[STARS_NN_vpcomnequw] = 1;           // Compare Vector Unsigned Words
	OptCategory[STARS_NN_vpcomfalseuw] = 1;         // Compare Vector Unsigned Words
	OptCategory[STARS_NN_vpcomtrueuw] = 1;          // Compare Vector Unsigned Words

	OptCategory[STARS_NN_vpcomltud] = 1;            // Compare Vector Unsigned Doublewords
	OptCategory[STARS_NN_vpcomleud] = 1;            // Compare Vector Unsigned Doublewords
	OptCategory[STARS_NN_vpcomgtud] = 1;            // Compare Vector Unsigned Doublewords
	OptCategory[STARS_NN_vpcomgeud] = 1;            // Compare Vector Unsigned Doublewords
	OptCategory[STARS_NN_vpcomequd] = 1;            // Compare Vector Unsigned Doublewords
	OptCategory[STARS_NN_vpcomnequd] = 1;           // Compare Vector Unsigned Doublewords
	OptCategory[STARS_NN_vpcomfalseud] = 1;         // Compare Vector Unsigned Doublewords
	OptCategory[STARS_NN_vpcomtrueud] = 1;          // Compare Vector Unsigned Doublewords

	OptCategory[STARS_NN_vpcomltuq] = 1;            // Compare Vector Unsigned Quadwords
	OptCategory[STARS_NN_vpcomleuq] = 1;            // Compare Vector Unsigned Quadwords
	OptCategory[STARS_NN_vpcomgtuq] = 1;            // Compare Vector Unsigned Quadwords
	OptCategory[STARS_NN_vpcomgeuq] = 1;            // Compare Vector Unsigned Quadwords
	OptCategory[STARS_NN_vpcomequq] = 1;            // Compare Vector Unsigned Quadwords
	OptCategory[STARS_NN_vpcomnequq] = 1;           // Compare Vector Unsigned Quadwords
	OptCategory[STARS_NN_vpcomfalseuq] = 1;         // Compare Vector Unsigned Quadwords
	OptCategory[STARS_NN_vpcomtrueuq] = 1;          // Compare Vector Unsigned Quadwords

	// AMD Excavator

	OptCategory[STARS_NN_monitorx] = 1;             // Setup Monitor Address
	OptCategory[STARS_NN_mwaitx] = 1;               // Monitor Wait with Timeout

	// AMD Zen

	OptCategory[STARS_NN_clzero] = 1;               // Zero out 64 byte cache

	// Intel Processor Trace

	OptCategory[STARS_NN_ptwrite] = 1;              // Write Data to a Processor Trace Packet

	// new Intel AVX-512 instructions (December 2016)

	OptCategory[STARS_NN_v4fmaddps] = 1;            // Packed Single-Precision Floating-Point Fused Multiply-Add (4-iterations)
	OptCategory[STARS_NN_v4fnmaddps] = 1;           // Packed Single-Precision Floating-Point Fused Multiply-Add (4-iterations)
	OptCategory[STARS_NN_v4fmaddss] = 1;            // Scalar Single-Precision Floating-Point Fused Multiply-Add (4-iterations)
	OptCategory[STARS_NN_v4fnmaddss] = 1;           // Scalar Single-Precision Floating-Point Fused Multiply-Add (4-iterations)
	OptCategory[STARS_NN_vp4dpwssd] = 1;            // Dot Product of Signed Words with Dword Accumulation (4-iterations)
	OptCategory[STARS_NN_vp4dpwssds] = 1;           // Dot Product of Signed Words with Dword Accumulation and Saturation (4-iterations)
	OptCategory[STARS_NN_vpopcntd] = 1;             // Return the Count of Number of Bits Set to 1 in DWORD
	OptCategory[STARS_NN_vpopcntq] = 1;             // Return the Count of Number of Bits Set to 1 in QWORD

	// Read Processor ID

	OptCategory[STARS_NN_rdpid] = 2;                // Read Processor ID

	// Invoke VM function

	OptCategory[STARS_NN_vmfunc] = 1;               // Invoke VM function

	// Control-flow Enforcement

	OptCategory[STARS_NN_incsspd] = 1;              // Increment Shadow Stack Pointer (by 4)
	OptCategory[STARS_NN_incsspq] = 1;              // Increment Shadow Stack Pointer (by 8)
	OptCategory[STARS_NN_rdsspd] = 6;               // Read (low 32 bits of) Shadow Stack Pointer
	OptCategory[STARS_NN_rdsspq] = 6;               // Read Shadow Stack Pointer
	OptCategory[STARS_NN_saveprevssp] = 1;          // Save Previous Shadow Stack Pointer
	OptCategory[STARS_NN_rstorssp] = 1;             // Restore saved Shadow Stack Pointer
	OptCategory[STARS_NN_wrssd] = 1;                // Write (4 bytes) to shadow stack
	OptCategory[STARS_NN_wrssq] = 1;                // Write (8 bytes) to shadow stack
	OptCategory[STARS_NN_wrussd] = 1;               // Write (4 bytes) to User Shadow Stack
	OptCategory[STARS_NN_wrussq] = 1;               // Write (8 bytes) to User Shadow Stack
	OptCategory[STARS_NN_setssbsy] = 1;             // Mark Shadow Stack Busy
	OptCategory[STARS_NN_clrssbsy] = 1;             // Clear Shadow Stack Busy Flag
	OptCategory[STARS_NN_endbr64] = 1;              // Terminate an Indirect Branch in 64-bit Mode
	OptCategory[STARS_NN_endbr32] = 1;              // Terminate an Indirect Branch in 32-bit and Compatibility Mode

	// Undefined Instruction

	OptCategory[STARS_NN_ud0] = 1;                 // Undefined Instruction
	OptCategory[STARS_NN_ud1] = 1;                 // Undefined Instruction

	// Enqueue Stores

	OptCategory[STARS_NN_enqcmd] = 1;              // Enqueue Command
	OptCategory[STARS_NN_enqcmds] = 1;             // Enqueue Command Supervisor

	// AMD Zen2

	OptCategory[STARS_NN_mcommit] = 1;             // Commit Stores to Memory
	OptCategory[STARS_NN_rdpru] = 8;               // Read Processor Register

	// Intel Tremont instructions

	OptCategory[STARS_NN_cldemote] = 1;            // Cache Line Demote
	OptCategory[STARS_NN_enclv] = 1;               // Execute an Enclave VMM Function of Specified Leaf Number

	// Direct Stores

	OptCategory[STARS_NN_movdiri] = 1;             // Move Doubleword as Direct Store
	OptCategory[STARS_NN_movdir64b] = 1;           // Move 64 Bytes as Direct Store

	// Intel WAITPKG instructions

	OptCategory[STARS_NN_tpause] = 1;              // Timed PAUSE
	OptCategory[STARS_NN_umonitor] = 1;            // User Level Set Up Monitor Address
	OptCategory[STARS_NN_umwait] = 1;              // User Level Monitor Wait

	// Intel Sapphire Rapids instructions

	OptCategory[STARS_NN_serialize] = 1;           // Serialize Instruction Execution

	// Intel TSX

	OptCategory[STARS_NN_xresldtrk] = 1;           // Resume Tracking Load Addresses
	OptCategory[STARS_NN_xsusldtrk] = 1;           // Suspend Tracking Load Addresses

	// Intel Affine Transformation instructions

	OptCategory[STARS_NN_gf2p8mulb] = 1;           // Galois Field Multiply Bytes
	OptCategory[STARS_NN_gf2p8affineqb] = 1;       // Computes Affine Transformation
	OptCategory[STARS_NN_gf2p8affineinvqb] = 1;    // Computes Inverse Affine Transformation

	// VEX versions
	OptCategory[STARS_NN_vgf2p8mulb] = 1;          // Galois Field Multiply Bytes
	OptCategory[STARS_NN_vgf2p8affineqb] = 1;      // Computes Affine Transformation
	OptCategory[STARS_NN_vgf2p8affineinvqb] = 1;   // Computes Inverse Affine Transformation

	// Intrinsics for Saving and Restoring the Extended Processor States (64-bits)

	OptCategory[STARS_NN_fxsave64] = 1;            // Fast save FP context (64-bits)
	OptCategory[STARS_NN_fxrstor64] = 1;           // Fast restore FP context (64-bits)

	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

	// 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

	// FMA4

	// Intel Memory Protection Extensions (MPX)

	// New xstate instructions

	// PREFETCHWT1 support

	// Memory instructions

	// Protection Key Rights for User Pages

	// AVX comparison pseudo-ops

	// AVX-512 instructions

	// AVX-512 comparison pseudo-ops

	// Opmask instructions

	// SHA Extensions

	// Intel Software Guard Extensions

	// AMD XOP

	// AMP XOP comparison pseudo-ops

	// AMD Excavator

	// AMD Zen

	// Intel Processor Trace

	// new Intel AVX-512 instructions (December 2016)

	// Read Processor ID

	// Invoke VM function

	// Control-flow Enforcement

	// Undefined Instruction

	// Enqueue Stores

	// AMD Zen2

	// Intel Tremont instructions

	// Direct Stores

	// Intel WAITPKG instructions

	// Intel Sapphire Rapids instructions

	// Intel TSX

	// Intel Affine Transformation instructions

	// VEX versions

	// Intrinsics for Saving and Restoring the Extended Processor States (64-bits)


	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) {

	// empty it in case it was filled from a prevoius stars invocation.
	ReturnRegisterTypeMap.clear();

	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. (Really, control flow analysis.)
void STARS_Program_t::InitDFACategory(void) 
{
	if(processor_type==ptARM64)
	{
		DFACategory.resize(STARS_ARM_last+1);
		DFACategory[STARS_ARM_bl]  = CALL;                    
		DFACategory[STARS_ARM_blr] = INDIR_CALL;              
		DFACategory[STARS_ARM_br]  = INDIR_JUMP;             
		DFACategory[STARS_ARM_ret] = RETURN;                
	}
	else
	{
		// Default category is 0, not the start or end of a basic block.
		DFACategory.resize(STARS_NN_last+1);

		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] = INDIR_CALL;            // Fast Transition to System Call Entry Point
		DFACategory[STARS_NN_sysexit] = RETURN;             // Fast Transition from System Call Entry Point

		// AMD syscall/sysret instructions  NOTE: not AMD, found in Intel manual

		DFACategory[STARS_NN_syscall] = INDIR_CALL;             // Low latency system call
		DFACategory[STARS_NN_sysret] = RETURN;              // 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

		// FMA4

		// Intel Memory Protection Extensions (MPX)

		// New xstate instructions

		// PREFETCHWT1 support

		// Memory instructions

		// Protection Key Rights for User Pages

		// AVX comparison pseudo-ops

		// AVX-512 instructions

		// AVX-512 comparison pseudo-ops

		// Opmask instructions

		// SHA Extensions

		// Intel Software Guard Extensions

		// AMD XOP

		// AMP XOP comparison pseudo-ops

		// AMD Excavator

		// AMD Zen

		// Intel Processor Trace

		// new Intel AVX-512 instructions (December 2016)

		// Read Processor ID

		// Invoke VM function

		// Control-flow Enforcement

		// Undefined Instruction

		// Enqueue Stores

		// AMD Zen2

		// Intel Tremont instructions

		// Direct Stores

		// Intel WAITPKG instructions

		// Intel Sapphire Rapids instructions

		// Intel TSX

		// Intel Affine Transformation instructions

		// VEX versions

		// Intrinsics for Saving and Restoring the Extended Processor States (64-bits)


		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


	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
#if (IDA_SDK_VERSION < 700)      // Incredibly, these opcodes were removed in IDA Pro 7.0
	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
#endif
	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

	// FMA4
	SMPDefsFlags[STARS_NN_vfmaddsubps] = false;          // Multiply with Alternating Add/Subtract of Packed Single-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfmaddsubpd] = false;          // Multiply with Alternating Add/Subtract of Packed Double-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfmsubaddps] = false;          // Multiply with Alternating Subtract/Add of Packed Single-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfmsubaddpd] = false;          // Multiply with Alternating Subtract/Add of Packed Double-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfmaddps] = false;             // Multiply and Add Packed Single-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfmaddpd] = false;             // Multiply and Add Packed Double-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfmaddss] = false;             // Multiply and Add Scalar Single-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfmaddsd] = false;             // Multiply and Add Scalar Double-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfmsubps] = false;             // Multiply and Subtract Packed Single-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfmsubpd] = false;             // Multiply and Subtract Packed Double-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfmsubss] = false;             // Multiply and Subtract Scalar Single-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfmsubsd] = false;             // Multiply and Subtract Scalar Double-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfnmaddps] = false;            // Negative Multiply and Add Packed Single-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfnmaddpd] = false;            // Negative Multiply and Add Packed Double-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfnmaddss] = false;            // Negative Multiply and Add Scalar Single-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfnmaddsd] = false;            // Negative Multiply and Add Double Single-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfnmsubps] = false;            // Negative Multiply and Subtract Packed Single-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfnmsubpd] = false;            // Negative Multiply and Subtract Packed Double-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfnmsubss] = false;            // Negative Multiply and Subtract Scalar Single-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfnmsubsd] = false;            // Negative Multiply and Subtract Double Single-Precision Floating-Point

	// Intel Memory Protection Extensions (MPX)

	SMPDefsFlags[STARS_NN_bndmk] = false;                // Make Bounds
	SMPDefsFlags[STARS_NN_bndcl] = false;                // Check Lower Bound
	SMPDefsFlags[STARS_NN_bndcu] = false;                // Check Upper Bound
	SMPDefsFlags[STARS_NN_bndcn] = false;                // Check Upper Bound
	SMPDefsFlags[STARS_NN_bndmov] = false;               // Move Bounds
	SMPDefsFlags[STARS_NN_bndldx] = false;               // Load Extended Bounds Using Address Translation
	SMPDefsFlags[STARS_NN_bndstx] = false;               // Store Extended Bounds Using Address Translation

	// New xstate instructions

	SMPDefsFlags[STARS_NN_xrstors] = false;              // Restore Processor Extended States Supervisor
	SMPDefsFlags[STARS_NN_xsavec] = false;               // Save Processor Extended States with Compaction
	SMPDefsFlags[STARS_NN_xsaves] = false;               // Save Processor Extended States Supervisor

	// PREFETCHWT1 support

	SMPDefsFlags[STARS_NN_prefetchwt1] = true;          // Prefetch Vector Data Into Caches with Intent to Write and T1 Hint

	// Memory instructions

	SMPDefsFlags[STARS_NN_clflushopt] = false;           // Flush a Cache Line Optimized
	SMPDefsFlags[STARS_NN_clwb] = false;                 // Cache Line Write Back
	SMPDefsFlags[STARS_NN_pcommit] = false;              // Persistent Commit (deprecated by Intel)

	// Protection Key Rights for User Pages

	SMPDefsFlags[STARS_NN_rdpkru] = false;               // Read Protection Key Rights for User Pages
	SMPDefsFlags[STARS_NN_wrpkru] = false;               // Write Data to User Page Key Register

	// AVX comparison pseudo-ops

	SMPDefsFlags[STARS_NN_vcmpeqpd] = false;             // Compare Packed Double-Precision Floating-Point Values - Equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpltpd] = false;             // Compare Packed Double-Precision Floating-Point Values - Less-than (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmplepd] = false;             // Compare Packed Double-Precision Floating-Point Values - Less-than-or-equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpunordpd] = false;          // Compare Packed Double-Precision Floating-Point Values - Unordered (non-signaling)
	SMPDefsFlags[STARS_NN_vcmpneqpd] = false;            // Compare Packed Double-Precision Floating-Point Values - Not-equal (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpnltpd] = false;            // Compare Packed Double-Precision Floating-Point Values - Not-less-than (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpnlepd] = false;            // Compare Packed Double-Precision Floating-Point Values - Not-less-than-or-equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpordpd] = false;            // Compare Packed Double-Precision Floating-Point Values - Ordered (non-signaling)
	SMPDefsFlags[STARS_NN_vcmpeq_uqpd] = false;          // Compare Packed Double-Precision Floating-Point Values - Equal (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpngepd] = false;            // Compare Packed Double-Precision Floating-Point Values - Not-greater-than-or-equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpngtpd] = false;            // Compare Packed Double-Precision Floating-Point Values - Not-greater-than (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpfalsepd] = false;          // Compare Packed Double-Precision Floating-Point Values - False (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpneq_oqpd] = false;         // Compare Packed Double-Precision Floating-Point Values - Not-equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpgepd] = false;             // Compare Packed Double-Precision Floating-Point Values - Greater-than-or-equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpgtpd] = false;             // Compare Packed Double-Precision Floating-Point Values - Greater-than (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmptruepd] = false;           // Compare Packed Double-Precision Floating-Point Values - True (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpeq_ospd] = false;          // Compare Packed Double-Precision Floating-Point Values - Equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmplt_oqpd] = false;          // Compare Packed Double-Precision Floating-Point Values - Less-than (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmple_oqpd] = false;          // Compare Packed Double-Precision Floating-Point Values - Less-than-or-equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpunord_spd] = false;        // Compare Packed Double-Precision Floating-Point Values - Unordered (signaling)
	SMPDefsFlags[STARS_NN_vcmpneq_uspd] = false;         // Compare Packed Double-Precision Floating-Point Values - Not-equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpnlt_uqpd] = false;         // Compare Packed Double-Precision Floating-Point Values - Not-less-than (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpnle_uqpd] = false;         // Compare Packed Double-Precision Floating-Point Values - Not-less-than-or-equal (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpord_spd] = false;          // Compare Packed Double-Precision Floating-Point Values - Ordered (signaling)
	SMPDefsFlags[STARS_NN_vcmpeq_uspd] = false;          // Compare Packed Double-Precision Floating-Point Values - Equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpnge_uqpd] = false;         // Compare Packed Double-Precision Floating-Point Values - Not-greater-than-or-equal (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpngt_uqpd] = false;         // Compare Packed Double-Precision Floating-Point Values - Not-greater-than (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpfalse_ospd] = false;       // Compare Packed Double-Precision Floating-Point Values - False (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpneq_ospd] = false;         // Compare Packed Double-Precision Floating-Point Values - Not-equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpge_oqpd] = false;          // Compare Packed Double-Precision Floating-Point Values - Greater-than-or-equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpgt_oqpd] = false;          // Compare Packed Double-Precision Floating-Point Values - Greater-than (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmptrue_uspd] = false;        // Compare Packed Double-Precision Floating-Point Values - True (unordered, signaling)

	SMPDefsFlags[STARS_NN_vcmpeqps] = false;             // Packed Single-FP Compare - Equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpltps] = false;             // Packed Single-FP Compare - Less-than (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpleps] = false;             // Packed Single-FP Compare - Less-than-or-equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpunordps] = false;          // Packed Single-FP Compare - Unordered (non-signaling)
	SMPDefsFlags[STARS_NN_vcmpneqps] = false;            // Packed Single-FP Compare - Not-equal (unordered, non-signaling)

	SMPDefsFlags[STARS_NN_vcmpnltps] = false;            // Packed Single-FP Compare - Not-less-than (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpnleps] = false;            // Packed Single-FP Compare - Not-less-than-or-equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpordps] = false;            // Packed Single-FP Compare - Ordered (non-signaling)
	SMPDefsFlags[STARS_NN_vcmpeq_uqps] = false;          // Packed Single-FP Compare - Equal (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpngeps] = false;            // Packed Single-FP Compare - Not-greater-than-or-equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpngtps] = false;            // Packed Single-FP Compare - Not-greater-than (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpfalseps] = false;          // Packed Single-FP Compare - False (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpneq_oqps] = false;         // Packed Single-FP Compare - Not-equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpgeps] = false;             // Packed Single-FP Compare - Greater-than-or-equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpgtps] = false;             // Packed Single-FP Compare - Greater-than (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmptrueps] = false;           // Packed Single-FP Compare - True (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpeq_osps] = false;          // Packed Single-FP Compare - Equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmplt_oqps] = false;          // Packed Single-FP Compare - Less-than (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmple_oqps] = false;          // Packed Single-FP Compare - Less-than-or-equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpunord_sps] = false;        // Packed Single-FP Compare - Unordered (signaling)
	SMPDefsFlags[STARS_NN_vcmpneq_usps] = false;         // Packed Single-FP Compare - Not-equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpnlt_uqps] = false;         // Packed Single-FP Compare - Not-less-than (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpnle_uqps] = false;         // Packed Single-FP Compare - Not-less-than-or-equal (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpord_sps] = false;          // Packed Single-FP Compare - Ordered (signaling)
	SMPDefsFlags[STARS_NN_vcmpeq_usps] = false;          // Packed Single-FP Compare - Equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpnge_uqps] = false;         // Packed Single-FP Compare - Not-greater-than-or-equal (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpngt_uqps] = false;         // Packed Single-FP Compare - Not-greater-than (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpfalse_osps] = false;       // Packed Single-FP Compare - False (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpneq_osps] = false;         // Packed Single-FP Compare - Not-equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpge_oqps] = false;          // Packed Single-FP Compare - Greater-than-or-equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpgt_oqps] = false;          // Packed Single-FP Compare - Greater-than (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmptrue_usps] = false;        // Packed Single-FP Compare - True (unordered, signaling)


	SMPDefsFlags[STARS_NN_vcmpeqsd] = false;             // Compare Scalar Double-Precision Floating-Point Values - Equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpltsd] = false;             // Compare Scalar Double-Precision Floating-Point Values - Less-than (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmplesd] = false;             // Compare Scalar Double-Precision Floating-Point Values - Less-than-or-equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpunordsd] = false;          // Compare Scalar Double-Precision Floating-Point Values - Unordered (non-signaling)
	SMPDefsFlags[STARS_NN_vcmpneqsd] = false;            // Compare Scalar Double-Precision Floating-Point Values - Not-equal (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpnltsd] = false;            // Compare Scalar Double-Precision Floating-Point Values - Not-less-than (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpnlesd] = false;            // Compare Scalar Double-Precision Floating-Point Values - Not-less-than-or-equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpordsd] = false;            // Compare Scalar Double-Precision Floating-Point Values - Ordered (non-signaling)
	SMPDefsFlags[STARS_NN_vcmpeq_uqsd] = false;          // Compare Scalar Double-Precision Floating-Point Values - Equal (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpngesd] = false;            // Compare Scalar Double-Precision Floating-Point Values - Not-greater-than-or-equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpngtsd] = false;            // Compare Scalar Double-Precision Floating-Point Values - Not-greater-than (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpfalsesd] = false;          // Compare Scalar Double-Precision Floating-Point Values - False (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpneq_oqsd] = false;         // Compare Scalar Double-Precision Floating-Point Values - Not-equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpgesd] = false;             // Compare Scalar Double-Precision Floating-Point Values - Greater-than-or-equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpgtsd] = false;             // Compare Scalar Double-Precision Floating-Point Values - Greater-than (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmptruesd] = false;           // Compare Scalar Double-Precision Floating-Point Values - True (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpeq_ossd] = false;          // Compare Scalar Double-Precision Floating-Point Values - Equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmplt_oqsd] = false;          // Compare Scalar Double-Precision Floating-Point Values - Less-than (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmple_oqsd] = false;          // Compare Scalar Double-Precision Floating-Point Values - Less-than-or-equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpunord_ssd] = false;        // Compare Scalar Double-Precision Floating-Point Values - Unordered (signaling)
	SMPDefsFlags[STARS_NN_vcmpneq_ussd] = false;         // Compare Scalar Double-Precision Floating-Point Values - Not-equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpnlt_uqsd] = false;         // Compare Scalar Double-Precision Floating-Point Values - Not-less-than (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpnle_uqsd] = false;         // Compare Scalar Double-Precision Floating-Point Values - Not-less-than-or-equal (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpord_ssd] = false;          // Compare Scalar Double-Precision Floating-Point Values - Ordered (signaling)
	SMPDefsFlags[STARS_NN_vcmpeq_ussd] = false;          // Compare Scalar Double-Precision Floating-Point Values - Equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpnge_uqsd] = false;         // Compare Scalar Double-Precision Floating-Point Values - Not-greater-than-or-equal (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpngt_uqsd] = false;         // Compare Scalar Double-Precision Floating-Point Values - Not-greater-than (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpfalse_ossd] = false;       // Compare Scalar Double-Precision Floating-Point Values - False (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpneq_ossd] = false;         // Compare Scalar Double-Precision Floating-Point Values - Not-equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpge_oqsd] = false;          // Compare Scalar Double-Precision Floating-Point Values - Greater-than-or-equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpgt_oqsd] = false;          // Compare Scalar Double-Precision Floating-Point Values - Greater-than (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmptrue_ussd] = false;        // Compare Scalar Double-Precision Floating-Point Values - True (unordered, signaling)


	SMPDefsFlags[STARS_NN_vcmpeqss] = false;             // Scalar Single-FP Compare - Equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpltss] = false;             // Scalar Single-FP Compare - Less-than (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpless] = false;             // Scalar Single-FP Compare - Less-than-or-equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpunordss] = false;          // Scalar Single-FP Compare - Unordered (non-signaling)
	SMPDefsFlags[STARS_NN_vcmpneqss] = false;            // Scalar Single-FP Compare - Not-equal (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpnltss] = false;            // Scalar Single-FP Compare - Not-less-than (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpnless] = false;            // Scalar Single-FP Compare - Not-less-than-or-equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpordss] = false;            // Scalar Single-FP Compare - Ordered (non-signaling)
	SMPDefsFlags[STARS_NN_vcmpeq_uqss] = false;          // Scalar Single-FP Compare - Equal (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpngess] = false;            // Scalar Single-FP Compare - Not-greater-than-or-equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpngtss] = false;            // Scalar Single-FP Compare - Not-greater-than (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpfalsess] = false;          // Scalar Single-FP Compare - False (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpneq_oqss] = false;         // Scalar Single-FP Compare - Not-equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpgess] = false;             // Scalar Single-FP Compare - Greater-than-or-equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpgtss] = false;             // Scalar Single-FP Compare - Greater-than (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmptruess] = false;           // Scalar Single-FP Compare - True (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpeq_osss] = false;          // Scalar Single-FP Compare - Equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmplt_oqss] = false;          // Scalar Single-FP Compare - Less-than (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmple_oqss] = false;          // Scalar Single-FP Compare - Less-than-or-equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpunord_sss] = false;        // Scalar Single-FP Compare - Unordered (signaling)
	SMPDefsFlags[STARS_NN_vcmpneq_usss] = false;         // Scalar Single-FP Compare - Not-equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpnlt_uqss] = false;         // Scalar Single-FP Compare - Not-less-than (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpnle_uqss] = false;         // Scalar Single-FP Compare - Not-less-than-or-equal (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpord_sss] = false;          // Scalar Single-FP Compare - Ordered (signaling)
	SMPDefsFlags[STARS_NN_vcmpeq_usss] = false;          // Scalar Single-FP Compare - Equal (unordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpnge_uqss] = false;         // Scalar Single-FP Compare - Not-greater-than-or-equal (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpngt_uqss] = false;         // Scalar Single-FP Compare - Not-greater-than (unordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpfalse_osss] = false;       // Scalar Single-FP Compare - False (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpneq_osss] = false;         // Scalar Single-FP Compare - Not-equal (ordered, signaling)
	SMPDefsFlags[STARS_NN_vcmpge_oqss] = false;          // Scalar Single-FP Compare - Greater-than-or-equal (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmpgt_oqss] = false;          // Scalar Single-FP Compare - Greater-than (ordered, non-signaling)
	SMPDefsFlags[STARS_NN_vcmptrue_usss] = false;        // Scalar Single-FP Compare - True (unordered, signaling)

	// AVX-512 instructions

	SMPDefsFlags[STARS_NN_valignd] = false;              // Align Doubleword Vectors
	SMPDefsFlags[STARS_NN_valignq] = false;              // Align Quadword Vectors
	SMPDefsFlags[STARS_NN_vblendmpd] = false;            // Blend Float64 Vectors Using an OpMask Control
	SMPDefsFlags[STARS_NN_vblendmps] = false;            // Blend Float32 Vectors Using an OpMask Control
	SMPDefsFlags[STARS_NN_vpblendmb] = false;            // Blend Byte Vectors Using an Opmask Control
	SMPDefsFlags[STARS_NN_vpblendmw] = false;            // Blend Word Vectors Using an Opmask Control
	SMPDefsFlags[STARS_NN_vpblendmd] = false;            // Blend Int32 Vectors Using an OpMask Control
	SMPDefsFlags[STARS_NN_vpblendmq] = false;            // Blend Int64 Vectors Using an OpMask Control
	SMPDefsFlags[STARS_NN_vbroadcastf32x2] = false;      // Load with Broadcast Floating-Point Data
	SMPDefsFlags[STARS_NN_vbroadcastf32x4] = false;      // Load with Broadcast Floating-Point Data
	SMPDefsFlags[STARS_NN_vbroadcastf64x2] = false;      // Load with Broadcast Floating-Point Data
	SMPDefsFlags[STARS_NN_vbroadcastf32x8] = false;      // Load with Broadcast Floating-Point Data
	SMPDefsFlags[STARS_NN_vbroadcastf64x4] = false;      // Load with Broadcast Floating-Point Data
	SMPDefsFlags[STARS_NN_vbroadcasti32x2] = false;      // Load Integer and Broadcast
	SMPDefsFlags[STARS_NN_vbroadcasti32x4] = false;      // Load Integer and Broadcast
	SMPDefsFlags[STARS_NN_vbroadcasti64x2] = false;      // Load Integer and Broadcast
	SMPDefsFlags[STARS_NN_vbroadcasti32x8] = false;      // Load Integer and Broadcast
	SMPDefsFlags[STARS_NN_vbroadcasti64x4] = false;      // Load Integer and Broadcast
	SMPDefsFlags[STARS_NN_vcompresspd] = false;          // Store Sparse Packed Double-Precision Floating-Point Values into Dense Memory
	SMPDefsFlags[STARS_NN_vcompressps] = false;          // Store Sparse Packed Single-Precision Floating-Point Values into Dense Memory
	SMPDefsFlags[STARS_NN_vcvtpd2qq] = false;            // Convert Packed Double-Precision Floating-Point Values to Packed Quadword Integers
	SMPDefsFlags[STARS_NN_vcvtpd2udq] = false;           // Convert Packed Double-Precision Floating-Point Values to Packed Unsigned Doubleword Integers
	SMPDefsFlags[STARS_NN_vcvtpd2uqq] = false;           // Convert Packed Double-Precision Floating-Point Values to Packed Unsigned Quadword Integers
	SMPDefsFlags[STARS_NN_vcvtps2udq] = false;           // Convert Packed Single-Precision Floating-Point Values to Packed Unsigned Doubleword Integer Values
	SMPDefsFlags[STARS_NN_vcvtps2qq] = false;            // Convert Packed Single Precision Floating-Point Values to Packed Singed Quadword Integer Values
	SMPDefsFlags[STARS_NN_vcvtps2uqq] = false;           // Convert Packed Single Precision Floating-Point Values to Packed Unsigned Quadword Integer Values
	SMPDefsFlags[STARS_NN_vcvtqq2pd] = false;            // Convert Packed Quadword Integers to Packed Double-Precision Floating-Point Values
	SMPDefsFlags[STARS_NN_vcvtqq2ps] = false;            // Convert Packed Quadword Integers to Packed Single-Precision Floating-Point Values
	SMPDefsFlags[STARS_NN_vcvtsd2usi] = false;           // Convert Scalar Double-Precision Floating-Point Value to Unsigned Doubleword Integer
	SMPDefsFlags[STARS_NN_vcvtss2usi] = false;           // Convert Scalar Single-Precision Floating-Point Value to Unsigned Doubleword Integer
	SMPDefsFlags[STARS_NN_vcvttpd2qq] = false;           // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Quadword Integers
	SMPDefsFlags[STARS_NN_vcvttpd2udq] = false;          // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Unsigned Doubleword Integers
	SMPDefsFlags[STARS_NN_vcvttpd2uqq] = false;          // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Unsigned Quadword Integers
	SMPDefsFlags[STARS_NN_vcvttps2udq] = false;          // Convert with Truncation Packed Single-Precision Floating-Point Values to Packed Unsigned Doubleword Integer Values
	SMPDefsFlags[STARS_NN_vcvttps2qq] = false;           // Convert with Truncation Packed Single Precision Floating-Point Values to Packed Singed Quadword Integer Values
	SMPDefsFlags[STARS_NN_vcvttps2uqq] = false;          // Convert with Truncation Packed Single Precision Floating-Point Values to Packed Unsigned Quadword Integer Values
	SMPDefsFlags[STARS_NN_vcvttsd2usi] = false;          // Convert with Truncation Scalar Double-Precision Floating-Point Value to Unsigned Integer
	SMPDefsFlags[STARS_NN_vcvttss2usi] = false;          // Convert with Truncation Scalar Single-Precision Floating-Point Value to Unsigned Integer
	SMPDefsFlags[STARS_NN_vcvtudq2pd] = false;           // Convert Packed Unsigned Doubleword Integers to Packed Double-Precision Floating-Point Values
	SMPDefsFlags[STARS_NN_vcvtudq2ps] = false;           // Convert Packed Unsigned Doubleword Integers to Packed Single-Precision Floating-Point Values
	SMPDefsFlags[STARS_NN_vcvtuqq2pd] = false;           // Convert Packed Unsigned Quadword Integers to Packed Double-Precision Floating-Point Values
	SMPDefsFlags[STARS_NN_vcvtuqq2ps] = false;           // Convert Packed Unsigned Quadword Integers to Packed Single-Precision Floating-Point Values
	SMPDefsFlags[STARS_NN_vcvtusi2sd] = false;           // Convert Unsigned Integer to Scalar Double-Precision Floating-Point Value
	SMPDefsFlags[STARS_NN_vcvtusi2ss] = false;           // Convert Unsigned Integer to Scalar Single-Precision Floating-Point Value
	SMPDefsFlags[STARS_NN_vdbpsadbw] = false;            // Double Block Packed Sum-Absolute-Differences (SAD) on Unsigned Bytes
	SMPDefsFlags[STARS_NN_vexpandpd] = false;            // Load Sparse Packed Double-Precision Floating-Point Values from Dense Memory
	SMPDefsFlags[STARS_NN_vexpandps] = false;            // Load Sparse Packed Single-Precision Floating-Point Values from Dense Memory
	SMPDefsFlags[STARS_NN_vextractf32x4] = false;        // Extract Packed Floating-Point Values
	SMPDefsFlags[STARS_NN_vextractf64x2] = false;        // Extract Packed Floating-Point Values
	SMPDefsFlags[STARS_NN_vextractf32x8] = false;        // Extract Packed Floating-Point Values
	SMPDefsFlags[STARS_NN_vextractf64x4] = false;        // Extract Packed Floating-Point Values
	SMPDefsFlags[STARS_NN_vextracti32x4] = false;        // Extract packed Integer Values
	SMPDefsFlags[STARS_NN_vextracti64x2] = false;        // Extract packed Integer Values
	SMPDefsFlags[STARS_NN_vextracti32x8] = false;        // Extract packed Integer Values
	SMPDefsFlags[STARS_NN_vextracti64x4] = false;        // Extract packed Integer Values
	SMPDefsFlags[STARS_NN_vfixupimmpd] = false;          // Fix Up Special Packed Float64 Values
	SMPDefsFlags[STARS_NN_vfixupimmps] = false;          // Fix Up Special Packed Float32 Values
	SMPDefsFlags[STARS_NN_vfixupimmsd] = false;          // Fix Up Special Scalar Float64 Value
	SMPDefsFlags[STARS_NN_vfixupimmss] = false;          // Fix Up Special Scalar Float32 Value
	SMPDefsFlags[STARS_NN_vfpclasspd] = false;           // Tests Types Of a Packed Float64 Values
	SMPDefsFlags[STARS_NN_vfpclassps] = false;           // Tests Types Of a Packed Float32 Values
	SMPDefsFlags[STARS_NN_vfpclasssd] = false;           // Tests Types Of a Scalar Float64 Values
	SMPDefsFlags[STARS_NN_vfpclassss] = false;           // Tests Types Of a Scalar Float32 Values
	SMPDefsFlags[STARS_NN_vgetexppd] = false;            // Convert Exponents of Packed DP FP Values to DP FP Values
	SMPDefsFlags[STARS_NN_vgetexpps] = false;            // Convert Exponents of Packed SP FP Values to SP FP Values
	SMPDefsFlags[STARS_NN_vgetexpsd] = false;            // Convert Exponents of Scalar DP FP Values to DP FP Value
	SMPDefsFlags[STARS_NN_vgetexpss] = false;            // Convert Exponents of Scalar SP FP Values to SP FP Value
	SMPDefsFlags[STARS_NN_vgetmantpd] = false;           // Extract Float64 Vector of Normalized Mantissas from Float64 Vector
	SMPDefsFlags[STARS_NN_vgetmantps] = false;           // Extract Float32 Vector of Normalized Mantissas from Float32 Vector
	SMPDefsFlags[STARS_NN_vgetmantsd] = false;           // Extract Float64 of Normalized Mantissas from Float64 Scalar
	SMPDefsFlags[STARS_NN_vgetmantss] = false;           // Extract Float32 Vector of Normalized Mantissa from Float32 Vector
	SMPDefsFlags[STARS_NN_vinsertf32x4] = false;         // Insert Packed Floating-Point Values
	SMPDefsFlags[STARS_NN_vinsertf64x2] = false;         // Insert Packed Floating-Point Values
	SMPDefsFlags[STARS_NN_vinsertf32x8] = false;         // Insert Packed Floating-Point Values
	SMPDefsFlags[STARS_NN_vinsertf64x4] = false;         // Insert Packed Floating-Point Values
	SMPDefsFlags[STARS_NN_vinserti32x4] = false;         // Insert Packed Integer Values
	SMPDefsFlags[STARS_NN_vinserti64x2] = false;         // Insert Packed Integer Values
	SMPDefsFlags[STARS_NN_vinserti32x8] = false;         // Insert Packed Integer Values
	SMPDefsFlags[STARS_NN_vinserti64x4] = false;         // Insert Packed Integer Values
	SMPDefsFlags[STARS_NN_vmovdqa32] = false;            // Move Aligned Packed Integer Values
	SMPDefsFlags[STARS_NN_vmovdqa64] = false;            // Move Aligned Packed Integer Values
	SMPDefsFlags[STARS_NN_vmovdqu8] = false;             // Move Unaligned Packed Integer Values
	SMPDefsFlags[STARS_NN_vmovdqu16] = false;            // Move Unaligned Packed Integer Values
	SMPDefsFlags[STARS_NN_vmovdqu32] = false;            // Move Unaligned Packed Integer Values
	SMPDefsFlags[STARS_NN_vmovdqu64] = false;            // Move Unaligned Packed Integer Values
	SMPDefsFlags[STARS_NN_vpabsq] = false;               // Packed Absolute Value
	SMPDefsFlags[STARS_NN_vpandd] = false;               // Logical AND
	SMPDefsFlags[STARS_NN_vpandq] = false;               // Logical AND
	SMPDefsFlags[STARS_NN_vpandnd] = false;              // Logical AND NOT
	SMPDefsFlags[STARS_NN_vpandnq] = false;              // Logical AND NOT
	SMPDefsFlags[STARS_NN_vpbroadcastmb2q] = false;      // Broadcast Mask to Vector Register
	SMPDefsFlags[STARS_NN_vpbroadcastmw2d] = false;      // Broadcast Mask to Vector Register
	SMPDefsFlags[STARS_NN_vpcmpb] = false;               // Compare Packed Byte Values Into Mask
	SMPDefsFlags[STARS_NN_vpcmpub] = false;              // Compare Packed Byte Values Into Mask
	SMPDefsFlags[STARS_NN_vpcmpd] = false;               // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpud] = false;              // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpq] = false;               // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpuq] = false;              // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpw] = false;               // Compare Packed Word Values Into Mask
	SMPDefsFlags[STARS_NN_vpcmpuw] = false;              // Compare Packed Word Values Into Mask
	SMPDefsFlags[STARS_NN_vpcompressd] = false;          // Store Sparse Packed Doubleword Integer Values into Dense Memory/Register
	SMPDefsFlags[STARS_NN_vpcompressq] = false;          // Store Sparse Packed Quadword Integer Values into Dense Memory/Register
	SMPDefsFlags[STARS_NN_vpconflictd] = false;          // Detect Conflicts Within a Vector of Packed Dword Values into Dense Memory/Register
	SMPDefsFlags[STARS_NN_vpconflictq] = false;          // Detect Conflicts Within a Vector of Packed Qword Values into Dense Memory/Register
	SMPDefsFlags[STARS_NN_vpermb] = false;               // Permute Packed Bytes Elements
	SMPDefsFlags[STARS_NN_vpermw] = false;               // Permute Packed Words Elements
	SMPDefsFlags[STARS_NN_vpermi2b] = false;             // Full Permute of Bytes From Two Tables Overwriting the Index
	SMPDefsFlags[STARS_NN_vpermi2w] = false;             // Full Permute From Two Tables Overwriting the Index
	SMPDefsFlags[STARS_NN_vpermi2d] = false;             // Full Permute From Two Tables Overwriting the Index
	SMPDefsFlags[STARS_NN_vpermi2q] = false;             // Full Permute From Two Tables Overwriting the Index
	SMPDefsFlags[STARS_NN_vpermi2ps] = false;            // Full Permute From Two Tables Overwriting the Index
	SMPDefsFlags[STARS_NN_vpermi2pd] = false;            // Full Permute From Two Tables Overwriting the Index
	SMPDefsFlags[STARS_NN_vpermt2b] = false;             // Full Permute of Bytes From Two Tables Overwriting a Table
	SMPDefsFlags[STARS_NN_vpermt2w] = false;             // Full Permute from Two Tables Overwriting one Table
	SMPDefsFlags[STARS_NN_vpermt2d] = false;             // Full Permute from Two Tables Overwriting one Table
	SMPDefsFlags[STARS_NN_vpermt2q] = false;             // Full Permute from Two Tables Overwriting one Table
	SMPDefsFlags[STARS_NN_vpermt2ps] = false;            // Full Permute from Two Tables Overwriting one Table
	SMPDefsFlags[STARS_NN_vpermt2pd] = false;            // Full Permute from Two Tables Overwriting one Table
	SMPDefsFlags[STARS_NN_vpexpandd] = false;            // Load Sparse Packed Doubleword Integer Values from Dense Memory/Register
	SMPDefsFlags[STARS_NN_vpexpandq] = false;            // Load Sparse Packed Quadword Integer Values from Dense Memory/Register
	SMPDefsFlags[STARS_NN_vplzcntd] = false;             // Count the Number of Leading Zero Bits for Packed Dword Values
	SMPDefsFlags[STARS_NN_vplzcntq] = false;             // Count the Number of Leading Zero Bits for Packed Qword Values
	SMPDefsFlags[STARS_NN_vpmadd52luq] = false;          // Packed Multiply of Unsigned 52-bit Integers and Add the Low 52-bit Products to Qword Accumulators
	SMPDefsFlags[STARS_NN_vpmadd52huq] = false;          // Packed Multiply of Unsigned 52-bit Unsigned Integers and Add High 52-bit Products to 64-bit Accumulators
	SMPDefsFlags[STARS_NN_vpmaxsq] = false;              // Maximum of Packed Signed Integers
	SMPDefsFlags[STARS_NN_vpmaxuq] = false;              // Maximum of Packed Unsigned Integers
	SMPDefsFlags[STARS_NN_vpminsq] = false;              // Minimum of Packed Signed Integers
	SMPDefsFlags[STARS_NN_vpminuq] = false;              // Minimum of Packed Unsigned Integers
	SMPDefsFlags[STARS_NN_vpmovm2b] = false;             // Convert a Mask Register to a Vector Register
	SMPDefsFlags[STARS_NN_vpmovm2w] = false;             // Convert a Mask Register to a Vector Register
	SMPDefsFlags[STARS_NN_vpmovm2d] = false;             // Convert a Mask Register to a Vector Register
	SMPDefsFlags[STARS_NN_vpmovm2q] = false;             // Convert a Mask Register to a Vector Register
	SMPDefsFlags[STARS_NN_vpmovb2m] = false;             // Convert a Vector Register to a Mask
	SMPDefsFlags[STARS_NN_vpmovw2m] = false;             // Convert a Vector Register to a Mask
	SMPDefsFlags[STARS_NN_vpmovd2m] = false;             // Convert a Vector Register to a Mask
	SMPDefsFlags[STARS_NN_vpmovq2m] = false;             // Convert a Vector Register to a Mask
	SMPDefsFlags[STARS_NN_vpmovqb] = false;              // Down Convert QWord to Byte
	SMPDefsFlags[STARS_NN_vpmovsqb] = false;             // Down Convert QWord to Byte
	SMPDefsFlags[STARS_NN_vpmovusqb] = false;            // Down Convert QWord to Byte
	SMPDefsFlags[STARS_NN_vpmovqw] = false;              // Down Convert QWord to Word
	SMPDefsFlags[STARS_NN_vpmovsqw] = false;             // Down Convert QWord to Word
	SMPDefsFlags[STARS_NN_vpmovusqw] = false;            // Down Convert QWord to Word
	SMPDefsFlags[STARS_NN_vpmovqd] = false;              // Down Convert QWord to DWord
	SMPDefsFlags[STARS_NN_vpmovsqd] = false;             // Down Convert QWord to DWord
	SMPDefsFlags[STARS_NN_vpmovusqd] = false;            // Down Convert QWord to DWord
	SMPDefsFlags[STARS_NN_vpmovdb] = false;              // Down Convert DWord to Byte
	SMPDefsFlags[STARS_NN_vpmovsdb] = false;             // Down Convert DWord to Byte
	SMPDefsFlags[STARS_NN_vpmovusdb] = false;            // Down Convert DWord to Byte
	SMPDefsFlags[STARS_NN_vpmovdw] = false;              // Down Convert DWord to Word
	SMPDefsFlags[STARS_NN_vpmovsdw] = false;             // Down Convert DWord to Word
	SMPDefsFlags[STARS_NN_vpmovusdw] = false;            // Down Convert DWord to Word
	SMPDefsFlags[STARS_NN_vpmovwb] = false;              // Down Convert Word to Byte
	SMPDefsFlags[STARS_NN_vpmovswb] = false;             // Down Convert Word to Byte
	SMPDefsFlags[STARS_NN_vpmovuswb] = false;            // Down Convert Word to Byte
	SMPDefsFlags[STARS_NN_vpmullq] = false;              // Multiply Packed Integers and Store Low Result
	SMPDefsFlags[STARS_NN_vpmultishiftqb] = false;       // Select Packed Unaligned Bytes from Quadword Sources
	SMPDefsFlags[STARS_NN_vpord] = false;                // Bitwise Logical Or
	SMPDefsFlags[STARS_NN_vporq] = false;                // Bitwise Logical Or
	SMPDefsFlags[STARS_NN_vprold] = false;               // Bit Rotate Left
	SMPDefsFlags[STARS_NN_vprolvd] = false;              // Bit Rotate Left
	SMPDefsFlags[STARS_NN_vprolq] = false;               // Bit Rotate Left
	SMPDefsFlags[STARS_NN_vprolvq] = false;              // Bit Rotate Left
	SMPDefsFlags[STARS_NN_vprord] = false;               // Bit Rotate Right
	SMPDefsFlags[STARS_NN_vprorvd] = false;              // Bit Rotate Right
	SMPDefsFlags[STARS_NN_vprorq] = false;               // Bit Rotate Right
	SMPDefsFlags[STARS_NN_vprorvq] = false;              // Bit Rotate Right
	SMPDefsFlags[STARS_NN_vpscatterdd] = false;          // Scatter Packed Dword with Signed Dword
	SMPDefsFlags[STARS_NN_vpscatterdq] = false;          // Scatter Packed Qword with Signed Qword Indices
	SMPDefsFlags[STARS_NN_vpscatterqd] = false;          // Scatter Packed Dword with Signed Dword
	SMPDefsFlags[STARS_NN_vpscatterqq] = false;          // Scatter Packed Qword with Signed Qword Indices
	SMPDefsFlags[STARS_NN_vpsraq] = false;               // Bit Shift Arithmetic Right
	SMPDefsFlags[STARS_NN_vpsllvw] = false;              // Variable Bit Shift Left Logical
	SMPDefsFlags[STARS_NN_vpsrlvw] = false;              // Variable Bit Shift Right Logical
	SMPDefsFlags[STARS_NN_vptestnmb] = false;            // Logical NAND and Set
	SMPDefsFlags[STARS_NN_vptestnmw] = false;            // Logical NAND and Set
	SMPDefsFlags[STARS_NN_vptestnmd] = false;            // Logical NAND and Set
	SMPDefsFlags[STARS_NN_vptestnmq] = false;            // Logical NAND and Set
	SMPDefsFlags[STARS_NN_vshuff32x4] = false;           // Shuffle Packed Values at 128-bit Granularity
	SMPDefsFlags[STARS_NN_vshuff64x2] = false;           // Shuffle Packed Values at 128-bit Granularity
	SMPDefsFlags[STARS_NN_vshufi32x4] = false;           // Shuffle Packed Values at 128-bit Granularity
	SMPDefsFlags[STARS_NN_vshufi64x2] = false;           // Shuffle Packed Values at 128-bit Granularity
	SMPDefsFlags[STARS_NN_vpternlogd] = false;           // Bitwise Ternary Logic
	SMPDefsFlags[STARS_NN_vpternlogq] = false;           // Bitwise Ternary Logic
	SMPDefsFlags[STARS_NN_vptestmb] = false;             // Logical AND and Set Mask
	SMPDefsFlags[STARS_NN_vptestmw] = false;             // Logical AND and Set Mask
	SMPDefsFlags[STARS_NN_vptestmd] = false;             // Logical AND and Set Mask
	SMPDefsFlags[STARS_NN_vptestmq] = false;             // Logical AND and Set Mask
	SMPDefsFlags[STARS_NN_vpsravw] = false;              // Variable Bit Shift Right Arithmetic
	SMPDefsFlags[STARS_NN_vpsravq] = false;              // Variable Bit Shift Right Arithmetic
	SMPDefsFlags[STARS_NN_vpxord] = false;               // Exclusive Or
	SMPDefsFlags[STARS_NN_vpxorq] = false;               // Exclusive Or
	SMPDefsFlags[STARS_NN_vrangepd] = false;             // Range Restriction Calculation For Packed Pairs of Float64 Values
	SMPDefsFlags[STARS_NN_vrangeps] = false;             // Range Restriction Calculation For Packed Pairs of Float32 Values
	SMPDefsFlags[STARS_NN_vrangesd] = false;             // Range Restriction Calculation From a pair of Scalar Float64 Values
	SMPDefsFlags[STARS_NN_vrangess] = false;             // Range Restriction Calculation From a Pair of Scalar Float32 Values
	SMPDefsFlags[STARS_NN_vrcp14pd] = false;             // Compute Approximate Reciprocals of Packed Float64 Values
	SMPDefsFlags[STARS_NN_vrcp14sd] = false;             // Compute Approximate Reciprocal of Scalar Float64 Value
	SMPDefsFlags[STARS_NN_vrcp14ps] = false;             // Compute Approximate Reciprocals of Packed Float32 Values
	SMPDefsFlags[STARS_NN_vrcp14ss] = false;             // Compute Approximate Reciprocal of Scalar Float32 Value
	SMPDefsFlags[STARS_NN_vreducepd] = false;            // Perform Reduction Transformation on Packed Float64 Values
	SMPDefsFlags[STARS_NN_vreducesd] = false;            // Perform a Reduction Transformation on a Scalar Float64 Value
	SMPDefsFlags[STARS_NN_vreduceps] = false;            // Perform Reduction Transformation on Packed Float32 Values
	SMPDefsFlags[STARS_NN_vreducess] = false;            // Perform a Reduction Transformation on a Scalar Float32 Value
	SMPDefsFlags[STARS_NN_vrndscalepd] = false;          // Round Packed Float64 Values To Include A Given Number Of Fraction Bits
	SMPDefsFlags[STARS_NN_vrndscalesd] = false;          // Round Scalar Float64 Value To Include A Given Number Of Fraction Bits
	SMPDefsFlags[STARS_NN_vrndscaleps] = false;          // Round Packed Float32 Values To Include A Given Number Of Fraction Bits
	SMPDefsFlags[STARS_NN_vrndscaless] = false;          // Round Scalar Float32 Value To Include A Given Number Of Fraction Bits
	SMPDefsFlags[STARS_NN_vrsqrt14pd] = false;           // Compute Approximate Reciprocals of Square Roots of Packed Float64 Values
	SMPDefsFlags[STARS_NN_vrsqrt14sd] = false;           // Compute Approximate Reciprocal of Square Root of Scalar Float64 Value
	SMPDefsFlags[STARS_NN_vrsqrt14ps] = false;           // Compute Approximate Reciprocals of Square Roots of Packed Float32 Values
	SMPDefsFlags[STARS_NN_vrsqrt14ss] = false;           // Compute Approximate Reciprocal of Square Root of Scalar Float32 Value
	SMPDefsFlags[STARS_NN_vscalefpd] = false;            // Scale Packed Float64 Values With Float64 Values
	SMPDefsFlags[STARS_NN_vscalefsd] = false;            // Scale Scalar Float64 Values With Float64 Values
	SMPDefsFlags[STARS_NN_vscalefps] = false;            // Scale Packed Float32 Values With Float32 Values
	SMPDefsFlags[STARS_NN_vscalefss] = false;            // Scale Scalar Float32 Value With Float32 Value
	SMPDefsFlags[STARS_NN_vscatterdps] = false;          // Scatter Packed Single, Packed Double with Signed Dword and Qword Indices
	SMPDefsFlags[STARS_NN_vscatterdpd] = false;          // Scatter Packed Single, Packed Double with Signed Dword and Qword Indices
	SMPDefsFlags[STARS_NN_vscatterqps] = false;          // Scatter Packed Single, Packed Double with Signed Dword and Qword Indices
	SMPDefsFlags[STARS_NN_vscatterqpd] = false;          // Scatter Packed Single, Packed Double with Signed Dword and Qword Indices

	SMPDefsFlags[STARS_NN_vexp2pd] = false;              // Approximation to the Exponential 2^x of Packed Double-Precision Floating-Point Values with Less Than 2^-23 Relative Error
	SMPDefsFlags[STARS_NN_vexp2ps] = false;              // Approximation to the Exponential 2^x of Packed Single-Precision Floating-Point Values with Less Than 2^-23 Relative Error
	SMPDefsFlags[STARS_NN_vrcp28pd] = false;             // Approximation to the Reciprocal of Packed Double-Precision Floating-Point Values with Less Than 2^-28 Relative Error
	SMPDefsFlags[STARS_NN_vrcp28sd] = false;             // Approximation to the Reciprocal of Scalar Double-Precision Floating-Point Value with Less Than 2^-28 Relative Error
	SMPDefsFlags[STARS_NN_vrcp28ps] = false;             // Approximation to the Reciprocal of Packed Single-Precision Floating-Point Values with Less Than 2^-28 Relative Error
	SMPDefsFlags[STARS_NN_vrcp28ss] = false;             // Approximation to the Reciprocal of Scalar Single-Precision Floating-Point Value with Less Than 2^-28 Relative Error
	SMPDefsFlags[STARS_NN_vrsqrt28pd] = false;           // Approximation to the Reciprocal Square Root of Packed Double-Precision Floating-Point Values with Less Than 2^-28 Relative Error
	SMPDefsFlags[STARS_NN_vrsqrt28sd] = false;           // Approximation to the Reciprocal Square Root of Scalar Double-Precision Floating-Point Value with Less Than 2^-28 Relative Error
	SMPDefsFlags[STARS_NN_vrsqrt28ps] = false;           // Approximation to the Reciprocal Square Root of Packed Single-Precision Floating-Point Values with Less Than 2^-28 Relative Error
	SMPDefsFlags[STARS_NN_vrsqrt28ss] = false;           // Approximation to the Reciprocal Square Root of Scalar Single-Precision Floating-Point Value with Less Than 2^-28 Relative Error

	SMPDefsFlags[STARS_NN_vgatherpf0dps] = false;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint
	SMPDefsFlags[STARS_NN_vgatherpf0qps] = false;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint
	SMPDefsFlags[STARS_NN_vgatherpf0dpd] = false;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint
	SMPDefsFlags[STARS_NN_vgatherpf0qpd] = false;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint
	SMPDefsFlags[STARS_NN_vgatherpf1dps] = false;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint
	SMPDefsFlags[STARS_NN_vgatherpf1qps] = false;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint
	SMPDefsFlags[STARS_NN_vgatherpf1dpd] = false;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint
	SMPDefsFlags[STARS_NN_vgatherpf1qpd] = false;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint
	SMPDefsFlags[STARS_NN_vscatterpf0dps] = false;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write
	SMPDefsFlags[STARS_NN_vscatterpf0qps] = false;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write
	SMPDefsFlags[STARS_NN_vscatterpf0dpd] = false;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write
	SMPDefsFlags[STARS_NN_vscatterpf0qpd] = false;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write
	SMPDefsFlags[STARS_NN_vscatterpf1dps] = false;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write
	SMPDefsFlags[STARS_NN_vscatterpf1qps] = false;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write
	SMPDefsFlags[STARS_NN_vscatterpf1dpd] = false;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write
	SMPDefsFlags[STARS_NN_vscatterpf1qpd] = false;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write

	// AVX-512 comparison pseudo-ops

	SMPDefsFlags[STARS_NN_vpcmpltd] = false;             // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpled] = false;             // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpneqd] = false;            // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpnltd] = false;            // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpnled] = false;            // Compare Packed Integer Values into Mask

	SMPDefsFlags[STARS_NN_vpcmpequd] = false;            // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpltud] = false;            // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpleud] = false;            // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpnequd] = false;           // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpnltud] = false;           // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpnleud] = false;           // Compare Packed Integer Values into Mask

	SMPDefsFlags[STARS_NN_vpcmpltq] = false;             // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpleq] = false;             // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpneqq] = false;            // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpnltq] = false;            // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpnleq] = false;            // Compare Packed Integer Values into Mask

	SMPDefsFlags[STARS_NN_vpcmpequq] = false;            // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpltuq] = false;            // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpleuq] = false;            // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpnequq] = false;           // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpnltuq] = false;           // Compare Packed Integer Values into Mask
	SMPDefsFlags[STARS_NN_vpcmpnleuq] = false;           // Compare Packed Integer Values into Mask

	// Opmask instructions

	SMPDefsFlags[STARS_NN_kaddw] = false;                // ADD Two Masks
	SMPDefsFlags[STARS_NN_kaddb] = false;                // ADD Two Masks
	SMPDefsFlags[STARS_NN_kaddq] = false;                // ADD Two Masks
	SMPDefsFlags[STARS_NN_kaddd] = false;                // ADD Two Masks
	SMPDefsFlags[STARS_NN_kandw] = false;                // Bitwise Logical AND Masks
	SMPDefsFlags[STARS_NN_kandb] = false;                // Bitwise Logical AND Masks
	SMPDefsFlags[STARS_NN_kandq] = false;                // Bitwise Logical AND Masks
	SMPDefsFlags[STARS_NN_kandd] = false;                // Bitwise Logical AND Masks
	SMPDefsFlags[STARS_NN_kandnw] = false;               // Bitwise Logical AND NOT Masks
	SMPDefsFlags[STARS_NN_kandnb] = false;               // Bitwise Logical AND NOT Masks
	SMPDefsFlags[STARS_NN_kandnq] = false;               // Bitwise Logical AND NOT Masks
	SMPDefsFlags[STARS_NN_kandnd] = false;               // Bitwise Logical AND NOT Masks
	SMPDefsFlags[STARS_NN_kmovw] = false;                // Move from and to Mask Registers
	SMPDefsFlags[STARS_NN_kmovb] = false;                // Move from and to Mask Registers
	SMPDefsFlags[STARS_NN_kmovq] = false;                // Move from and to Mask Registers
	SMPDefsFlags[STARS_NN_kmovd] = false;                // Move from and to Mask Registers
	SMPDefsFlags[STARS_NN_kunpckbw] = false;             // Unpack for Mask Registers
	SMPDefsFlags[STARS_NN_kunpckwd] = false;             // Unpack for Mask Registers
	SMPDefsFlags[STARS_NN_kunpckdq] = false;             // Unpack for Mask Registers
	SMPDefsFlags[STARS_NN_knotw] = false;                // NOT Mask Register
	SMPDefsFlags[STARS_NN_knotb] = false;                // NOT Mask Register
	SMPDefsFlags[STARS_NN_knotq] = false;                // NOT Mask Register
	SMPDefsFlags[STARS_NN_knotd] = false;                // NOT Mask Register
	SMPDefsFlags[STARS_NN_korw] = false;                 // Bitwise Logical OR Masks
	SMPDefsFlags[STARS_NN_korb] = false;                 // Bitwise Logical OR Masks
	SMPDefsFlags[STARS_NN_korq] = false;                 // Bitwise Logical OR Masks
	SMPDefsFlags[STARS_NN_kord] = false;                 // Bitwise Logical OR Masks
	SMPDefsFlags[STARS_NN_kortestw] = true;             // OR Masks And Set Flags
	SMPDefsFlags[STARS_NN_kortestb] = true;             // OR Masks And Set Flags
	SMPDefsFlags[STARS_NN_kortestq] = true;             // OR Masks And Set Flags
	SMPDefsFlags[STARS_NN_kortestd] = true;             // OR Masks And Set Flags
	SMPDefsFlags[STARS_NN_kshiftlw] = false;             // Shift Left Mask Registers
	SMPDefsFlags[STARS_NN_kshiftlb] = false;             // Shift Left Mask Registers
	SMPDefsFlags[STARS_NN_kshiftlq] = false;             // Shift Left Mask Registers
	SMPDefsFlags[STARS_NN_kshiftld] = false;             // Shift Left Mask Registers
	SMPDefsFlags[STARS_NN_kshiftrw] = false;             // Shift Right Mask Registers
	SMPDefsFlags[STARS_NN_kshiftrb] = false;             // Shift Right Mask Registers
	SMPDefsFlags[STARS_NN_kshiftrq] = false;             // Shift Right Mask Registers
	SMPDefsFlags[STARS_NN_kshiftrd] = false;             // Shift Right Mask Registers
	SMPDefsFlags[STARS_NN_kxnorw] = false;               // Bitwise Logical XNOR Masks
	SMPDefsFlags[STARS_NN_kxnorb] = false;               // Bitwise Logical XNOR Masks
	SMPDefsFlags[STARS_NN_kxnorq] = false;               // Bitwise Logical XNOR Masks
	SMPDefsFlags[STARS_NN_kxnord] = false;               // Bitwise Logical XNOR Masks
	SMPDefsFlags[STARS_NN_ktestw] = true;               // Packed Bit Test Masks and Set Flags
	SMPDefsFlags[STARS_NN_ktestb] = true;               // Packed Bit Test Masks and Set Flags
	SMPDefsFlags[STARS_NN_ktestq] = true;               // Packed Bit Test Masks and Set Flags
	SMPDefsFlags[STARS_NN_ktestd] = true;               // Packed Bit Test Masks and Set Flags
	SMPDefsFlags[STARS_NN_kxorw] = false;                // Bitwise Logical XOR Masks
	SMPDefsFlags[STARS_NN_kxorb] = false;                // Bitwise Logical XOR Masks
	SMPDefsFlags[STARS_NN_kxorq] = false;                // Bitwise Logical XOR Masks
	SMPDefsFlags[STARS_NN_kxord] = false;                // Bitwise Logical XOR Masks

	// SHA Extensions

	SMPDefsFlags[STARS_NN_sha1rnds4] = false;            // Perform Four Rounds of SHA1 Operation
	SMPDefsFlags[STARS_NN_sha1nexte] = false;            // Calculate SHA1 State Variable E after Four Rounds
	SMPDefsFlags[STARS_NN_sha1msg1] = false;             // Perform an Intermediate Calculation for the Next Four SHA1 Message Dwords
	SMPDefsFlags[STARS_NN_sha1msg2] = false;             // Perform a Final Calculation for the Next Four SHA1 Message Dwords
	SMPDefsFlags[STARS_NN_sha256rnds2] = false;          // Perform Two Rounds of SHA256 Operation
	SMPDefsFlags[STARS_NN_sha256msg1] = false;           // Perform an Intermediate Calculation for the Next Four SHA256 Message Dwords
	SMPDefsFlags[STARS_NN_sha256msg2] = false;           // Perform a Final Calculation for the Next Four SHA256 Message Dwords

	// Intel Software Guard Extensions

	SMPDefsFlags[STARS_NN_encls] = false;                // Execute an Enclave System Function of Specified Leaf Number
	SMPDefsFlags[STARS_NN_enclu] = false;                // Execute an Enclave User Function of Specified Leaf Number

	// AMD XOP

	SMPDefsFlags[STARS_NN_vfrczpd] = false;              // Extract Fraction Packed Double-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfrczps] = false;              // Extract Fraction Packed Single-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfrczsd] = false;              // Extract Fraction Scalar Double-Precision Floating-Point
	SMPDefsFlags[STARS_NN_vfrczss] = false;              // Extract Fraction Scalar Single-Precision Floating Point
	SMPDefsFlags[STARS_NN_vpcmov] = false;               // Vector Conditional Moves
	SMPDefsFlags[STARS_NN_vpcomb] = false;               // Compare Vector Signed Bytes
	SMPDefsFlags[STARS_NN_vpcomd] = false;               // Compare Vector Signed Doublewords
	SMPDefsFlags[STARS_NN_vpcomq] = false;               // Compare Vector Signed Quadwords
	SMPDefsFlags[STARS_NN_vpcomub] = false;              // Compare Vector Unsigned Bytes
	SMPDefsFlags[STARS_NN_vpcomud] = false;              // Compare Vector Unsigned Doublewords
	SMPDefsFlags[STARS_NN_vpcomuq] = false;              // Compare Vector Unsigned Quadwords
	SMPDefsFlags[STARS_NN_vpcomuw] = false;              // Compare Vector Unsigned Words
	SMPDefsFlags[STARS_NN_vpcomw] = false;               // Compare Vector Signed Words
	SMPDefsFlags[STARS_NN_vpermil2pd] = false;           // Permute Two-Source Double-Precision Floating-Point Values
	SMPDefsFlags[STARS_NN_vpermil2ps] = false;           // Permute Two-Source Single-Precision Floating-Point Values
	SMPDefsFlags[STARS_NN_vphaddbd] = false;             // Packed Horizontal Add Signed Byte to Signed Doubleword
	SMPDefsFlags[STARS_NN_vphaddbq] = false;             // Packed Horizontal Add Signed Byte to Signed Quadword
	SMPDefsFlags[STARS_NN_vphaddbw] = false;             // Packed Horizontal Add Signed Byte to Signed Word
	SMPDefsFlags[STARS_NN_vphadddq] = false;             // Packed Horizontal Add Signed Doubleword to Signed Quadword
	SMPDefsFlags[STARS_NN_vphaddubd] = false;            // Packed Horizontal Add Unsigned Byte to Doubleword
	SMPDefsFlags[STARS_NN_vphaddubq] = false;            // Packed Horizontal Add Unsigned Byte to Quadword
	SMPDefsFlags[STARS_NN_vphaddubw] = false;            // Packed Horizontal Add Unsigned Byte to Word
	SMPDefsFlags[STARS_NN_vphaddudq] = false;            // Packed Horizontal Add Unsigned Doubleword to Quadword
	SMPDefsFlags[STARS_NN_vphadduwd] = false;            // Packed Horizontal Add Unsigned Word to Doubleword
	SMPDefsFlags[STARS_NN_vphadduwq] = false;            // Packed Horizontal Add Unsigned Word to Quadword
	SMPDefsFlags[STARS_NN_vphaddwd] = false;             // Packed Horizontal Add Signed Word to Signed Doubleword
	SMPDefsFlags[STARS_NN_vphaddwq] = false;             // Packed Horizontal Add Signed Word to Signed Quadword
	SMPDefsFlags[STARS_NN_vphsubbw] = false;             // Packed Horizontal Subtract Signed Byte to Signed Word
	SMPDefsFlags[STARS_NN_vphsubdq] = false;             // Packed Horizontal Subtract Signed Doubleword to Signed Quadword
	SMPDefsFlags[STARS_NN_vphsubwd] = false;             // Packed Horizontal Subtract Signed Word to Signed Doubleword
	SMPDefsFlags[STARS_NN_vpmacsdd] = false;             // Packed Multiply Accumulate Signed Doubleword to Signed Doubleword
	SMPDefsFlags[STARS_NN_vpmacsdqh] = false;            // Packed Multiply Accumulate Signed High Doubleword to Signed Quadword
	SMPDefsFlags[STARS_NN_vpmacsdql] = false;            // Packed Multiply Accumulate Signed Low Doubleword to Signed Quadword
	SMPDefsFlags[STARS_NN_vpmacssdd] = false;            // Packed Multiply Accumulate Signed Doubleword to Signed Doubleword with Saturation
	SMPDefsFlags[STARS_NN_vpmacssdqh] = false;           // Packed Multiply Accumulate Signed High Doubleword to Signed Quadword with Saturation
	SMPDefsFlags[STARS_NN_vpmacssdql] = false;           // Packed Multiply Accumulate Signed Low Doubleword to Signed Quadword with Saturation
	SMPDefsFlags[STARS_NN_vpmacsswd] = false;            // Packed Multiply Accumulate Signed Word to Signed Doubleword with Saturation
	SMPDefsFlags[STARS_NN_vpmacssww] = false;            // Packed Multiply Accumulate Signed Word to Signed Word with Saturation
	SMPDefsFlags[STARS_NN_vpmacswd] = false;             // Packed Multiply Accumulate Signed Word to Signed Doubleword
	SMPDefsFlags[STARS_NN_vpmacsww] = false;             // Packed Multiply Accumulate Signed Word to Signed Word
	SMPDefsFlags[STARS_NN_vpmadcsswd] = false;           // Packed Multiply, Add and Accumulate Signed Word to Signed Doubleword with Saturation
	SMPDefsFlags[STARS_NN_vpmadcswd] = false;            // Packed Multiply Add and Accumulate Signed Word to Signed Doubleword
	SMPDefsFlags[STARS_NN_vpperm] = false;               // Packed Permute Bytes
	SMPDefsFlags[STARS_NN_vprotb] = false;               // Packed Rotate Bytes
	SMPDefsFlags[STARS_NN_vprotd] = false;               // Packed Rotate Doublewords
	SMPDefsFlags[STARS_NN_vprotq] = false;               // Packed Rotate Quadwords
	SMPDefsFlags[STARS_NN_vprotw] = false;               // Packed Rotate Words
	SMPDefsFlags[STARS_NN_vpshab] = false;               // Packed Shift Arithmetic Bytes
	SMPDefsFlags[STARS_NN_vpshad] = false;               // Packed Shift Arithmetic Doublewords
	SMPDefsFlags[STARS_NN_vpshaq] = false;               // Packed Shift Arithmetic Quadwords
	SMPDefsFlags[STARS_NN_vpshaw] = false;               // Packed Shift Arithmetic Words
	SMPDefsFlags[STARS_NN_vpshlb] = false;               // Packed Shift Logical Bytes
	SMPDefsFlags[STARS_NN_vpshld] = false;               // Packed Shift Logical Doublewords
	SMPDefsFlags[STARS_NN_vpshlq] = false;               // Packed Shift Logical Quadwords
	SMPDefsFlags[STARS_NN_vpshlw] = false;               // Packed Shift Logical Words

	// AMP XOP comparison pseudo-ops

	SMPDefsFlags[STARS_NN_vpcomltb] = false;             // Compare Vector Signed Bytes
	SMPDefsFlags[STARS_NN_vpcomleb] = false;             // Compare Vector Signed Bytes
	SMPDefsFlags[STARS_NN_vpcomgtb] = false;             // Compare Vector Signed Bytes
	SMPDefsFlags[STARS_NN_vpcomgeb] = false;             // Compare Vector Signed Bytes
	SMPDefsFlags[STARS_NN_vpcomeqb] = false;             // Compare Vector Signed Bytes
	SMPDefsFlags[STARS_NN_vpcomneqb] = false;            // Compare Vector Signed Bytes
	SMPDefsFlags[STARS_NN_vpcomfalseb] = false;          // Compare Vector Signed Bytes
	SMPDefsFlags[STARS_NN_vpcomtrueb] = false;           // Compare Vector Signed Bytes

	SMPDefsFlags[STARS_NN_vpcomltw] = false;             // Compare Vector Signed Words
	SMPDefsFlags[STARS_NN_vpcomlew] = false;             // Compare Vector Signed Words
	SMPDefsFlags[STARS_NN_vpcomgtw] = false;             // Compare Vector Signed Words
	SMPDefsFlags[STARS_NN_vpcomgew] = false;             // Compare Vector Signed Words
	SMPDefsFlags[STARS_NN_vpcomeqw] = false;             // Compare Vector Signed Words
	SMPDefsFlags[STARS_NN_vpcomneqw] = false;            // Compare Vector Signed Words
	SMPDefsFlags[STARS_NN_vpcomfalsew] = false;          // Compare Vector Signed Words
	SMPDefsFlags[STARS_NN_vpcomtruew] = false;           // Compare Vector Signed Words

	SMPDefsFlags[STARS_NN_vpcomltd] = false;             // Compare Vector Signed Doublewords
	SMPDefsFlags[STARS_NN_vpcomled] = false;             // Compare Vector Signed Doublewords
	SMPDefsFlags[STARS_NN_vpcomgtd] = false;             // Compare Vector Signed Doublewords
	SMPDefsFlags[STARS_NN_vpcomged] = false;             // Compare Vector Signed Doublewords
	SMPDefsFlags[STARS_NN_vpcomeqd] = false;             // Compare Vector Signed Doublewords
	SMPDefsFlags[STARS_NN_vpcomneqd] = false;            // Compare Vector Signed Doublewords
	SMPDefsFlags[STARS_NN_vpcomfalsed] = false;          // Compare Vector Signed Doublewords
	SMPDefsFlags[STARS_NN_vpcomtrued] = false;           // Compare Vector Signed Doublewords

	SMPDefsFlags[STARS_NN_vpcomltq] = false;             // Compare Vector Signed Quadwords
	SMPDefsFlags[STARS_NN_vpcomleq] = false;             // Compare Vector Signed Quadwords
	SMPDefsFlags[STARS_NN_vpcomgtq] = false;             // Compare Vector Signed Quadwords
	SMPDefsFlags[STARS_NN_vpcomgeq] = false;             // Compare Vector Signed Quadwords
	SMPDefsFlags[STARS_NN_vpcomeqq] = false;             // Compare Vector Signed Quadwords
	SMPDefsFlags[STARS_NN_vpcomneqq] = false;            // Compare Vector Signed Quadwords
	SMPDefsFlags[STARS_NN_vpcomfalseq] = false;          // Compare Vector Signed Quadwords
	SMPDefsFlags[STARS_NN_vpcomtrueq] = false;           // Compare Vector Signed Quadwords

	SMPDefsFlags[STARS_NN_vpcomltub] = false;            // Compare Vector Unsigned Bytes
	SMPDefsFlags[STARS_NN_vpcomleub] = false;            // Compare Vector Unsigned Bytes
	SMPDefsFlags[STARS_NN_vpcomgtub] = false;            // Compare Vector Unsigned Bytes
	SMPDefsFlags[STARS_NN_vpcomgeub] = false;            // Compare Vector Unsigned Bytes
	SMPDefsFlags[STARS_NN_vpcomequb] = false;            // Compare Vector Unsigned Bytes
	SMPDefsFlags[STARS_NN_vpcomnequb] = false;           // Compare Vector Unsigned Bytes
	SMPDefsFlags[STARS_NN_vpcomfalseub] = false;         // Compare Vector Unsigned Bytes
	SMPDefsFlags[STARS_NN_vpcomtrueub] = false;          // Compare Vector Unsigned Bytes

	SMPDefsFlags[STARS_NN_vpcomltuw] = false;            // Compare Vector Unsigned Words
	SMPDefsFlags[STARS_NN_vpcomleuw] = false;            // Compare Vector Unsigned Words
	SMPDefsFlags[STARS_NN_vpcomgtuw] = false;            // Compare Vector Unsigned Words
	SMPDefsFlags[STARS_NN_vpcomgeuw] = false;            // Compare Vector Unsigned Words
	SMPDefsFlags[STARS_NN_vpcomequw] = false;            // Compare Vector Unsigned Words
	SMPDefsFlags[STARS_NN_vpcomnequw] = false;           // Compare Vector Unsigned Words
	SMPDefsFlags[STARS_NN_vpcomfalseuw] = false;         // Compare Vector Unsigned Words
	SMPDefsFlags[STARS_NN_vpcomtrueuw] = false;          // Compare Vector Unsigned Words

	SMPDefsFlags[STARS_NN_vpcomltud] = false;            // Compare Vector Unsigned Doublewords
	SMPDefsFlags[STARS_NN_vpcomleud] = false;            // Compare Vector Unsigned Doublewords
	SMPDefsFlags[STARS_NN_vpcomgtud] = false;            // Compare Vector Unsigned Doublewords
	SMPDefsFlags[STARS_NN_vpcomgeud] = false;            // Compare Vector Unsigned Doublewords
	SMPDefsFlags[STARS_NN_vpcomequd] = false;            // Compare Vector Unsigned Doublewords
	SMPDefsFlags[STARS_NN_vpcomnequd] = false;           // Compare Vector Unsigned Doublewords
	SMPDefsFlags[STARS_NN_vpcomfalseud] = false;         // Compare Vector Unsigned Doublewords
	SMPDefsFlags[STARS_NN_vpcomtrueud] = false;          // Compare Vector Unsigned Doublewords

	SMPDefsFlags[STARS_NN_vpcomltuq] = false;            // Compare Vector Unsigned Quadwords
	SMPDefsFlags[STARS_NN_vpcomleuq] = false;            // Compare Vector Unsigned Quadwords
	SMPDefsFlags[STARS_NN_vpcomgtuq] = false;            // Compare Vector Unsigned Quadwords
	SMPDefsFlags[STARS_NN_vpcomgeuq] = false;            // Compare Vector Unsigned Quadwords
	SMPDefsFlags[STARS_NN_vpcomequq] = false;            // Compare Vector Unsigned Quadwords
	SMPDefsFlags[STARS_NN_vpcomnequq] = false;           // Compare Vector Unsigned Quadwords
	SMPDefsFlags[STARS_NN_vpcomfalseuq] = false;         // Compare Vector Unsigned Quadwords
	SMPDefsFlags[STARS_NN_vpcomtrueuq] = false;          // Compare Vector Unsigned Quadwords

	// AMD Excavator

	SMPDefsFlags[STARS_NN_monitorx] = false;             // Setup Monitor Address
	SMPDefsFlags[STARS_NN_mwaitx] = false;               // Monitor Wait with Timeout

	// AMD Zen

	SMPDefsFlags[STARS_NN_clzero] = false;               // Zero out 64 byte cache

	// Intel Processor Trace

	SMPDefsFlags[STARS_NN_ptwrite] = false;              // Write Data to a Processor Trace Packet

	// new Intel AVX-512 instructions (December 2016)

	SMPDefsFlags[STARS_NN_v4fmaddps] = false;            // Packed Single-Precision Floating-Point Fused Multiply-Add (4-iterations)
	SMPDefsFlags[STARS_NN_v4fnmaddps] = false;           // Packed Single-Precision Floating-Point Fused Multiply-Add (4-iterations)
	SMPDefsFlags[STARS_NN_v4fmaddss] = false;            // Scalar Single-Precision Floating-Point Fused Multiply-Add (4-iterations)
	SMPDefsFlags[STARS_NN_v4fnmaddss] = false;           // Scalar Single-Precision Floating-Point Fused Multiply-Add (4-iterations)
	SMPDefsFlags[STARS_NN_vp4dpwssd] = false;            // Dot Product of Signed Words with Dword Accumulation (4-iterations)
	SMPDefsFlags[STARS_NN_vp4dpwssds] = false;           // Dot Product of Signed Words with Dword Accumulation and Saturation (4-iterations)
	SMPDefsFlags[STARS_NN_vpopcntd] = false;             // Return the Count of Number of Bits Set to 1 in DWORD
	SMPDefsFlags[STARS_NN_vpopcntq] = false;             // Return the Count of Number of Bits Set to 1 in QWORD

	// Read Processor ID

	SMPDefsFlags[STARS_NN_rdpid] = false;                // Read Processor ID

	// Invoke VM function

	SMPDefsFlags[STARS_NN_vmfunc] = false;               // Invoke VM function

	// Control-flow Enforcement

	SMPDefsFlags[STARS_NN_incsspd] = false;              // Increment Shadow Stack Pointer (by 4)
	SMPDefsFlags[STARS_NN_incsspq] = false;              // Increment Shadow Stack Pointer (by 8)
	SMPDefsFlags[STARS_NN_rdsspd] = false;               // Read (low 32 bits of) Shadow Stack Pointer
	SMPDefsFlags[STARS_NN_rdsspq] = false;               // Read Shadow Stack Pointer
	SMPDefsFlags[STARS_NN_saveprevssp] = false;          // Save Previous Shadow Stack Pointer
	SMPDefsFlags[STARS_NN_rstorssp] = false;             // Restore saved Shadow Stack Pointer
	SMPDefsFlags[STARS_NN_wrssd] = false;                // Write (4 bytes) to shadow stack
	SMPDefsFlags[STARS_NN_wrssq] = false;                // Write (8 bytes) to shadow stack
	SMPDefsFlags[STARS_NN_wrussd] = false;               // Write (4 bytes) to User Shadow Stack
	SMPDefsFlags[STARS_NN_wrussq] = false;               // Write (8 bytes) to User Shadow Stack
	SMPDefsFlags[STARS_NN_setssbsy] = false;             // Mark Shadow Stack Busy
	SMPDefsFlags[STARS_NN_clrssbsy] = false;             // Clear Shadow Stack Busy Flag
	SMPDefsFlags[STARS_NN_endbr64] = false;              // Terminate an Indirect Branch in 64-bit Mode
	SMPDefsFlags[STARS_NN_endbr32] = false;              // Terminate an Indirect Branch in 32-bit and Compatibility Mode

	// Undefined Instruction

	SMPDefsFlags[STARS_NN_ud0] = false;                 // Undefined Instruction
	SMPDefsFlags[STARS_NN_ud1] = false;                 // Undefined Instruction

	// Enqueue Stores

	SMPDefsFlags[STARS_NN_enqcmd] = false;              // Enqueue Command
	SMPDefsFlags[STARS_NN_enqcmds] = false;             // Enqueue Command Supervisor

	// AMD Zen2

	SMPDefsFlags[STARS_NN_mcommit] = false;             // Commit Stores to Memory
	SMPDefsFlags[STARS_NN_rdpru] = false;               // Read Processor Register

	// Intel Tremont instructions

	SMPDefsFlags[STARS_NN_cldemote] = false;            // Cache Line Demote
	SMPDefsFlags[STARS_NN_enclv] = false;               // Execute an Enclave VMM Function of Specified Leaf Number

	// Direct Stores

	SMPDefsFlags[STARS_NN_movdiri] = false;             // Move Doubleword as Direct Store
	SMPDefsFlags[STARS_NN_movdir64b] = false;           // Move 64 Bytes as Direct Store

	// Intel WAITPKG instructions

	SMPDefsFlags[STARS_NN_tpause] = true;              // Timed PAUSE
	SMPDefsFlags[STARS_NN_umonitor] = false;            // User Level Set Up Monitor Address
	SMPDefsFlags[STARS_NN_umwait] = true;              // User Level Monitor Wait

	// Intel Sapphire Rapids instructions

	SMPDefsFlags[STARS_NN_serialize] = false;           // Serialize Instruction Execution

	// Intel TSX

	SMPDefsFlags[STARS_NN_xresldtrk] = false;           // Resume Tracking Load Addresses
	SMPDefsFlags[STARS_NN_xsusldtrk] = false;           // Suspend Tracking Load Addresses

	// Intel Affine Transformation instructions

	SMPDefsFlags[STARS_NN_gf2p8mulb] = false;           // Galois Field Multiply Bytes
	SMPDefsFlags[STARS_NN_gf2p8affineqb] = false;       // Computes Affine Transformation
	SMPDefsFlags[STARS_NN_gf2p8affineinvqb] = false;    // Computes Inverse Affine Transformation

	// VEX versions
	SMPDefsFlags[STARS_NN_vgf2p8mulb] = false;          // Galois Field Multiply Bytes
	SMPDefsFlags[STARS_NN_vgf2p8affineqb] = false;      // Computes Affine Transformation
	SMPDefsFlags[STARS_NN_vgf2p8affineinvqb] = false;   // Computes Inverse Affine Transformation

	// Intrinsics for Saving and Restoring the Extended Processor States (64-bits)

	SMPDefsFlags[STARS_NN_fxsave64] = false;            // Fast save FP context (64-bits)
	SMPDefsFlags[STARS_NN_fxrstor64] = false;           // Fast restore FP context (64-bits)


	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

	// FMA4

	// Intel Memory Protection Extensions (MPX)

	// New xstate instructions

	// PREFETCHWT1 support

	// Memory instructions

	// Protection Key Rights for User Pages

	// AVX comparison pseudo-ops

	// AVX-512 instructions

	// AVX-512 comparison pseudo-ops

	// Opmask instructions

	// SHA Extensions

	// Intel Software Guard Extensions

	// AMD XOP

	// AMP XOP comparison pseudo-ops

	// AMD Excavator

	// AMD Zen

	// Intel Processor Trace

	// new Intel AVX-512 instructions (December 2016)

	// Read Processor ID

	// Invoke VM function

	// Control-flow Enforcement

	// Undefined Instruction

	// Enqueue Stores

	// AMD Zen2

	// Intel Tremont instructions

	// Direct Stores

	// Intel WAITPKG instructions

	// Intel Sapphire Rapids instructions

	// Intel TSX

	// Intel Affine Transformation instructions

	// VEX versions

	// Intrinsics for Saving and Restoring the Extended Processor States (64-bits)

	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.
	// Category 16 instructions have type 'p' (pointer) for all operands, e.g. bounds checking opcodes.

	// 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] = 16;            // Prefetch at least a 32-byte line into L1 data cache
	SMPTypeCategory[STARS_NN_prefetchw] = 16;           // 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] = 16;          // Prefetch to all cache levels
	SMPTypeCategory[STARS_NN_prefetcht1] = 16;          // Prefetch to all cache levels
	SMPTypeCategory[STARS_NN_prefetcht2] = 16;          // Prefetch to L2 cache
	SMPTypeCategory[STARS_NN_prefetchnta] = 16;         // 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] = 16;             // 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



	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] = 9;         // Extract Packed Floating-Point Values
	SMPTypeCategory[STARS_NN_vextracti128] = 9;         // Extract Packed Integer Values
	SMPTypeCategory[STARS_NN_vextractps] = 9;           // 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
#if (IDA_SDK_VERSION < 700)      // Incredibly, these opcodes were removed in IDA Pro 7.0
	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
#endif
	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] = 9;          // 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

	// FMA4
	SMPTypeCategory[STARS_NN_vfmaddsubps] = 14;          // Multiply with Alternating Add/Subtract of Packed Single-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfmaddsubpd] = 14;          // Multiply with Alternating Add/Subtract of Packed Double-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfmsubaddps] = 14;          // Multiply with Alternating Subtract/Add of Packed Single-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfmsubaddpd] = 14;          // Multiply with Alternating Subtract/Add of Packed Double-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfmaddps] = 14;             // Multiply and Add Packed Single-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfmaddpd] = 14;             // Multiply and Add Packed Double-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfmaddss] = 14;             // Multiply and Add Scalar Single-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfmaddsd] = 14;             // Multiply and Add Scalar Double-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfmsubps] = 14;             // Multiply and Subtract Packed Single-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfmsubpd] = 14;             // Multiply and Subtract Packed Double-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfmsubss] = 14;             // Multiply and Subtract Scalar Single-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfmsubsd] = 14;             // Multiply and Subtract Scalar Double-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfnmaddps] = 14;            // Negative Multiply and Add Packed Single-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfnmaddpd] = 14;            // Negative Multiply and Add Packed Double-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfnmaddss] = 14;            // Negative Multiply and Add Scalar Single-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfnmaddsd] = 14;            // Negative Multiply and Add Double Single-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfnmsubps] = 14;            // Negative Multiply and Subtract Packed Single-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfnmsubpd] = 14;            // Negative Multiply and Subtract Packed Double-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfnmsubss] = 14;            // Negative Multiply and Subtract Scalar Single-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfnmsubsd] = 14;            // Negative Multiply and Subtract Double Single-Precision Floating-Point

	// Intel Memory Protection Extensions (MPX)

	SMPTypeCategory[STARS_NN_bndmk] = 16;                // Make Bounds
	SMPTypeCategory[STARS_NN_bndcl] = 16;                // Check Lower Bound
	SMPTypeCategory[STARS_NN_bndcu] = 16;                // Check Upper Bound
	SMPTypeCategory[STARS_NN_bndcn] = 16;                // Check Upper Bound
	SMPTypeCategory[STARS_NN_bndmov] = 16;               // Move Bounds
	SMPTypeCategory[STARS_NN_bndldx] = 16;               // Load Extended Bounds Using Address Translation
	SMPTypeCategory[STARS_NN_bndstx] = 16;               // Store Extended Bounds Using Address Translation

	// New xstate instructions

	SMPTypeCategory[STARS_NN_xrstors] = 1;              // Restore Processor Extended States Supervisor
	SMPTypeCategory[STARS_NN_xsavec] = 1;               // Save Processor Extended States with Compaction
	SMPTypeCategory[STARS_NN_xsaves] = 1;               // Save Processor Extended States Supervisor

	// PREFETCHWT1 support

	SMPTypeCategory[STARS_NN_prefetchwt1] = 16;          // Prefetch Vector Data Into Caches with Intent to Write and T1 Hint

	// Memory instructions

	SMPTypeCategory[STARS_NN_clflushopt] = 16;           // Flush a Cache Line Optimized
	SMPTypeCategory[STARS_NN_clwb] = 16;                 // Cache Line Write Back
	SMPTypeCategory[STARS_NN_pcommit] = 1;              // Persistent Commit (deprecated by Intel)

	// Protection Key Rights for User Pages

	SMPTypeCategory[STARS_NN_rdpkru] = 1;               // Read Protection Key Rights for User Pages
	SMPTypeCategory[STARS_NN_wrpkru] = 1;               // Write Data to User Page Key Register

	// AVX comparison pseudo-ops

	SMPTypeCategory[STARS_NN_vcmpeqpd] = 14;             // Compare Packed Double-Precision Floating-Point Values - Equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpltpd] = 14;             // Compare Packed Double-Precision Floating-Point Values - Less-than (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmplepd] = 14;             // Compare Packed Double-Precision Floating-Point Values - Less-than-or-equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpunordpd] = 14;          // Compare Packed Double-Precision Floating-Point Values - Unordered (non-signaling)
	SMPTypeCategory[STARS_NN_vcmpneqpd] = 14;            // Compare Packed Double-Precision Floating-Point Values - Not-equal (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpnltpd] = 14;            // Compare Packed Double-Precision Floating-Point Values - Not-less-than (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpnlepd] = 14;            // Compare Packed Double-Precision Floating-Point Values - Not-less-than-or-equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpordpd] = 14;            // Compare Packed Double-Precision Floating-Point Values - Ordered (non-signaling)
	SMPTypeCategory[STARS_NN_vcmpeq_uqpd] = 14;          // Compare Packed Double-Precision Floating-Point Values - Equal (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpngepd] = 14;            // Compare Packed Double-Precision Floating-Point Values - Not-greater-than-or-equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpngtpd] = 14;            // Compare Packed Double-Precision Floating-Point Values - Not-greater-than (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpfalsepd] = 14;          // Compare Packed Double-Precision Floating-Point Values - False (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpneq_oqpd] = 14;         // Compare Packed Double-Precision Floating-Point Values - Not-equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpgepd] = 14;             // Compare Packed Double-Precision Floating-Point Values - Greater-than-or-equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpgtpd] = 14;             // Compare Packed Double-Precision Floating-Point Values - Greater-than (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmptruepd] = 14;           // Compare Packed Double-Precision Floating-Point Values - True (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpeq_ospd] = 14;          // Compare Packed Double-Precision Floating-Point Values - Equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmplt_oqpd] = 14;          // Compare Packed Double-Precision Floating-Point Values - Less-than (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmple_oqpd] = 14;          // Compare Packed Double-Precision Floating-Point Values - Less-than-or-equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpunord_spd] = 14;        // Compare Packed Double-Precision Floating-Point Values - Unordered (signaling)
	SMPTypeCategory[STARS_NN_vcmpneq_uspd] = 14;         // Compare Packed Double-Precision Floating-Point Values - Not-equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpnlt_uqpd] = 14;         // Compare Packed Double-Precision Floating-Point Values - Not-less-than (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpnle_uqpd] = 14;         // Compare Packed Double-Precision Floating-Point Values - Not-less-than-or-equal (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpord_spd] = 14;          // Compare Packed Double-Precision Floating-Point Values - Ordered (signaling)
	SMPTypeCategory[STARS_NN_vcmpeq_uspd] = 14;          // Compare Packed Double-Precision Floating-Point Values - Equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpnge_uqpd] = 14;         // Compare Packed Double-Precision Floating-Point Values - Not-greater-than-or-equal (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpngt_uqpd] = 14;         // Compare Packed Double-Precision Floating-Point Values - Not-greater-than (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpfalse_ospd] = 14;       // Compare Packed Double-Precision Floating-Point Values - False (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpneq_ospd] = 14;         // Compare Packed Double-Precision Floating-Point Values - Not-equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpge_oqpd] = 14;          // Compare Packed Double-Precision Floating-Point Values - Greater-than-or-equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpgt_oqpd] = 14;          // Compare Packed Double-Precision Floating-Point Values - Greater-than (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmptrue_uspd] = 14;        // Compare Packed Double-Precision Floating-Point Values - True (unordered, signaling)

	SMPTypeCategory[STARS_NN_vcmpeqps] = 14;             // Packed Single-FP Compare - Equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpltps] = 14;             // Packed Single-FP Compare - Less-than (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpleps] = 14;             // Packed Single-FP Compare - Less-than-or-equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpunordps] = 14;          // Packed Single-FP Compare - Unordered (non-signaling)
	SMPTypeCategory[STARS_NN_vcmpneqps] = 14;            // Packed Single-FP Compare - Not-equal (unordered, non-signaling)

	SMPTypeCategory[STARS_NN_vcmpnltps] = 14;            // Packed Single-FP Compare - Not-less-than (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpnleps] = 14;            // Packed Single-FP Compare - Not-less-than-or-equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpordps] = 14;            // Packed Single-FP Compare - Ordered (non-signaling)
	SMPTypeCategory[STARS_NN_vcmpeq_uqps] = 14;          // Packed Single-FP Compare - Equal (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpngeps] = 14;            // Packed Single-FP Compare - Not-greater-than-or-equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpngtps] = 14;            // Packed Single-FP Compare - Not-greater-than (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpfalseps] = 14;          // Packed Single-FP Compare - False (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpneq_oqps] = 14;         // Packed Single-FP Compare - Not-equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpgeps] = 14;             // Packed Single-FP Compare - Greater-than-or-equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpgtps] = 14;             // Packed Single-FP Compare - Greater-than (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmptrueps] = 14;           // Packed Single-FP Compare - True (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpeq_osps] = 14;          // Packed Single-FP Compare - Equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmplt_oqps] = 14;          // Packed Single-FP Compare - Less-than (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmple_oqps] = 14;          // Packed Single-FP Compare - Less-than-or-equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpunord_sps] = 14;        // Packed Single-FP Compare - Unordered (signaling)
	SMPTypeCategory[STARS_NN_vcmpneq_usps] = 14;         // Packed Single-FP Compare - Not-equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpnlt_uqps] = 14;         // Packed Single-FP Compare - Not-less-than (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpnle_uqps] = 14;         // Packed Single-FP Compare - Not-less-than-or-equal (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpord_sps] = 14;          // Packed Single-FP Compare - Ordered (signaling)
	SMPTypeCategory[STARS_NN_vcmpeq_usps] = 14;          // Packed Single-FP Compare - Equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpnge_uqps] = 14;         // Packed Single-FP Compare - Not-greater-than-or-equal (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpngt_uqps] = 14;         // Packed Single-FP Compare - Not-greater-than (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpfalse_osps] = 14;       // Packed Single-FP Compare - False (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpneq_osps] = 14;         // Packed Single-FP Compare - Not-equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpge_oqps] = 14;          // Packed Single-FP Compare - Greater-than-or-equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpgt_oqps] = 14;          // Packed Single-FP Compare - Greater-than (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmptrue_usps] = 14;        // Packed Single-FP Compare - True (unordered, signaling)


	SMPTypeCategory[STARS_NN_vcmpeqsd] = 14;             // Compare Scalar Double-Precision Floating-Point Values - Equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpltsd] = 14;             // Compare Scalar Double-Precision Floating-Point Values - Less-than (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmplesd] = 14;             // Compare Scalar Double-Precision Floating-Point Values - Less-than-or-equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpunordsd] = 14;          // Compare Scalar Double-Precision Floating-Point Values - Unordered (non-signaling)
	SMPTypeCategory[STARS_NN_vcmpneqsd] = 14;            // Compare Scalar Double-Precision Floating-Point Values - Not-equal (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpnltsd] = 14;            // Compare Scalar Double-Precision Floating-Point Values - Not-less-than (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpnlesd] = 14;            // Compare Scalar Double-Precision Floating-Point Values - Not-less-than-or-equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpordsd] = 14;            // Compare Scalar Double-Precision Floating-Point Values - Ordered (non-signaling)
	SMPTypeCategory[STARS_NN_vcmpeq_uqsd] = 14;          // Compare Scalar Double-Precision Floating-Point Values - Equal (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpngesd] = 14;            // Compare Scalar Double-Precision Floating-Point Values - Not-greater-than-or-equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpngtsd] = 14;            // Compare Scalar Double-Precision Floating-Point Values - Not-greater-than (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpfalsesd] = 14;          // Compare Scalar Double-Precision Floating-Point Values - False (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpneq_oqsd] = 14;         // Compare Scalar Double-Precision Floating-Point Values - Not-equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpgesd] = 14;             // Compare Scalar Double-Precision Floating-Point Values - Greater-than-or-equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpgtsd] = 14;             // Compare Scalar Double-Precision Floating-Point Values - Greater-than (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmptruesd] = 14;           // Compare Scalar Double-Precision Floating-Point Values - True (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpeq_ossd] = 14;          // Compare Scalar Double-Precision Floating-Point Values - Equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmplt_oqsd] = 14;          // Compare Scalar Double-Precision Floating-Point Values - Less-than (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmple_oqsd] = 14;          // Compare Scalar Double-Precision Floating-Point Values - Less-than-or-equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpunord_ssd] = 14;        // Compare Scalar Double-Precision Floating-Point Values - Unordered (signaling)
	SMPTypeCategory[STARS_NN_vcmpneq_ussd] = 14;         // Compare Scalar Double-Precision Floating-Point Values - Not-equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpnlt_uqsd] = 14;         // Compare Scalar Double-Precision Floating-Point Values - Not-less-than (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpnle_uqsd] = 14;         // Compare Scalar Double-Precision Floating-Point Values - Not-less-than-or-equal (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpord_ssd] = 14;          // Compare Scalar Double-Precision Floating-Point Values - Ordered (signaling)
	SMPTypeCategory[STARS_NN_vcmpeq_ussd] = 14;          // Compare Scalar Double-Precision Floating-Point Values - Equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpnge_uqsd] = 14;         // Compare Scalar Double-Precision Floating-Point Values - Not-greater-than-or-equal (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpngt_uqsd] = 14;         // Compare Scalar Double-Precision Floating-Point Values - Not-greater-than (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpfalse_ossd] = 14;       // Compare Scalar Double-Precision Floating-Point Values - False (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpneq_ossd] = 14;         // Compare Scalar Double-Precision Floating-Point Values - Not-equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpge_oqsd] = 14;          // Compare Scalar Double-Precision Floating-Point Values - Greater-than-or-equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpgt_oqsd] = 14;          // Compare Scalar Double-Precision Floating-Point Values - Greater-than (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmptrue_ussd] = 14;        // Compare Scalar Double-Precision Floating-Point Values - True (unordered, signaling)


	SMPTypeCategory[STARS_NN_vcmpeqss] = 14;             // Scalar Single-FP Compare - Equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpltss] = 14;             // Scalar Single-FP Compare - Less-than (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpless] = 14;             // Scalar Single-FP Compare - Less-than-or-equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpunordss] = 14;          // Scalar Single-FP Compare - Unordered (non-signaling)
	SMPTypeCategory[STARS_NN_vcmpneqss] = 14;            // Scalar Single-FP Compare - Not-equal (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpnltss] = 14;            // Scalar Single-FP Compare - Not-less-than (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpnless] = 14;            // Scalar Single-FP Compare - Not-less-than-or-equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpordss] = 14;            // Scalar Single-FP Compare - Ordered (non-signaling)
	SMPTypeCategory[STARS_NN_vcmpeq_uqss] = 14;          // Scalar Single-FP Compare - Equal (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpngess] = 14;            // Scalar Single-FP Compare - Not-greater-than-or-equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpngtss] = 14;            // Scalar Single-FP Compare - Not-greater-than (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpfalsess] = 14;          // Scalar Single-FP Compare - False (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpneq_oqss] = 14;         // Scalar Single-FP Compare - Not-equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpgess] = 14;             // Scalar Single-FP Compare - Greater-than-or-equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpgtss] = 14;             // Scalar Single-FP Compare - Greater-than (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmptruess] = 14;           // Scalar Single-FP Compare - True (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpeq_osss] = 14;          // Scalar Single-FP Compare - Equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmplt_oqss] = 14;          // Scalar Single-FP Compare - Less-than (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmple_oqss] = 14;          // Scalar Single-FP Compare - Less-than-or-equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpunord_sss] = 14;        // Scalar Single-FP Compare - Unordered (signaling)
	SMPTypeCategory[STARS_NN_vcmpneq_usss] = 14;         // Scalar Single-FP Compare - Not-equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpnlt_uqss] = 14;         // Scalar Single-FP Compare - Not-less-than (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpnle_uqss] = 14;         // Scalar Single-FP Compare - Not-less-than-or-equal (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpord_sss] = 14;          // Scalar Single-FP Compare - Ordered (signaling)
	SMPTypeCategory[STARS_NN_vcmpeq_usss] = 14;          // Scalar Single-FP Compare - Equal (unordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpnge_uqss] = 14;         // Scalar Single-FP Compare - Not-greater-than-or-equal (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpngt_uqss] = 14;         // Scalar Single-FP Compare - Not-greater-than (unordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpfalse_osss] = 14;       // Scalar Single-FP Compare - False (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpneq_osss] = 14;         // Scalar Single-FP Compare - Not-equal (ordered, signaling)
	SMPTypeCategory[STARS_NN_vcmpge_oqss] = 14;          // Scalar Single-FP Compare - Greater-than-or-equal (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmpgt_oqss] = 14;          // Scalar Single-FP Compare - Greater-than (ordered, non-signaling)
	SMPTypeCategory[STARS_NN_vcmptrue_usss] = 14;        // Scalar Single-FP Compare - True (unordered, signaling)

	// AVX-512 instructions

	SMPTypeCategory[STARS_NN_valignd] = 14;              // Align Doubleword Vectors
	SMPTypeCategory[STARS_NN_valignq] = 14;              // Align Quadword Vectors
	SMPTypeCategory[STARS_NN_vblendmpd] = 14;            // Blend Float64 Vectors Using an OpMask Control
	SMPTypeCategory[STARS_NN_vblendmps] = 14;            // Blend Float32 Vectors Using an OpMask Control
	SMPTypeCategory[STARS_NN_vpblendmb] = 14;            // Blend Byte Vectors Using an Opmask Control
	SMPTypeCategory[STARS_NN_vpblendmw] = 14;            // Blend Word Vectors Using an Opmask Control
	SMPTypeCategory[STARS_NN_vpblendmd] = 14;            // Blend Int32 Vectors Using an OpMask Control
	SMPTypeCategory[STARS_NN_vpblendmq] = 14;            // Blend Int64 Vectors Using an OpMask Control
	SMPTypeCategory[STARS_NN_vbroadcastf32x2] = 14;      // Load with Broadcast Floating-Point Data
	SMPTypeCategory[STARS_NN_vbroadcastf32x4] = 14;      // Load with Broadcast Floating-Point Data
	SMPTypeCategory[STARS_NN_vbroadcastf64x2] = 14;      // Load with Broadcast Floating-Point Data
	SMPTypeCategory[STARS_NN_vbroadcastf32x8] = 14;      // Load with Broadcast Floating-Point Data
	SMPTypeCategory[STARS_NN_vbroadcastf64x4] = 14;      // Load with Broadcast Floating-Point Data
	SMPTypeCategory[STARS_NN_vbroadcasti32x2] = 14;      // Load Integer and Broadcast
	SMPTypeCategory[STARS_NN_vbroadcasti32x4] = 14;      // Load Integer and Broadcast
	SMPTypeCategory[STARS_NN_vbroadcasti64x2] = 14;      // Load Integer and Broadcast
	SMPTypeCategory[STARS_NN_vbroadcasti32x8] = 14;      // Load Integer and Broadcast
	SMPTypeCategory[STARS_NN_vbroadcasti64x4] = 14;      // Load Integer and Broadcast
	SMPTypeCategory[STARS_NN_vcompresspd] = 14;          // Store Sparse Packed Double-Precision Floating-Point Values into Dense Memory
	SMPTypeCategory[STARS_NN_vcompressps] = 14;          // Store Sparse Packed Single-Precision Floating-Point Values into Dense Memory
	SMPTypeCategory[STARS_NN_vcvtpd2qq] = 14;            // Convert Packed Double-Precision Floating-Point Values to Packed Quadword Integers
	SMPTypeCategory[STARS_NN_vcvtpd2udq] = 14;           // Convert Packed Double-Precision Floating-Point Values to Packed Unsigned Doubleword Integers
	SMPTypeCategory[STARS_NN_vcvtpd2uqq] = 14;           // Convert Packed Double-Precision Floating-Point Values to Packed Unsigned Quadword Integers
	SMPTypeCategory[STARS_NN_vcvtps2udq] = 14;           // Convert Packed Single-Precision Floating-Point Values to Packed Unsigned Doubleword Integer Values
	SMPTypeCategory[STARS_NN_vcvtps2qq] = 14;            // Convert Packed Single Precision Floating-Point Values to Packed Singed Quadword Integer Values
	SMPTypeCategory[STARS_NN_vcvtps2uqq] = 14;           // Convert Packed Single Precision Floating-Point Values to Packed Unsigned Quadword Integer Values
	SMPTypeCategory[STARS_NN_vcvtqq2pd] = 14;            // Convert Packed Quadword Integers to Packed Double-Precision Floating-Point Values
	SMPTypeCategory[STARS_NN_vcvtqq2ps] = 14;            // Convert Packed Quadword Integers to Packed Single-Precision Floating-Point Values
	SMPTypeCategory[STARS_NN_vcvtsd2usi] = 14;           // Convert Scalar Double-Precision Floating-Point Value to Unsigned Doubleword Integer
	SMPTypeCategory[STARS_NN_vcvtss2usi] = 14;           // Convert Scalar Single-Precision Floating-Point Value to Unsigned Doubleword Integer
	SMPTypeCategory[STARS_NN_vcvttpd2qq] = 14;           // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Quadword Integers
	SMPTypeCategory[STARS_NN_vcvttpd2udq] = 14;          // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Unsigned Doubleword Integers
	SMPTypeCategory[STARS_NN_vcvttpd2uqq] = 14;          // Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Unsigned Quadword Integers
	SMPTypeCategory[STARS_NN_vcvttps2udq] = 14;          // Convert with Truncation Packed Single-Precision Floating-Point Values to Packed Unsigned Doubleword Integer Values
	SMPTypeCategory[STARS_NN_vcvttps2qq] = 14;           // Convert with Truncation Packed Single Precision Floating-Point Values to Packed Singed Quadword Integer Values
	SMPTypeCategory[STARS_NN_vcvttps2uqq] = 14;          // Convert with Truncation Packed Single Precision Floating-Point Values to Packed Unsigned Quadword Integer Values
	SMPTypeCategory[STARS_NN_vcvttsd2usi] = 14;          // Convert with Truncation Scalar Double-Precision Floating-Point Value to Unsigned Integer
	SMPTypeCategory[STARS_NN_vcvttss2usi] = 14;          // Convert with Truncation Scalar Single-Precision Floating-Point Value to Unsigned Integer
	SMPTypeCategory[STARS_NN_vcvtudq2pd] = 14;           // Convert Packed Unsigned Doubleword Integers to Packed Double-Precision Floating-Point Values
	SMPTypeCategory[STARS_NN_vcvtudq2ps] = 14;           // Convert Packed Unsigned Doubleword Integers to Packed Single-Precision Floating-Point Values
	SMPTypeCategory[STARS_NN_vcvtuqq2pd] = 14;           // Convert Packed Unsigned Quadword Integers to Packed Double-Precision Floating-Point Values
	SMPTypeCategory[STARS_NN_vcvtuqq2ps] = 14;           // Convert Packed Unsigned Quadword Integers to Packed Single-Precision Floating-Point Values
	SMPTypeCategory[STARS_NN_vcvtusi2sd] = 14;           // Convert Unsigned Integer to Scalar Double-Precision Floating-Point Value
	SMPTypeCategory[STARS_NN_vcvtusi2ss] = 14;           // Convert Unsigned Integer to Scalar Single-Precision Floating-Point Value
	SMPTypeCategory[STARS_NN_vdbpsadbw] = 14;            // Double Block Packed Sum-Absolute-Differences (SAD) on Unsigned Bytes
	SMPTypeCategory[STARS_NN_vexpandpd] = 14;            // Load Sparse Packed Double-Precision Floating-Point Values from Dense Memory
	SMPTypeCategory[STARS_NN_vexpandps] = 14;            // Load Sparse Packed Single-Precision Floating-Point Values from Dense Memory
	SMPTypeCategory[STARS_NN_vextractf32x4] = 14;        // Extract Packed Floating-Point Values
	SMPTypeCategory[STARS_NN_vextractf64x2] = 14;        // Extract Packed Floating-Point Values
	SMPTypeCategory[STARS_NN_vextractf32x8] = 14;        // Extract Packed Floating-Point Values
	SMPTypeCategory[STARS_NN_vextractf64x4] = 14;        // Extract Packed Floating-Point Values
	SMPTypeCategory[STARS_NN_vextracti32x4] = 14;        // Extract packed Integer Values
	SMPTypeCategory[STARS_NN_vextracti64x2] = 14;        // Extract packed Integer Values
	SMPTypeCategory[STARS_NN_vextracti32x8] = 14;        // Extract packed Integer Values
	SMPTypeCategory[STARS_NN_vextracti64x4] = 14;        // Extract packed Integer Values
	SMPTypeCategory[STARS_NN_vfixupimmpd] = 14;          // Fix Up Special Packed Float64 Values
	SMPTypeCategory[STARS_NN_vfixupimmps] = 14;          // Fix Up Special Packed Float32 Values
	SMPTypeCategory[STARS_NN_vfixupimmsd] = 14;          // Fix Up Special Scalar Float64 Value
	SMPTypeCategory[STARS_NN_vfixupimmss] = 14;          // Fix Up Special Scalar Float32 Value
	SMPTypeCategory[STARS_NN_vfpclasspd] = 14;           // Tests Types Of a Packed Float64 Values
	SMPTypeCategory[STARS_NN_vfpclassps] = 14;           // Tests Types Of a Packed Float32 Values
	SMPTypeCategory[STARS_NN_vfpclasssd] = 14;           // Tests Types Of a Scalar Float64 Values
	SMPTypeCategory[STARS_NN_vfpclassss] = 14;           // Tests Types Of a Scalar Float32 Values
	SMPTypeCategory[STARS_NN_vgetexppd] = 14;            // Convert Exponents of Packed DP FP Values to DP FP Values
	SMPTypeCategory[STARS_NN_vgetexpps] = 14;            // Convert Exponents of Packed SP FP Values to SP FP Values
	SMPTypeCategory[STARS_NN_vgetexpsd] = 14;            // Convert Exponents of Scalar DP FP Values to DP FP Value
	SMPTypeCategory[STARS_NN_vgetexpss] = 14;            // Convert Exponents of Scalar SP FP Values to SP FP Value
	SMPTypeCategory[STARS_NN_vgetmantpd] = 14;           // Extract Float64 Vector of Normalized Mantissas from Float64 Vector
	SMPTypeCategory[STARS_NN_vgetmantps] = 14;           // Extract Float32 Vector of Normalized Mantissas from Float32 Vector
	SMPTypeCategory[STARS_NN_vgetmantsd] = 14;           // Extract Float64 of Normalized Mantissas from Float64 Scalar
	SMPTypeCategory[STARS_NN_vgetmantss] = 14;           // Extract Float32 Vector of Normalized Mantissa from Float32 Vector
	SMPTypeCategory[STARS_NN_vinsertf32x4] = 14;         // Insert Packed Floating-Point Values
	SMPTypeCategory[STARS_NN_vinsertf64x2] = 14;         // Insert Packed Floating-Point Values
	SMPTypeCategory[STARS_NN_vinsertf32x8] = 14;         // Insert Packed Floating-Point Values
	SMPTypeCategory[STARS_NN_vinsertf64x4] = 14;         // Insert Packed Floating-Point Values
	SMPTypeCategory[STARS_NN_vinserti32x4] = 14;         // Insert Packed Integer Values
	SMPTypeCategory[STARS_NN_vinserti64x2] = 14;         // Insert Packed Integer Values
	SMPTypeCategory[STARS_NN_vinserti32x8] = 14;         // Insert Packed Integer Values
	SMPTypeCategory[STARS_NN_vinserti64x4] = 14;         // Insert Packed Integer Values
	SMPTypeCategory[STARS_NN_vmovdqa32] = 14;            // Move Aligned Packed Integer Values
	SMPTypeCategory[STARS_NN_vmovdqa64] = 14;            // Move Aligned Packed Integer Values
	SMPTypeCategory[STARS_NN_vmovdqu8] = 14;             // Move Unaligned Packed Integer Values
	SMPTypeCategory[STARS_NN_vmovdqu16] = 14;            // Move Unaligned Packed Integer Values
	SMPTypeCategory[STARS_NN_vmovdqu32] = 14;            // Move Unaligned Packed Integer Values
	SMPTypeCategory[STARS_NN_vmovdqu64] = 14;            // Move Unaligned Packed Integer Values
	SMPTypeCategory[STARS_NN_vpabsq] = 14;               // Packed Absolute Value
	SMPTypeCategory[STARS_NN_vpandd] = 14;               // Logical AND
	SMPTypeCategory[STARS_NN_vpandq] = 14;               // Logical AND
	SMPTypeCategory[STARS_NN_vpandnd] = 14;              // Logical AND NOT
	SMPTypeCategory[STARS_NN_vpandnq] = 14;              // Logical AND NOT
	SMPTypeCategory[STARS_NN_vpbroadcastmb2q] = 14;      // Broadcast Mask to Vector Register
	SMPTypeCategory[STARS_NN_vpbroadcastmw2d] = 14;      // Broadcast Mask to Vector Register
	SMPTypeCategory[STARS_NN_vpcmpb] = 14;               // Compare Packed Byte Values Into Mask
	SMPTypeCategory[STARS_NN_vpcmpub] = 14;              // Compare Packed Byte Values Into Mask
	SMPTypeCategory[STARS_NN_vpcmpd] = 14;               // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpud] = 14;              // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpq] = 14;               // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpuq] = 14;              // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpw] = 14;               // Compare Packed Word Values Into Mask
	SMPTypeCategory[STARS_NN_vpcmpuw] = 14;              // Compare Packed Word Values Into Mask
	SMPTypeCategory[STARS_NN_vpcompressd] = 14;          // Store Sparse Packed Doubleword Integer Values into Dense Memory/Register
	SMPTypeCategory[STARS_NN_vpcompressq] = 14;          // Store Sparse Packed Quadword Integer Values into Dense Memory/Register
	SMPTypeCategory[STARS_NN_vpconflictd] = 14;          // Detect Conflicts Within a Vector of Packed Dword Values into Dense Memory/Register
	SMPTypeCategory[STARS_NN_vpconflictq] = 14;          // Detect Conflicts Within a Vector of Packed Qword Values into Dense Memory/Register
	SMPTypeCategory[STARS_NN_vpermb] = 14;               // Permute Packed Bytes Elements
	SMPTypeCategory[STARS_NN_vpermw] = 14;               // Permute Packed Words Elements
	SMPTypeCategory[STARS_NN_vpermi2b] = 14;             // Full Permute of Bytes From Two Tables Overwriting the Index
	SMPTypeCategory[STARS_NN_vpermi2w] = 14;             // Full Permute From Two Tables Overwriting the Index
	SMPTypeCategory[STARS_NN_vpermi2d] = 14;             // Full Permute From Two Tables Overwriting the Index
	SMPTypeCategory[STARS_NN_vpermi2q] = 14;             // Full Permute From Two Tables Overwriting the Index
	SMPTypeCategory[STARS_NN_vpermi2ps] = 14;            // Full Permute From Two Tables Overwriting the Index
	SMPTypeCategory[STARS_NN_vpermi2pd] = 14;            // Full Permute From Two Tables Overwriting the Index
	SMPTypeCategory[STARS_NN_vpermt2b] = 14;             // Full Permute of Bytes From Two Tables Overwriting a Table
	SMPTypeCategory[STARS_NN_vpermt2w] = 14;             // Full Permute from Two Tables Overwriting one Table
	SMPTypeCategory[STARS_NN_vpermt2d] = 14;             // Full Permute from Two Tables Overwriting one Table
	SMPTypeCategory[STARS_NN_vpermt2q] = 14;             // Full Permute from Two Tables Overwriting one Table
	SMPTypeCategory[STARS_NN_vpermt2ps] = 14;            // Full Permute from Two Tables Overwriting one Table
	SMPTypeCategory[STARS_NN_vpermt2pd] = 14;            // Full Permute from Two Tables Overwriting one Table
	SMPTypeCategory[STARS_NN_vpexpandd] = 14;            // Load Sparse Packed Doubleword Integer Values from Dense Memory/Register
	SMPTypeCategory[STARS_NN_vpexpandq] = 14;            // Load Sparse Packed Quadword Integer Values from Dense Memory/Register
	SMPTypeCategory[STARS_NN_vplzcntd] = 14;             // Count the Number of Leading Zero Bits for Packed Dword Values
	SMPTypeCategory[STARS_NN_vplzcntq] = 14;             // Count the Number of Leading Zero Bits for Packed Qword Values
	SMPTypeCategory[STARS_NN_vpmadd52luq] = 14;          // Packed Multiply of Unsigned 52-bit Integers and Add the Low 52-bit Products to Qword Accumulators
	SMPTypeCategory[STARS_NN_vpmadd52huq] = 14;          // Packed Multiply of Unsigned 52-bit Unsigned Integers and Add High 52-bit Products to 64-bit Accumulators
	SMPTypeCategory[STARS_NN_vpmaxsq] = 14;              // Maximum of Packed Signed Integers
	SMPTypeCategory[STARS_NN_vpmaxuq] = 14;              // Maximum of Packed Unsigned Integers
	SMPTypeCategory[STARS_NN_vpminsq] = 14;              // Minimum of Packed Signed Integers
	SMPTypeCategory[STARS_NN_vpminuq] = 14;              // Minimum of Packed Unsigned Integers
	SMPTypeCategory[STARS_NN_vpmovm2b] = 14;             // Convert a Mask Register to a Vector Register
	SMPTypeCategory[STARS_NN_vpmovm2w] = 14;             // Convert a Mask Register to a Vector Register
	SMPTypeCategory[STARS_NN_vpmovm2d] = 14;             // Convert a Mask Register to a Vector Register
	SMPTypeCategory[STARS_NN_vpmovm2q] = 14;             // Convert a Mask Register to a Vector Register
	SMPTypeCategory[STARS_NN_vpmovb2m] = 14;             // Convert a Vector Register to a Mask
	SMPTypeCategory[STARS_NN_vpmovw2m] = 14;             // Convert a Vector Register to a Mask
	SMPTypeCategory[STARS_NN_vpmovd2m] = 14;             // Convert a Vector Register to a Mask
	SMPTypeCategory[STARS_NN_vpmovq2m] = 14;             // Convert a Vector Register to a Mask
	SMPTypeCategory[STARS_NN_vpmovqb] = 14;              // Down Convert QWord to Byte
	SMPTypeCategory[STARS_NN_vpmovsqb] = 14;             // Down Convert QWord to Byte
	SMPTypeCategory[STARS_NN_vpmovusqb] = 14;            // Down Convert QWord to Byte
	SMPTypeCategory[STARS_NN_vpmovqw] = 14;              // Down Convert QWord to Word
	SMPTypeCategory[STARS_NN_vpmovsqw] = 14;             // Down Convert QWord to Word
	SMPTypeCategory[STARS_NN_vpmovusqw] = 14;            // Down Convert QWord to Word
	SMPTypeCategory[STARS_NN_vpmovqd] = 14;              // Down Convert QWord to DWord
	SMPTypeCategory[STARS_NN_vpmovsqd] = 14;             // Down Convert QWord to DWord
	SMPTypeCategory[STARS_NN_vpmovusqd] = 14;            // Down Convert QWord to DWord
	SMPTypeCategory[STARS_NN_vpmovdb] = 14;              // Down Convert DWord to Byte
	SMPTypeCategory[STARS_NN_vpmovsdb] = 14;             // Down Convert DWord to Byte
	SMPTypeCategory[STARS_NN_vpmovusdb] = 14;            // Down Convert DWord to Byte
	SMPTypeCategory[STARS_NN_vpmovdw] = 14;              // Down Convert DWord to Word
	SMPTypeCategory[STARS_NN_vpmovsdw] = 14;             // Down Convert DWord to Word
	SMPTypeCategory[STARS_NN_vpmovusdw] = 14;            // Down Convert DWord to Word
	SMPTypeCategory[STARS_NN_vpmovwb] = 14;              // Down Convert Word to Byte
	SMPTypeCategory[STARS_NN_vpmovswb] = 14;             // Down Convert Word to Byte
	SMPTypeCategory[STARS_NN_vpmovuswb] = 14;            // Down Convert Word to Byte
	SMPTypeCategory[STARS_NN_vpmullq] = 14;              // Multiply Packed Integers and Store Low Result
	SMPTypeCategory[STARS_NN_vpmultishiftqb] = 14;       // Select Packed Unaligned Bytes from Quadword Sources
	SMPTypeCategory[STARS_NN_vpord] = 14;                // Bitwise Logical Or
	SMPTypeCategory[STARS_NN_vporq] = 14;                // Bitwise Logical Or
	SMPTypeCategory[STARS_NN_vprold] = 14;               // Bit Rotate Left
	SMPTypeCategory[STARS_NN_vprolvd] = 14;              // Bit Rotate Left
	SMPTypeCategory[STARS_NN_vprolq] = 14;               // Bit Rotate Left
	SMPTypeCategory[STARS_NN_vprolvq] = 14;              // Bit Rotate Left
	SMPTypeCategory[STARS_NN_vprord] = 14;               // Bit Rotate Right
	SMPTypeCategory[STARS_NN_vprorvd] = 14;              // Bit Rotate Right
	SMPTypeCategory[STARS_NN_vprorq] = 14;               // Bit Rotate Right
	SMPTypeCategory[STARS_NN_vprorvq] = 14;              // Bit Rotate Right
	SMPTypeCategory[STARS_NN_vpscatterdd] = 14;          // Scatter Packed Dword with Signed Dword
	SMPTypeCategory[STARS_NN_vpscatterdq] = 14;          // Scatter Packed Qword with Signed Qword Indices
	SMPTypeCategory[STARS_NN_vpscatterqd] = 14;          // Scatter Packed Dword with Signed Dword
	SMPTypeCategory[STARS_NN_vpscatterqq] = 14;          // Scatter Packed Qword with Signed Qword Indices
	SMPTypeCategory[STARS_NN_vpsraq] = 14;               // Bit Shift Arithmetic Right
	SMPTypeCategory[STARS_NN_vpsllvw] = 14;              // Variable Bit Shift Left Logical
	SMPTypeCategory[STARS_NN_vpsrlvw] = 14;              // Variable Bit Shift Right Logical
	SMPTypeCategory[STARS_NN_vptestnmb] = 14;            // Logical NAND and Set
	SMPTypeCategory[STARS_NN_vptestnmw] = 14;            // Logical NAND and Set
	SMPTypeCategory[STARS_NN_vptestnmd] = 14;            // Logical NAND and Set
	SMPTypeCategory[STARS_NN_vptestnmq] = 14;            // Logical NAND and Set
	SMPTypeCategory[STARS_NN_vshuff32x4] = 14;           // Shuffle Packed Values at 128-bit Granularity
	SMPTypeCategory[STARS_NN_vshuff64x2] = 14;           // Shuffle Packed Values at 128-bit Granularity
	SMPTypeCategory[STARS_NN_vshufi32x4] = 14;           // Shuffle Packed Values at 128-bit Granularity
	SMPTypeCategory[STARS_NN_vshufi64x2] = 14;           // Shuffle Packed Values at 128-bit Granularity
	SMPTypeCategory[STARS_NN_vpternlogd] = 14;           // Bitwise Ternary Logic
	SMPTypeCategory[STARS_NN_vpternlogq] = 14;           // Bitwise Ternary Logic
	SMPTypeCategory[STARS_NN_vptestmb] = 14;             // Logical AND and Set Mask
	SMPTypeCategory[STARS_NN_vptestmw] = 14;             // Logical AND and Set Mask
	SMPTypeCategory[STARS_NN_vptestmd] = 14;             // Logical AND and Set Mask
	SMPTypeCategory[STARS_NN_vptestmq] = 14;             // Logical AND and Set Mask
	SMPTypeCategory[STARS_NN_vpsravw] = 14;              // Variable Bit Shift Right Arithmetic
	SMPTypeCategory[STARS_NN_vpsravq] = 14;              // Variable Bit Shift Right Arithmetic
	SMPTypeCategory[STARS_NN_vpxord] = 14;               // Exclusive Or
	SMPTypeCategory[STARS_NN_vpxorq] = 14;               // Exclusive Or
	SMPTypeCategory[STARS_NN_vrangepd] = 14;             // Range Restriction Calculation For Packed Pairs of Float64 Values
	SMPTypeCategory[STARS_NN_vrangeps] = 14;             // Range Restriction Calculation For Packed Pairs of Float32 Values
	SMPTypeCategory[STARS_NN_vrangesd] = 14;             // Range Restriction Calculation From a pair of Scalar Float64 Values
	SMPTypeCategory[STARS_NN_vrangess] = 14;             // Range Restriction Calculation From a Pair of Scalar Float32 Values
	SMPTypeCategory[STARS_NN_vrcp14pd] = 14;             // Compute Approximate Reciprocals of Packed Float64 Values
	SMPTypeCategory[STARS_NN_vrcp14sd] = 14;             // Compute Approximate Reciprocal of Scalar Float64 Value
	SMPTypeCategory[STARS_NN_vrcp14ps] = 14;             // Compute Approximate Reciprocals of Packed Float32 Values
	SMPTypeCategory[STARS_NN_vrcp14ss] = 14;             // Compute Approximate Reciprocal of Scalar Float32 Value
	SMPTypeCategory[STARS_NN_vreducepd] = 14;            // Perform Reduction Transformation on Packed Float64 Values
	SMPTypeCategory[STARS_NN_vreducesd] = 14;            // Perform a Reduction Transformation on a Scalar Float64 Value
	SMPTypeCategory[STARS_NN_vreduceps] = 14;            // Perform Reduction Transformation on Packed Float32 Values
	SMPTypeCategory[STARS_NN_vreducess] = 14;            // Perform a Reduction Transformation on a Scalar Float32 Value
	SMPTypeCategory[STARS_NN_vrndscalepd] = 14;          // Round Packed Float64 Values To Include A Given Number Of Fraction Bits
	SMPTypeCategory[STARS_NN_vrndscalesd] = 14;          // Round Scalar Float64 Value To Include A Given Number Of Fraction Bits
	SMPTypeCategory[STARS_NN_vrndscaleps] = 14;          // Round Packed Float32 Values To Include A Given Number Of Fraction Bits
	SMPTypeCategory[STARS_NN_vrndscaless] = 14;          // Round Scalar Float32 Value To Include A Given Number Of Fraction Bits
	SMPTypeCategory[STARS_NN_vrsqrt14pd] = 14;           // Compute Approximate Reciprocals of Square Roots of Packed Float64 Values
	SMPTypeCategory[STARS_NN_vrsqrt14sd] = 14;           // Compute Approximate Reciprocal of Square Root of Scalar Float64 Value
	SMPTypeCategory[STARS_NN_vrsqrt14ps] = 14;           // Compute Approximate Reciprocals of Square Roots of Packed Float32 Values
	SMPTypeCategory[STARS_NN_vrsqrt14ss] = 14;           // Compute Approximate Reciprocal of Square Root of Scalar Float32 Value
	SMPTypeCategory[STARS_NN_vscalefpd] = 14;            // Scale Packed Float64 Values With Float64 Values
	SMPTypeCategory[STARS_NN_vscalefsd] = 14;            // Scale Scalar Float64 Values With Float64 Values
	SMPTypeCategory[STARS_NN_vscalefps] = 14;            // Scale Packed Float32 Values With Float32 Values
	SMPTypeCategory[STARS_NN_vscalefss] = 14;            // Scale Scalar Float32 Value With Float32 Value
	SMPTypeCategory[STARS_NN_vscatterdps] = 14;          // Scatter Packed Single, Packed Double with Signed Dword and Qword Indices
	SMPTypeCategory[STARS_NN_vscatterdpd] = 14;          // Scatter Packed Single, Packed Double with Signed Dword and Qword Indices
	SMPTypeCategory[STARS_NN_vscatterqps] = 14;          // Scatter Packed Single, Packed Double with Signed Dword and Qword Indices
	SMPTypeCategory[STARS_NN_vscatterqpd] = 14;          // Scatter Packed Single, Packed Double with Signed Dword and Qword Indices

	SMPTypeCategory[STARS_NN_vexp2pd] = 14;              // Approximation to the Exponential 2^x of Packed Double-Precision Floating-Point Values with Less Than 2^-23 Relative Error
	SMPTypeCategory[STARS_NN_vexp2ps] = 14;              // Approximation to the Exponential 2^x of Packed Single-Precision Floating-Point Values with Less Than 2^-23 Relative Error
	SMPTypeCategory[STARS_NN_vrcp28pd] = 14;             // Approximation to the Reciprocal of Packed Double-Precision Floating-Point Values with Less Than 2^-28 Relative Error
	SMPTypeCategory[STARS_NN_vrcp28sd] = 14;             // Approximation to the Reciprocal of Scalar Double-Precision Floating-Point Value with Less Than 2^-28 Relative Error
	SMPTypeCategory[STARS_NN_vrcp28ps] = 14;             // Approximation to the Reciprocal of Packed Single-Precision Floating-Point Values with Less Than 2^-28 Relative Error
	SMPTypeCategory[STARS_NN_vrcp28ss] = 14;             // Approximation to the Reciprocal of Scalar Single-Precision Floating-Point Value with Less Than 2^-28 Relative Error
	SMPTypeCategory[STARS_NN_vrsqrt28pd] = 14;           // Approximation to the Reciprocal Square Root of Packed Double-Precision Floating-Point Values with Less Than 2^-28 Relative Error
	SMPTypeCategory[STARS_NN_vrsqrt28sd] = 14;           // Approximation to the Reciprocal Square Root of Scalar Double-Precision Floating-Point Value with Less Than 2^-28 Relative Error
	SMPTypeCategory[STARS_NN_vrsqrt28ps] = 14;           // Approximation to the Reciprocal Square Root of Packed Single-Precision Floating-Point Values with Less Than 2^-28 Relative Error
	SMPTypeCategory[STARS_NN_vrsqrt28ss] = 14;           // Approximation to the Reciprocal Square Root of Scalar Single-Precision Floating-Point Value with Less Than 2^-28 Relative Error

	SMPTypeCategory[STARS_NN_vgatherpf0dps] = 14;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint
	SMPTypeCategory[STARS_NN_vgatherpf0qps] = 14;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint
	SMPTypeCategory[STARS_NN_vgatherpf0dpd] = 14;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint
	SMPTypeCategory[STARS_NN_vgatherpf0qpd] = 14;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint
	SMPTypeCategory[STARS_NN_vgatherpf1dps] = 14;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint
	SMPTypeCategory[STARS_NN_vgatherpf1qps] = 14;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint
	SMPTypeCategory[STARS_NN_vgatherpf1dpd] = 14;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint
	SMPTypeCategory[STARS_NN_vgatherpf1qpd] = 14;        // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint
	SMPTypeCategory[STARS_NN_vscatterpf0dps] = 14;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write
	SMPTypeCategory[STARS_NN_vscatterpf0qps] = 14;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write
	SMPTypeCategory[STARS_NN_vscatterpf0dpd] = 14;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write
	SMPTypeCategory[STARS_NN_vscatterpf0qpd] = 14;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write
	SMPTypeCategory[STARS_NN_vscatterpf1dps] = 14;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write
	SMPTypeCategory[STARS_NN_vscatterpf1qps] = 14;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write
	SMPTypeCategory[STARS_NN_vscatterpf1dpd] = 14;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write
	SMPTypeCategory[STARS_NN_vscatterpf1qpd] = 14;       // Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write

	// AVX-512 comparison pseudo-ops

	SMPTypeCategory[STARS_NN_vpcmpltd] = 14;             // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpled] = 14;             // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpneqd] = 14;            // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpnltd] = 14;            // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpnled] = 14;            // Compare Packed Integer Values into Mask

	SMPTypeCategory[STARS_NN_vpcmpequd] = 14;            // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpltud] = 14;            // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpleud] = 14;            // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpnequd] = 14;           // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpnltud] = 14;           // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpnleud] = 14;           // Compare Packed Integer Values into Mask

	SMPTypeCategory[STARS_NN_vpcmpltq] = 14;             // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpleq] = 14;             // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpneqq] = 14;            // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpnltq] = 14;            // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpnleq] = 14;            // Compare Packed Integer Values into Mask

	SMPTypeCategory[STARS_NN_vpcmpequq] = 14;            // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpltuq] = 14;            // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpleuq] = 14;            // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpnequq] = 14;           // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpnltuq] = 14;           // Compare Packed Integer Values into Mask
	SMPTypeCategory[STARS_NN_vpcmpnleuq] = 14;           // Compare Packed Integer Values into Mask

	// Opmask instructions

	SMPTypeCategory[STARS_NN_kaddw] = 14;                // ADD Two Masks
	SMPTypeCategory[STARS_NN_kaddb] = 14;                // ADD Two Masks
	SMPTypeCategory[STARS_NN_kaddq] = 14;                // ADD Two Masks
	SMPTypeCategory[STARS_NN_kaddd] = 14;                // ADD Two Masks
	SMPTypeCategory[STARS_NN_kandw] = 14;                // Bitwise Logical AND Masks
	SMPTypeCategory[STARS_NN_kandb] = 14;                // Bitwise Logical AND Masks
	SMPTypeCategory[STARS_NN_kandq] = 14;                // Bitwise Logical AND Masks
	SMPTypeCategory[STARS_NN_kandd] = 14;                // Bitwise Logical AND Masks
	SMPTypeCategory[STARS_NN_kandnw] = 14;               // Bitwise Logical AND NOT Masks
	SMPTypeCategory[STARS_NN_kandnb] = 14;               // Bitwise Logical AND NOT Masks
	SMPTypeCategory[STARS_NN_kandnq] = 14;               // Bitwise Logical AND NOT Masks
	SMPTypeCategory[STARS_NN_kandnd] = 14;               // Bitwise Logical AND NOT Masks
	SMPTypeCategory[STARS_NN_kmovw] = 14;                // Move from and to Mask Registers
	SMPTypeCategory[STARS_NN_kmovb] = 14;                // Move from and to Mask Registers
	SMPTypeCategory[STARS_NN_kmovq] = 14;                // Move from and to Mask Registers
	SMPTypeCategory[STARS_NN_kmovd] = 14;                // Move from and to Mask Registers
	SMPTypeCategory[STARS_NN_kunpckbw] = 14;             // Unpack for Mask Registers
	SMPTypeCategory[STARS_NN_kunpckwd] = 14;             // Unpack for Mask Registers
	SMPTypeCategory[STARS_NN_kunpckdq] = 14;             // Unpack for Mask Registers
	SMPTypeCategory[STARS_NN_knotw] = 14;                // NOT Mask Register
	SMPTypeCategory[STARS_NN_knotb] = 14;                // NOT Mask Register
	SMPTypeCategory[STARS_NN_knotq] = 14;                // NOT Mask Register
	SMPTypeCategory[STARS_NN_knotd] = 14;                // NOT Mask Register
	SMPTypeCategory[STARS_NN_korw] = 14;                 // Bitwise Logical OR Masks
	SMPTypeCategory[STARS_NN_korb] = 14;                 // Bitwise Logical OR Masks
	SMPTypeCategory[STARS_NN_korq] = 14;                 // Bitwise Logical OR Masks
	SMPTypeCategory[STARS_NN_kord] = 14;                 // Bitwise Logical OR Masks
	SMPTypeCategory[STARS_NN_kortestw] = 14;             // OR Masks And Set Flags
	SMPTypeCategory[STARS_NN_kortestb] = 14;             // OR Masks And Set Flags
	SMPTypeCategory[STARS_NN_kortestq] = 14;             // OR Masks And Set Flags
	SMPTypeCategory[STARS_NN_kortestd] = 14;             // OR Masks And Set Flags
	SMPTypeCategory[STARS_NN_kshiftlw] = 14;             // Shift Left Mask Registers
	SMPTypeCategory[STARS_NN_kshiftlb] = 14;             // Shift Left Mask Registers
	SMPTypeCategory[STARS_NN_kshiftlq] = 14;             // Shift Left Mask Registers
	SMPTypeCategory[STARS_NN_kshiftld] = 14;             // Shift Left Mask Registers
	SMPTypeCategory[STARS_NN_kshiftrw] = 14;             // Shift Right Mask Registers
	SMPTypeCategory[STARS_NN_kshiftrb] = 14;             // Shift Right Mask Registers
	SMPTypeCategory[STARS_NN_kshiftrq] = 14;             // Shift Right Mask Registers
	SMPTypeCategory[STARS_NN_kshiftrd] = 14;             // Shift Right Mask Registers
	SMPTypeCategory[STARS_NN_kxnorw] = 14;               // Bitwise Logical XNOR Masks
	SMPTypeCategory[STARS_NN_kxnorb] = 14;               // Bitwise Logical XNOR Masks
	SMPTypeCategory[STARS_NN_kxnorq] = 14;               // Bitwise Logical XNOR Masks
	SMPTypeCategory[STARS_NN_kxnord] = 14;               // Bitwise Logical XNOR Masks
	SMPTypeCategory[STARS_NN_ktestw] = 14;               // Packed Bit Test Masks and Set Flags
	SMPTypeCategory[STARS_NN_ktestb] = 14;               // Packed Bit Test Masks and Set Flags
	SMPTypeCategory[STARS_NN_ktestq] = 14;               // Packed Bit Test Masks and Set Flags
	SMPTypeCategory[STARS_NN_ktestd] = 14;               // Packed Bit Test Masks and Set Flags
	SMPTypeCategory[STARS_NN_kxorw] = 14;                // Bitwise Logical XOR Masks
	SMPTypeCategory[STARS_NN_kxorb] = 14;                // Bitwise Logical XOR Masks
	SMPTypeCategory[STARS_NN_kxorq] = 14;                // Bitwise Logical XOR Masks
	SMPTypeCategory[STARS_NN_kxord] = 14;                // Bitwise Logical XOR Masks

	// SHA Extensions

	SMPTypeCategory[STARS_NN_sha1rnds4] = 14;            // Perform Four Rounds of SHA1 Operation
	SMPTypeCategory[STARS_NN_sha1nexte] = 14;            // Calculate SHA1 State Variable E after Four Rounds
	SMPTypeCategory[STARS_NN_sha1msg1] = 14;             // Perform an Intermediate Calculation for the Next Four SHA1 Message Dwords
	SMPTypeCategory[STARS_NN_sha1msg2] = 14;             // Perform a Final Calculation for the Next Four SHA1 Message Dwords
	SMPTypeCategory[STARS_NN_sha256rnds2] = 14;          // Perform Two Rounds of SHA256 Operation
	SMPTypeCategory[STARS_NN_sha256msg1] = 14;           // Perform an Intermediate Calculation for the Next Four SHA256 Message Dwords
	SMPTypeCategory[STARS_NN_sha256msg2] = 14;           // Perform a Final Calculation for the Next Four SHA256 Message Dwords

	// Intel Software Guard Extensions

	SMPTypeCategory[STARS_NN_encls] = 1;                // Execute an Enclave System Function of Specified Leaf Number
	SMPTypeCategory[STARS_NN_enclu] = 1;                // Execute an Enclave User Function of Specified Leaf Number

	// AMD XOP

	SMPTypeCategory[STARS_NN_vfrczpd] = 14;              // Extract Fraction Packed Double-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfrczps] = 14;              // Extract Fraction Packed Single-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfrczsd] = 14;              // Extract Fraction Scalar Double-Precision Floating-Point
	SMPTypeCategory[STARS_NN_vfrczss] = 14;              // Extract Fraction Scalar Single-Precision Floating Point
	SMPTypeCategory[STARS_NN_vpcmov] = 14;               // Vector Conditional Moves
	SMPTypeCategory[STARS_NN_vpcomb] = 14;               // Compare Vector Signed Bytes
	SMPTypeCategory[STARS_NN_vpcomd] = 14;               // Compare Vector Signed Doublewords
	SMPTypeCategory[STARS_NN_vpcomq] = 14;               // Compare Vector Signed Quadwords
	SMPTypeCategory[STARS_NN_vpcomub] = 14;              // Compare Vector Unsigned Bytes
	SMPTypeCategory[STARS_NN_vpcomud] = 14;              // Compare Vector Unsigned Doublewords
	SMPTypeCategory[STARS_NN_vpcomuq] = 14;              // Compare Vector Unsigned Quadwords
	SMPTypeCategory[STARS_NN_vpcomuw] = 14;              // Compare Vector Unsigned Words
	SMPTypeCategory[STARS_NN_vpcomw] = 14;               // Compare Vector Signed Words
	SMPTypeCategory[STARS_NN_vpermil2pd] = 14;           // Permute Two-Source Double-Precision Floating-Point Values
	SMPTypeCategory[STARS_NN_vpermil2ps] = 14;           // Permute Two-Source Single-Precision Floating-Point Values
	SMPTypeCategory[STARS_NN_vphaddbd] = 14;             // Packed Horizontal Add Signed Byte to Signed Doubleword
	SMPTypeCategory[STARS_NN_vphaddbq] = 14;             // Packed Horizontal Add Signed Byte to Signed Quadword
	SMPTypeCategory[STARS_NN_vphaddbw] = 14;             // Packed Horizontal Add Signed Byte to Signed Word
	SMPTypeCategory[STARS_NN_vphadddq] = 14;             // Packed Horizontal Add Signed Doubleword to Signed Quadword
	SMPTypeCategory[STARS_NN_vphaddubd] = 14;            // Packed Horizontal Add Unsigned Byte to Doubleword
	SMPTypeCategory[STARS_NN_vphaddubq] = 14;            // Packed Horizontal Add Unsigned Byte to Quadword
	SMPTypeCategory[STARS_NN_vphaddubw] = 14;            // Packed Horizontal Add Unsigned Byte to Word
	SMPTypeCategory[STARS_NN_vphaddudq] = 14;            // Packed Horizontal Add Unsigned Doubleword to Quadword
	SMPTypeCategory[STARS_NN_vphadduwd] = 14;            // Packed Horizontal Add Unsigned Word to Doubleword
	SMPTypeCategory[STARS_NN_vphadduwq] = 14;            // Packed Horizontal Add Unsigned Word to Quadword
	SMPTypeCategory[STARS_NN_vphaddwd] = 14;             // Packed Horizontal Add Signed Word to Signed Doubleword
	SMPTypeCategory[STARS_NN_vphaddwq] = 14;             // Packed Horizontal Add Signed Word to Signed Quadword
	SMPTypeCategory[STARS_NN_vphsubbw] = 14;             // Packed Horizontal Subtract Signed Byte to Signed Word
	SMPTypeCategory[STARS_NN_vphsubdq] = 14;             // Packed Horizontal Subtract Signed Doubleword to Signed Quadword
	SMPTypeCategory[STARS_NN_vphsubwd] = 14;             // Packed Horizontal Subtract Signed Word to Signed Doubleword
	SMPTypeCategory[STARS_NN_vpmacsdd] = 14;             // Packed Multiply Accumulate Signed Doubleword to Signed Doubleword
	SMPTypeCategory[STARS_NN_vpmacsdqh] = 14;            // Packed Multiply Accumulate Signed High Doubleword to Signed Quadword
	SMPTypeCategory[STARS_NN_vpmacsdql] = 14;            // Packed Multiply Accumulate Signed Low Doubleword to Signed Quadword
	SMPTypeCategory[STARS_NN_vpmacssdd] = 14;            // Packed Multiply Accumulate Signed Doubleword to Signed Doubleword with Saturation
	SMPTypeCategory[STARS_NN_vpmacssdqh] = 14;           // Packed Multiply Accumulate Signed High Doubleword to Signed Quadword with Saturation
	SMPTypeCategory[STARS_NN_vpmacssdql] = 14;           // Packed Multiply Accumulate Signed Low Doubleword to Signed Quadword with Saturation
	SMPTypeCategory[STARS_NN_vpmacsswd] = 14;            // Packed Multiply Accumulate Signed Word to Signed Doubleword with Saturation
	SMPTypeCategory[STARS_NN_vpmacssww] = 14;            // Packed Multiply Accumulate Signed Word to Signed Word with Saturation
	SMPTypeCategory[STARS_NN_vpmacswd] = 14;             // Packed Multiply Accumulate Signed Word to Signed Doubleword
	SMPTypeCategory[STARS_NN_vpmacsww] = 14;             // Packed Multiply Accumulate Signed Word to Signed Word
	SMPTypeCategory[STARS_NN_vpmadcsswd] = 14;           // Packed Multiply, Add and Accumulate Signed Word to Signed Doubleword with Saturation
	SMPTypeCategory[STARS_NN_vpmadcswd] = 14;            // Packed Multiply Add and Accumulate Signed Word to Signed Doubleword
	SMPTypeCategory[STARS_NN_vpperm] = 14;               // Packed Permute Bytes
	SMPTypeCategory[STARS_NN_vprotb] = 14;               // Packed Rotate Bytes
	SMPTypeCategory[STARS_NN_vprotd] = 14;               // Packed Rotate Doublewords
	SMPTypeCategory[STARS_NN_vprotq] = 14;               // Packed Rotate Quadwords
	SMPTypeCategory[STARS_NN_vprotw] = 14;               // Packed Rotate Words
	SMPTypeCategory[STARS_NN_vpshab] = 14;               // Packed Shift Arithmetic Bytes
	SMPTypeCategory[STARS_NN_vpshad] = 14;               // Packed Shift Arithmetic Doublewords
	SMPTypeCategory[STARS_NN_vpshaq] = 14;               // Packed Shift Arithmetic Quadwords
	SMPTypeCategory[STARS_NN_vpshaw] = 14;               // Packed Shift Arithmetic Words
	SMPTypeCategory[STARS_NN_vpshlb] = 14;               // Packed Shift Logical Bytes
	SMPTypeCategory[STARS_NN_vpshld] = 14;               // Packed Shift Logical Doublewords
	SMPTypeCategory[STARS_NN_vpshlq] = 14;               // Packed Shift Logical Quadwords
	SMPTypeCategory[STARS_NN_vpshlw] = 14;               // Packed Shift Logical Words

	// AMP XOP comparison pseudo-ops

	SMPTypeCategory[STARS_NN_vpcomltb] = 14;             // Compare Vector Signed Bytes
	SMPTypeCategory[STARS_NN_vpcomleb] = 14;             // Compare Vector Signed Bytes
	SMPTypeCategory[STARS_NN_vpcomgtb] = 14;             // Compare Vector Signed Bytes
	SMPTypeCategory[STARS_NN_vpcomgeb] = 14;             // Compare Vector Signed Bytes
	SMPTypeCategory[STARS_NN_vpcomeqb] = 14;             // Compare Vector Signed Bytes
	SMPTypeCategory[STARS_NN_vpcomneqb] = 14;            // Compare Vector Signed Bytes
	SMPTypeCategory[STARS_NN_vpcomfalseb] = 14;          // Compare Vector Signed Bytes
	SMPTypeCategory[STARS_NN_vpcomtrueb] = 14;           // Compare Vector Signed Bytes

	SMPTypeCategory[STARS_NN_vpcomltw] = 14;             // Compare Vector Signed Words
	SMPTypeCategory[STARS_NN_vpcomlew] = 14;             // Compare Vector Signed Words
	SMPTypeCategory[STARS_NN_vpcomgtw] = 14;             // Compare Vector Signed Words
	SMPTypeCategory[STARS_NN_vpcomgew] = 14;             // Compare Vector Signed Words
	SMPTypeCategory[STARS_NN_vpcomeqw] = 14;             // Compare Vector Signed Words
	SMPTypeCategory[STARS_NN_vpcomneqw] = 14;            // Compare Vector Signed Words
	SMPTypeCategory[STARS_NN_vpcomfalsew] = 14;          // Compare Vector Signed Words
	SMPTypeCategory[STARS_NN_vpcomtruew] = 14;           // Compare Vector Signed Words

	SMPTypeCategory[STARS_NN_vpcomltd] = 14;             // Compare Vector Signed Doublewords
	SMPTypeCategory[STARS_NN_vpcomled] = 14;             // Compare Vector Signed Doublewords
	SMPTypeCategory[STARS_NN_vpcomgtd] = 14;             // Compare Vector Signed Doublewords
	SMPTypeCategory[STARS_NN_vpcomged] = 14;             // Compare Vector Signed Doublewords
	SMPTypeCategory[STARS_NN_vpcomeqd] = 14;             // Compare Vector Signed Doublewords
	SMPTypeCategory[STARS_NN_vpcomneqd] = 14;            // Compare Vector Signed Doublewords
	SMPTypeCategory[STARS_NN_vpcomfalsed] = 14;          // Compare Vector Signed Doublewords
	SMPTypeCategory[STARS_NN_vpcomtrued] = 14;           // Compare Vector Signed Doublewords

	SMPTypeCategory[STARS_NN_vpcomltq] = 14;             // Compare Vector Signed Quadwords
	SMPTypeCategory[STARS_NN_vpcomleq] = 14;             // Compare Vector Signed Quadwords
	SMPTypeCategory[STARS_NN_vpcomgtq] = 14;             // Compare Vector Signed Quadwords
	SMPTypeCategory[STARS_NN_vpcomgeq] = 14;             // Compare Vector Signed Quadwords
	SMPTypeCategory[STARS_NN_vpcomeqq] = 14;             // Compare Vector Signed Quadwords
	SMPTypeCategory[STARS_NN_vpcomneqq] = 14;            // Compare Vector Signed Quadwords
	SMPTypeCategory[STARS_NN_vpcomfalseq] = 14;          // Compare Vector Signed Quadwords
	SMPTypeCategory[STARS_NN_vpcomtrueq] = 14;           // Compare Vector Signed Quadwords

	SMPTypeCategory[STARS_NN_vpcomltub] = 14;            // Compare Vector Unsigned Bytes
	SMPTypeCategory[STARS_NN_vpcomleub] = 14;            // Compare Vector Unsigned Bytes
	SMPTypeCategory[STARS_NN_vpcomgtub] = 14;            // Compare Vector Unsigned Bytes
	SMPTypeCategory[STARS_NN_vpcomgeub] = 14;            // Compare Vector Unsigned Bytes
	SMPTypeCategory[STARS_NN_vpcomequb] = 14;            // Compare Vector Unsigned Bytes
	SMPTypeCategory[STARS_NN_vpcomnequb] = 14;           // Compare Vector Unsigned Bytes
	SMPTypeCategory[STARS_NN_vpcomfalseub] = 14;         // Compare Vector Unsigned Bytes
	SMPTypeCategory[STARS_NN_vpcomtrueub] = 14;          // Compare Vector Unsigned Bytes

	SMPTypeCategory[STARS_NN_vpcomltuw] = 14;            // Compare Vector Unsigned Words
	SMPTypeCategory[STARS_NN_vpcomleuw] = 14;            // Compare Vector Unsigned Words
	SMPTypeCategory[STARS_NN_vpcomgtuw] = 14;            // Compare Vector Unsigned Words
	SMPTypeCategory[STARS_NN_vpcomgeuw] = 14;            // Compare Vector Unsigned Words
	SMPTypeCategory[STARS_NN_vpcomequw] = 14;            // Compare Vector Unsigned Words
	SMPTypeCategory[STARS_NN_vpcomnequw] = 14;           // Compare Vector Unsigned Words
	SMPTypeCategory[STARS_NN_vpcomfalseuw] = 14;         // Compare Vector Unsigned Words
	SMPTypeCategory[STARS_NN_vpcomtrueuw] = 14;          // Compare Vector Unsigned Words

	SMPTypeCategory[STARS_NN_vpcomltud] = 14;            // Compare Vector Unsigned Doublewords
	SMPTypeCategory[STARS_NN_vpcomleud] = 14;            // Compare Vector Unsigned Doublewords
	SMPTypeCategory[STARS_NN_vpcomgtud] = 14;            // Compare Vector Unsigned Doublewords
	SMPTypeCategory[STARS_NN_vpcomgeud] = 14;            // Compare Vector Unsigned Doublewords
	SMPTypeCategory[STARS_NN_vpcomequd] = 14;            // Compare Vector Unsigned Doublewords
	SMPTypeCategory[STARS_NN_vpcomnequd] = 14;           // Compare Vector Unsigned Doublewords
	SMPTypeCategory[STARS_NN_vpcomfalseud] = 14;         // Compare Vector Unsigned Doublewords
	SMPTypeCategory[STARS_NN_vpcomtrueud] = 14;          // Compare Vector Unsigned Doublewords

	SMPTypeCategory[STARS_NN_vpcomltuq] = 14;            // Compare Vector Unsigned Quadwords
	SMPTypeCategory[STARS_NN_vpcomleuq] = 14;            // Compare Vector Unsigned Quadwords
	SMPTypeCategory[STARS_NN_vpcomgtuq] = 14;            // Compare Vector Unsigned Quadwords
	SMPTypeCategory[STARS_NN_vpcomgeuq] = 14;            // Compare Vector Unsigned Quadwords
	SMPTypeCategory[STARS_NN_vpcomequq] = 14;            // Compare Vector Unsigned Quadwords
	SMPTypeCategory[STARS_NN_vpcomnequq] = 14;           // Compare Vector Unsigned Quadwords
	SMPTypeCategory[STARS_NN_vpcomfalseuq] = 14;         // Compare Vector Unsigned Quadwords
	SMPTypeCategory[STARS_NN_vpcomtrueuq] = 14;          // Compare Vector Unsigned Quadwords

	// AMD Excavator

	SMPTypeCategory[STARS_NN_monitorx] = 1;             // Setup Monitor Address
	SMPTypeCategory[STARS_NN_mwaitx] = 1;               // Monitor Wait with Timeout

	// AMD Zen

	SMPTypeCategory[STARS_NN_clzero] = 16;               // Zero out 64 byte cache

	// Intel Processor Trace

	SMPTypeCategory[STARS_NN_ptwrite] = 16;              // Write Data to a Processor Trace Packet

	// new Intel AVX-512 instructions (December 2016)

	SMPTypeCategory[STARS_NN_v4fmaddps] = 14;            // Packed Single-Precision Floating-Point Fused Multiply-Add (4-iterations)
	SMPTypeCategory[STARS_NN_v4fnmaddps] = 14;           // Packed Single-Precision Floating-Point Fused Multiply-Add (4-iterations)
	SMPTypeCategory[STARS_NN_v4fmaddss] = 14;            // Scalar Single-Precision Floating-Point Fused Multiply-Add (4-iterations)
	SMPTypeCategory[STARS_NN_v4fnmaddss] = 14;           // Scalar Single-Precision Floating-Point Fused Multiply-Add (4-iterations)
	SMPTypeCategory[STARS_NN_vp4dpwssd] = 14;            // Dot Product of Signed Words with Dword Accumulation (4-iterations)
	SMPTypeCategory[STARS_NN_vp4dpwssds] = 14;           // Dot Product of Signed Words with Dword Accumulation and Saturation (4-iterations)
	SMPTypeCategory[STARS_NN_vpopcntd] = 14;             // Return the Count of Number of Bits Set to 1 in DWORD
	SMPTypeCategory[STARS_NN_vpopcntq] = 14;             // Return the Count of Number of Bits Set to 1 in QWORD

	// Read Processor ID

	SMPTypeCategory[STARS_NN_rdpid] = 2;                // Read Processor ID

	// Invoke VM function

	SMPTypeCategory[STARS_NN_vmfunc] = 1;               // Invoke VM function

	// Control-flow Enforcement

	SMPTypeCategory[STARS_NN_incsspd] = 14;              // Increment Shadow Stack Pointer (by 4)
	SMPTypeCategory[STARS_NN_incsspq] = 14;              // Increment Shadow Stack Pointer (by 8)
	SMPTypeCategory[STARS_NN_rdsspd] = 6;               // Read (low 32 bits of) Shadow Stack Pointer
	SMPTypeCategory[STARS_NN_rdsspq] = 6;               // Read Shadow Stack Pointer
	SMPTypeCategory[STARS_NN_saveprevssp] = 16;          // Save Previous Shadow Stack Pointer
	SMPTypeCategory[STARS_NN_rstorssp] = 16;             // Restore saved Shadow Stack Pointer
	SMPTypeCategory[STARS_NN_wrssd] = 16;                // Write (4 bytes) to shadow stack
	SMPTypeCategory[STARS_NN_wrssq] = 16;                // Write (8 bytes) to shadow stack
	SMPTypeCategory[STARS_NN_wrussd] = 16;               // Write (4 bytes) to User Shadow Stack
	SMPTypeCategory[STARS_NN_wrussq] = 16;               // Write (8 bytes) to User Shadow Stack
	SMPTypeCategory[STARS_NN_setssbsy] = 1;             // Mark Shadow Stack Busy
	SMPTypeCategory[STARS_NN_clrssbsy] = 1;             // Clear Shadow Stack Busy Flag
	SMPTypeCategory[STARS_NN_endbr64] = 1;              // Terminate an Indirect Branch in 64-bit Mode
	SMPTypeCategory[STARS_NN_endbr32] = 1;              // Terminate an Indirect Branch in 32-bit and Compatibility Mode

	// Undefined Instruction

	SMPTypeCategory[STARS_NN_ud0] = 1;                 // Undefined Instruction
	SMPTypeCategory[STARS_NN_ud1] = 1;                 // Undefined Instruction

	// Enqueue Stores

	SMPTypeCategory[STARS_NN_enqcmd] = 1;              // Enqueue Command
	SMPTypeCategory[STARS_NN_enqcmds] = 1;             // Enqueue Command Supervisor

	// AMD Zen2

	SMPTypeCategory[STARS_NN_mcommit] = 1;             // Commit Stores to Memory
	SMPTypeCategory[STARS_NN_rdpru] = 8;               // Read Processor Register

	// Intel Tremont instructions

	SMPTypeCategory[STARS_NN_cldemote] = 16;            // Cache Line Demote
	SMPTypeCategory[STARS_NN_enclv] = 1;               // Execute an Enclave VMM Function of Specified Leaf Number

	// Direct Stores

	SMPTypeCategory[STARS_NN_movdiri] = 14;             // Move Doubleword as Direct Store
	SMPTypeCategory[STARS_NN_movdir64b] = 14;           // Move 64 Bytes as Direct Store

	// Intel WAITPKG instructions

	SMPTypeCategory[STARS_NN_tpause] = 14;              // Timed PAUSE
	SMPTypeCategory[STARS_NN_umonitor] = 16;            // User Level Set Up Monitor Address
	SMPTypeCategory[STARS_NN_umwait] = 14;              // User Level Monitor Wait

	// Intel Sapphire Rapids instructions

	SMPTypeCategory[STARS_NN_serialize] = 1;           // Serialize Instruction Execution

	// Intel TSX

	SMPTypeCategory[STARS_NN_xresldtrk] = 1;           // Resume Tracking Load Addresses
	SMPTypeCategory[STARS_NN_xsusldtrk] = 1;           // Suspend Tracking Load Addresses

	// Intel Affine Transformation instructions

	SMPTypeCategory[STARS_NN_gf2p8mulb] = 14;           // Galois Field Multiply Bytes
	SMPTypeCategory[STARS_NN_gf2p8affineqb] = 14;       // Computes Affine Transformation
	SMPTypeCategory[STARS_NN_gf2p8affineinvqb] = 14;    // Computes Inverse Affine Transformation

	// VEX versions
	SMPTypeCategory[STARS_NN_vgf2p8mulb] = 14;          // Galois Field Multiply Bytes
	SMPTypeCategory[STARS_NN_vgf2p8affineqb] = 14;      // Computes Affine Transformation
	SMPTypeCategory[STARS_NN_vgf2p8affineinvqb] = 14;   // Computes Inverse Affine Transformation

	// Intrinsics for Saving and Restoring the Extended Processor States (64-bits)

	SMPTypeCategory[STARS_NN_fxsave64] = 1;            // Fast save FP context (64-bits)
	SMPTypeCategory[STARS_NN_fxrstor64] = 1;           // Fast restore FP context (64-bits)

	SMPTypeCategory[STARS_NN_last] = 1;

	return;

} // end of STARS_Program_t::InitTypeCategory()