--- a/src/in_2sf/desmume/arm_jit.h +++ b/src/in_2sf/desmume/arm_jit.h @@ -28,7 +28,7 @@ void arm_jit_sync(); template<int PROCNUM> uint32_t arm_jit_compile(); -#ifdef _WINDOWS +#if defined(_WINDOWS) || defined(DESMUME_COCOA) # define MAPPED_JIT_FUNCS #endif
--- a/src/in_2sf/desmume/utils/AsmJit/x86/x86compileritem.cpp +++ b/src/in_2sf/desmume/utils/AsmJit/x86/x86compileritem.cpp @@ -19,14 +19,14 @@ // [Api-Begin] #include "../core/apibegin.h" -namespace AsmJit { +namespace AsmJit +{ // ============================================================================ // [AsmJit::X86CompilerAlign - Construction / Destruction] // ============================================================================ -X86CompilerAlign::X86CompilerAlign(X86Compiler* x86Compiler, uint32_t size) : - CompilerAlign(x86Compiler, size) +X86CompilerAlign::X86CompilerAlign(X86Compiler *x86Compiler, uint32_t size) : CompilerAlign(x86Compiler, size) { } @@ -38,19 +38,18 @@ // [AsmJit::X86CompilerAlign - Interface] // ============================================================================ -void X86CompilerAlign::emit(Assembler& a) -{ - X86Assembler& x86Asm = static_cast<X86Assembler&>(a); - - x86Asm.align(_size); +void X86CompilerAlign::emit(Assembler &a) +{ + X86Assembler &x86Asm = static_cast<X86Assembler &>(a); + + x86Asm.align(_size); } // ============================================================================ // [AsmJit::X86CompilerTarget - Construction / Destruction] // ============================================================================ -X86CompilerTarget::X86CompilerTarget(X86Compiler* c, const Label& label) : - CompilerTarget(c, label) +X86CompilerTarget::X86CompilerTarget(X86Compiler *c, const Label &label) : CompilerTarget(c, label) { } @@ -62,92 +61,89 @@ // [AsmJit::X86CompilerTarget - Interface] // ============================================================================ -static X86CompilerTarget* X86CompilerTarget_removeUnreachableItems(X86CompilerTarget* target) -{ - CompilerItem* prev = target->getPrev(); - CompilerItem* item = target->getNext(); - - ASMJIT_ASSERT(!!prev); - ASMJIT_ASSERT(!!item); - - for (;;) - { - CompilerItem* next = item->getNext(); - ASMJIT_ASSERT(!!next); - - if (item->getType() == kCompilerItemTarget) - break; - - item->_prev = nullptr; - item->_next = nullptr; - item->_isUnreachable = true; - - item = next; - } - - target->_prev = nullptr; - target->_next = nullptr; - target->_isTranslated = true; - - prev->_next = item; - item->_prev = prev; - - return static_cast<X86CompilerTarget*>(item); -} - -void X86CompilerTarget::prepare(CompilerContext& cc) -{ - X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc); - _offset = x86Context._currentOffset++; -} - -CompilerItem* X86CompilerTarget::translate(CompilerContext& cc) -{ - X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc); - - // If this X86CompilerTarget was already translated, it's needed to change - // the current state and return NULL to tell CompilerContext to process next - // untranslated item. - if (_isTranslated) - { - x86Context._restoreState(getState()); - return nullptr; - } - - if (x86Context._isUnreachable) - { - // If the context has "isUnreachable" flag set and there is no state then - // it means that this code will be never called. This is a problem, because - // we are unable to assign a state to current location so we can't allocate - // registers for variables used inside. So instead of doing anything wrong - // we remove the unreachable code. - if (!_state) - return X86CompilerTarget_removeUnreachableItems(this); - - // Assign state to the compiler context. - x86Context._isUnreachable = 0; - x86Context._assignState(getState()); - } - else - { - _state = x86Context._saveState(); - } - - return translated(); -} - -void X86CompilerTarget::emit(Assembler& a) -{ - X86Assembler& x86Asm = static_cast<X86Assembler&>(a); - x86Asm.bind(_label); +static X86CompilerTarget *X86CompilerTarget_removeUnreachableItems(X86CompilerTarget *target) +{ + CompilerItem *prev = target->getPrev(); + CompilerItem *item = target->getNext(); + + ASMJIT_ASSERT(prev); + ASMJIT_ASSERT(item); + + for (;;) + { + CompilerItem *next = item->getNext(); + ASMJIT_ASSERT(next); + + if (item->getType() == kCompilerItemTarget) + break; + + item->_prev = nullptr; + item->_next = nullptr; + item->_isUnreachable = true; + + item = next; + } + + target->_prev = nullptr; + target->_next = nullptr; + target->_isTranslated = true; + + prev->_next = item; + item->_prev = prev; + + return static_cast<X86CompilerTarget *>(item); +} + +void X86CompilerTarget::prepare(CompilerContext &cc) +{ + X86CompilerContext &x86Context = static_cast<X86CompilerContext &>(cc); + this->_offset = x86Context._currentOffset++; +} + +CompilerItem *X86CompilerTarget::translate(CompilerContext &cc) +{ + X86CompilerContext &x86Context = static_cast<X86CompilerContext &>(cc); + + // If this X86CompilerTarget was already translated, it's needed to change + // the current state and return NULL to tell CompilerContext to process next + // untranslated item. + if (this->_isTranslated) + { + x86Context._restoreState(this->getState()); + return nullptr; + } + + if (x86Context._isUnreachable) + { + // If the context has "isUnreachable" flag set and there is no state then + // it means that this code will be never called. This is a problem, because + // we are unable to assign a state to current location so we can't allocate + // registers for variables used inside. So instead of doing anything wrong + // we remove the unreachable code. + if (!this->_state) + return X86CompilerTarget_removeUnreachableItems(this); + + // Assign state to the compiler context. + x86Context._isUnreachable = 0; + x86Context._assignState(this->getState()); + } + else + this->_state = x86Context._saveState(); + + return this->translated(); +} + +void X86CompilerTarget::emit(Assembler &a) +{ + X86Assembler &x86Asm = static_cast<X86Assembler &>(a); + x86Asm.bind(this->_label); } // ============================================================================ // [AsmJit::X86CompilerHint - Construction / Destruction] // ============================================================================ -X86CompilerHint::X86CompilerHint(X86Compiler* compiler, X86CompilerVar* var, uint32_t hintId, uint32_t hintValue) : - CompilerHint(compiler, var, hintId, hintValue) +X86CompilerHint::X86CompilerHint(X86Compiler *compiler, X86CompilerVar *var, uint32_t hintId, uint32_t hintValue) : CompilerHint(compiler, var, hintId, hintValue) { } @@ -159,79 +155,78 @@ // [AsmJit::X86CompilerHint - Interface] // ============================================================================ -void X86CompilerHint::prepare(CompilerContext& cc) -{ - X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc); - X86CompilerVar* var = getVar(); - - _offset = x86Context._currentOffset; - - // First item (begin of variable scope). - if (!var->firstItem) - var->firstItem = this; - - // Last item (end of variable scope). - CompilerItem* oldLast = var->lastItem; - var->lastItem = this; - - switch (_hintId) - { - case kVarHintAlloc: - case kVarHintSpill: - case kVarHintSave: - if (!x86Context._isActive(var)) - x86Context._addActive(var); - break; - - case kVarHintSaveAndUnuse: - if (!x86Context._isActive(var)) - x86Context._addActive(var); - break; - - case kVarHintUnuse: - if (oldLast) - oldLast->_tryUnuseVar(var); - break; - } -} - -CompilerItem* X86CompilerHint::translate(CompilerContext& cc) -{ - X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc); - X86CompilerVar* var = getVar(); - - switch (_hintId) - { - case kVarHintAlloc: - x86Context.allocVar(var, _hintValue, kVarAllocRead); - break; - - case kVarHintSpill: - if (var->state == kVarStateReg) - x86Context.spillVar(var); - break; - - case kVarHintSave: - case kVarHintSaveAndUnuse: - if (var->state == kVarStateReg && var->changed) - { - x86Context.emitSaveVar(var, var->regIndex); - var->changed = false; - } - if (_hintId == kVarHintSaveAndUnuse) - goto _Unuse; - break; - - case kVarHintUnuse: -_Unuse: - x86Context.unuseVar(var, kVarStateUnused); - goto _End; - } - - x86Context._unuseVarOnEndOfScope(this, var); +void X86CompilerHint::prepare(CompilerContext &cc) +{ + X86CompilerContext &x86Context = static_cast<X86CompilerContext &>(cc); + X86CompilerVar *var = this->getVar(); + + this->_offset = x86Context._currentOffset; + + // First item (begin of variable scope). + if (!var->firstItem) + var->firstItem = this; + + // Last item (end of variable scope). + CompilerItem *oldLast = var->lastItem; + var->lastItem = this; + + switch (this->_hintId) + { + case kVarHintAlloc: + case kVarHintSpill: + case kVarHintSave: + if (!x86Context._isActive(var)) + x86Context._addActive(var); + break; + + case kVarHintSaveAndUnuse: + if (!x86Context._isActive(var)) + x86Context._addActive(var); + break; + + case kVarHintUnuse: + if (oldLast) + oldLast->_tryUnuseVar(var); + } +} + +CompilerItem *X86CompilerHint::translate(CompilerContext &cc) +{ + X86CompilerContext &x86Context = static_cast<X86CompilerContext &>(cc); + X86CompilerVar *var = this->getVar(); + + switch (this->_hintId) + { + case kVarHintAlloc: + x86Context.allocVar(var, this->_hintValue, kVarAllocRead); + break; + + case kVarHintSpill: + if (var->state == kVarStateReg) + x86Context.spillVar(var); + break; + + case kVarHintSave: + case kVarHintSaveAndUnuse: + if (var->state == kVarStateReg && var->changed) + { + x86Context.emitSaveVar(var, var->regIndex); + var->changed = false; + } + if (this->_hintId == kVarHintSaveAndUnuse) + goto _Unuse; + break; + + case kVarHintUnuse: + _Unuse: + x86Context.unuseVar(var, kVarStateUnused); + goto _End; + } + + x86Context._unuseVarOnEndOfScope(this, var); _End: - return translated(); + return this->translated(); } // ============================================================================ @@ -240,197 +235,193 @@ int X86CompilerHint::getMaxSize() const { - // Compiler hint is NOP, but it can generate other items which can do - // something - in such more items are added into the stream so we don't need - // to worry about this. - return 0; + // Compiler hint is NOP, but it can generate other items which can do + // something - in such more items are added into the stream so we don't need + // to worry about this. + return 0; } // ============================================================================ // [AsmJit::X86CompilerInst - Construction / Destruction] // ============================================================================ -X86CompilerInst::X86CompilerInst(X86Compiler* x86Compiler, uint32_t code, Operand* opData, uint32_t opCount) : - CompilerInst(x86Compiler, code, opData, opCount) -{ - uint32_t i; - - _memOp = nullptr; - _vars = nullptr; - _variablesCount = 0; - - for (i = 0; i < opCount; i++) - { - if (_operands[i].isMem()) - { - _memOp = reinterpret_cast<Mem*>(&_operands[i]); - break; - } - } - - const X86InstInfo* info = &x86InstInfo[_code]; - - if (info->isSpecial()) - setInstFlag(kX86CompilerInstFlagIsSpecial); - if (info->isFpu()) - setInstFlag(kX86CompilerInstFlagIsFpu); - - if (isSpecial()) - { - // ${SPECIAL_INSTRUCTION_HANDLING_BEGIN} - switch (_code) - { - case kX86InstCpuId: - // Special... - break; - - case kX86InstCbw: - case kX86InstCdq: - case kX86InstCdqe: - case kX86InstCwd: - case kX86InstCwde: - case kX86InstCqo: - // Special... - break; - - case kX86InstCmpXCHG: - case kX86InstCmpXCHG8B: -#if defined(ASMJIT_X64) - case kX86InstCmpXCHG16B: +X86CompilerInst::X86CompilerInst(X86Compiler *x86Compiler, uint32_t code, Operand *opData, uint32_t opCount) : CompilerInst(x86Compiler, code, opData, opCount) +{ + this->_memOp = nullptr; + this->_vars = nullptr; + this->_variablesCount = 0; + + for (uint32_t i = 0; i < opCount; ++i) + { + if (this->_operands[i].isMem()) + { + this->_memOp = reinterpret_cast<Mem *>(&this->_operands[i]); + break; + } + } + + const X86InstInfo *info = &x86InstInfo[this->_code]; + + if (info->isSpecial()) + this->setInstFlag(kX86CompilerInstFlagIsSpecial); + if (info->isFpu()) + this->setInstFlag(kX86CompilerInstFlagIsFpu); + + if (this->isSpecial()) + { + // ${SPECIAL_INSTRUCTION_HANDLING_BEGIN} + switch (this->_code) + { + case kX86InstCpuId: + // Special... + break; + + case kX86InstCbw: + case kX86InstCdq: + case kX86InstCdqe: + case kX86InstCwd: + case kX86InstCwde: + case kX86InstCqo: + // Special... + break; + + case kX86InstCmpXCHG: + case kX86InstCmpXCHG8B: +#ifdef ASMJIT_X64 + case kX86InstCmpXCHG16B: #endif // ASMJIT_X64 - // Special... - break; - -#if defined(ASMJIT_X86) - case kX86InstDaa: - case kX86InstDas: - // Special... - break; + // Special... + break; + +#ifdef ASMJIT_X86 + case kX86InstDaa: + case kX86InstDas: + // Special... + break; #endif // ASMJIT_X86 - case kX86InstIMul: - switch (_operandsCount) - { - case 2: - // IMUL dst, src is not special instruction. - clearInstFlag(kX86CompilerInstFlagIsSpecial); - break; - case 3: - // Only IMUL dst_hi, dst_lo, reg/mem is special, all others don't. - if (!(_operands[0].isVar() && _operands[1].isVar() && _operands[2].isVarMem())) - clearInstFlag(kX86CompilerInstFlagIsSpecial); - break; - } - break; - case kX86InstMul: - case kX86InstIDiv: - case kX86InstDiv: - // Special... - break; - - case kX86InstMovPtr: - // Special... - break; - - case kX86InstLahf: - case kX86InstSahf: - // Special... - break; - - case kX86InstMaskMovQ: - case kX86InstMaskMovDQU: - // Special... - break; - - case kX86InstEnter: - case kX86InstLeave: - // Special... - break; - - case kX86InstRet: - // Special... - break; - - case kX86InstMonitor: - case kX86InstMWait: - // Special... - break; - - case kX86InstPop: - case kX86InstPopAD: - case kX86InstPopFD: - case kX86InstPopFQ: - // Special... - break; - - case kX86InstPush: - case kX86InstPushAD: - case kX86InstPushFD: - case kX86InstPushFQ: - // Special... - break; - - case kX86InstRcl: - case kX86InstRcr: - case kX86InstRol: - case kX86InstRor: - case kX86InstSal: - case kX86InstSar: - case kX86InstShl: - case kX86InstShr: - // Rot instruction is special only if last operand is variable (register). - if (!_operands[1].isVar()) - clearInstFlag(kX86CompilerInstFlagIsSpecial); - break; - - case kX86InstShld: - case kX86InstShrd: - // Shld/Shrd instruction is special only if last operand is variable (register). - if (!_operands[2].isVar()) - clearInstFlag(kX86CompilerInstFlagIsSpecial); - break; - - case kX86InstRdtsc: - case kX86InstRdtscP: - // Special... - break; - - case kX86InstRepLodSB: - case kX86InstRepLodSD: - case kX86InstRepLodSQ: - case kX86InstRepLodSW: - case kX86InstRepMovSB: - case kX86InstRepMovSD: - case kX86InstRepMovSQ: - case kX86InstRepMovSW: - case kX86InstRepStoSB: - case kX86InstRepStoSD: - case kX86InstRepStoSQ: - case kX86InstRepStoSW: - case kX86InstRepECmpSB: - case kX86InstRepECmpSD: - case kX86InstRepECmpSQ: - case kX86InstRepECmpSW: - case kX86InstRepEScaSB: - case kX86InstRepEScaSD: - case kX86InstRepEScaSQ: - case kX86InstRepEScaSW: - case kX86InstRepNECmpSB: - case kX86InstRepNECmpSD: - case kX86InstRepNECmpSQ: - case kX86InstRepNECmpSW: - case kX86InstRepNEScaSB: - case kX86InstRepNEScaSD: - case kX86InstRepNEScaSQ: - case kX86InstRepNEScaSW: - // Special... - break; - - default: - ASMJIT_ASSERT(0); - } - // ${SPECIAL_INSTRUCTION_HANDLING_END} - } + case kX86InstIMul: + switch (this->_operandsCount) + { + case 2: + // IMUL dst, src is not special instruction. + this->clearInstFlag(kX86CompilerInstFlagIsSpecial); + break; + case 3: + // Only IMUL dst_hi, dst_lo, reg/mem is special, all others don't. + if (!(this->_operands[0].isVar() && this->_operands[1].isVar() && this->_operands[2].isVarMem())) + this->clearInstFlag(kX86CompilerInstFlagIsSpecial); + } + break; + case kX86InstMul: + case kX86InstIDiv: + case kX86InstDiv: + // Special... + break; + + case kX86InstMovPtr: + // Special... + break; + + case kX86InstLahf: + case kX86InstSahf: + // Special... + break; + + case kX86InstMaskMovQ: + case kX86InstMaskMovDQU: + // Special... + break; + + case kX86InstEnter: + case kX86InstLeave: + // Special... + break; + + case kX86InstRet: + // Special... + break; + + case kX86InstMonitor: + case kX86InstMWait: + // Special... + break; + + case kX86InstPop: + case kX86InstPopAD: + case kX86InstPopFD: + case kX86InstPopFQ: + // Special... + break; + + case kX86InstPush: + case kX86InstPushAD: + case kX86InstPushFD: + case kX86InstPushFQ: + // Special... + break; + + case kX86InstRcl: + case kX86InstRcr: + case kX86InstRol: + case kX86InstRor: + case kX86InstSal: + case kX86InstSar: + case kX86InstShl: + case kX86InstShr: + // Rot instruction is special only if last operand is variable (register). + if (!this->_operands[1].isVar()) + this->clearInstFlag(kX86CompilerInstFlagIsSpecial); + break; + + case kX86InstShld: + case kX86InstShrd: + // Shld/Shrd instruction is special only if last operand is variable (register). + if (!this->_operands[2].isVar()) + this->clearInstFlag(kX86CompilerInstFlagIsSpecial); + break; + + case kX86InstRdtsc: + case kX86InstRdtscP: + // Special... + break; + + case kX86InstRepLodSB: + case kX86InstRepLodSD: + case kX86InstRepLodSQ: + case kX86InstRepLodSW: + case kX86InstRepMovSB: + case kX86InstRepMovSD: + case kX86InstRepMovSQ: + case kX86InstRepMovSW: + case kX86InstRepStoSB: + case kX86InstRepStoSD: + case kX86InstRepStoSQ: + case kX86InstRepStoSW: + case kX86InstRepECmpSB: + case kX86InstRepECmpSD: + case kX86InstRepECmpSQ: + case kX86InstRepECmpSW: + case kX86InstRepEScaSB: + case kX86InstRepEScaSD: + case kX86InstRepEScaSQ: + case kX86InstRepEScaSW: + case kX86InstRepNECmpSB: + case kX86InstRepNECmpSD: + case kX86InstRepNECmpSQ: + case kX86InstRepNECmpSW: + case kX86InstRepNEScaSB: + case kX86InstRepNEScaSD: + case kX86InstRepNEScaSQ: + case kX86InstRepNEScaSW: + // Special... + break; + + default: + ASMJIT_ASSERT(0); + } + // ${SPECIAL_INSTRUCTION_HANDLING_END} + } } X86CompilerInst::~X86CompilerInst() @@ -441,1139 +432,1112 @@ // [AsmJit::X86CompilerInst - Interface] // ============================================================================ -void X86CompilerInst::prepare(CompilerContext& cc) -{ - X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc); - X86Compiler* x86Compiler = getCompiler(); +void X86CompilerInst::prepare(CompilerContext &cc) +{ + X86CompilerContext &x86Context = static_cast<X86CompilerContext &>(cc); + X86Compiler *x86Compiler = this->getCompiler(); #define __GET_VARIABLE(__vardata__) \ - { \ - X86CompilerVar* _candidate = __vardata__; \ - \ - for (var = cur; ;) \ - { \ - if (var == _vars) \ - { \ - var = cur++; \ - var->vdata = _candidate; \ - var->vflags = 0; \ - var->regMask = 0xFFFFFFFF; \ - break; \ - } \ - \ - var--; \ - \ - if (var->vdata == _candidate) \ - { \ - break; \ - } \ - } \ - \ - ASMJIT_ASSERT(!!var); \ - } - - _offset = x86Context._currentOffset; - - const X86InstInfo* id = &x86InstInfo[_code]; - - uint32_t i, len = _operandsCount; - uint32_t variablesCount = 0; - - for (i = 0; i < len; i++) - { - Operand& o = _operands[i]; - - if (o.isVar()) - { - ASMJIT_ASSERT(o.getId() != kInvalidValue); - X86CompilerVar* vdata = x86Compiler->_getVar(o.getId()); - ASMJIT_ASSERT(!!vdata); - - if (reinterpret_cast<Var*>(&o)->isGpVar()) - { - if (reinterpret_cast<GpVar*>(&o)->isGpbLo()) { setInstFlag(kX86CompilerInstFlagIsGpbLoUsed); vdata->regGpbLoCount++; }; - if (reinterpret_cast<GpVar*>(&o)->isGpbHi()) { setInstFlag(kX86CompilerInstFlagIsGpbHiUsed); vdata->regGpbHiCount++; }; - } - - if (vdata->workOffset != _offset) - { - if (!x86Context._isActive(vdata)) x86Context._addActive(vdata); - - vdata->workOffset = _offset; - variablesCount++; - } - } - else if (o.isMem()) - { - if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar) - { - X86CompilerVar* vdata = x86Compiler->_getVar(o.getId()); - ASMJIT_ASSERT(!!vdata); - - x86Context._markMemoryUsed(vdata); - - if (vdata->workOffset != _offset) - { - if (!x86Context._isActive(vdata)) x86Context._addActive(vdata); - - vdata->workOffset = _offset; - variablesCount++; - } - } - else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar) - { - X86CompilerVar* vdata = x86Compiler->_getVar(o._mem.base); - ASMJIT_ASSERT(!!vdata); - - if (vdata->workOffset != _offset) - { - if (!x86Context._isActive(vdata)) x86Context._addActive(vdata); - - vdata->workOffset = _offset; - variablesCount++; - } - } - - if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar) - { - X86CompilerVar* vdata = x86Compiler->_getVar(o._mem.index); - ASMJIT_ASSERT(!!vdata); - - if (vdata->workOffset != _offset) - { - if (!x86Context._isActive(vdata)) x86Context._addActive(vdata); - - vdata->workOffset = _offset; - variablesCount++; - } - } - } - } - - if (!variablesCount) - { - x86Context._currentOffset++; - return; - } - - _vars = reinterpret_cast<VarAllocRecord*>(x86Compiler->getZoneMemory().alloc(sizeof(VarAllocRecord) * variablesCount)); - if (!_vars) - { - x86Compiler->setError(kErrorNoHeapMemory); - x86Context._currentOffset++; - return; - } - - _variablesCount = variablesCount; - - VarAllocRecord* cur = _vars; - VarAllocRecord* var = nullptr; - - bool _isGpbUsed = hasInstFlag(kX86CompilerInstFlagIsGpbLoUsed) | - hasInstFlag(kX86CompilerInstFlagIsGpbHiUsed) ; - uint32_t gpRestrictMask = IntUtil::maskUpToIndex(kX86RegNumGp); - -#if defined(ASMJIT_X64) - if (hasInstFlag(kX86CompilerInstFlagIsGpbHiUsed)) - { - gpRestrictMask &= IntUtil::maskFromIndex(kX86RegIndexEax) | - IntUtil::maskFromIndex(kX86RegIndexEbx) | - IntUtil::maskFromIndex(kX86RegIndexEcx) | - IntUtil::maskFromIndex(kX86RegIndexEdx) | - IntUtil::maskFromIndex(kX86RegIndexEbp) | - IntUtil::maskFromIndex(kX86RegIndexEsi) | - IntUtil::maskFromIndex(kX86RegIndexEdi) ; - } +{ \ + X86CompilerVar *_candidate = __vardata__; \ +\ + for (var = cur; ; ) \ + { \ + if (var == this->_vars) \ + { \ + var = cur++; \ + var->vdata = _candidate; \ + var->vflags = 0; \ + var->regMask = 0xFFFFFFFF; \ + break; \ + } \ +\ + --var; \ +\ + if (var->vdata == _candidate) \ + break; \ + } \ +\ + ASMJIT_ASSERT(var); \ +} + + this->_offset = x86Context._currentOffset; + + const X86InstInfo *id = &x86InstInfo[this->_code]; + + uint32_t i, len = _operandsCount; + uint32_t variablesCount = 0; + + for (i = 0; i < len; ++i) + { + Operand &o = this->_operands[i]; + + if (o.isVar()) + { + ASMJIT_ASSERT(o.getId() != kInvalidValue); + X86CompilerVar *vdata = x86Compiler->_getVar(o.getId()); + ASMJIT_ASSERT(vdata); + + if (reinterpret_cast<Var *>(&o)->isGpVar()) + { + if (reinterpret_cast<GpVar *>(&o)->isGpbLo()) + { + this->setInstFlag(kX86CompilerInstFlagIsGpbLoUsed); + ++vdata->regGpbLoCount; + } + if (reinterpret_cast<GpVar *>(&o)->isGpbHi()) + { + this->setInstFlag(kX86CompilerInstFlagIsGpbHiUsed); + ++vdata->regGpbHiCount; + } + } + + if (vdata->workOffset != this->_offset) + { + if (!x86Context._isActive(vdata)) + x86Context._addActive(vdata); + + vdata->workOffset = this->_offset; + ++variablesCount; + } + } + else if (o.isMem()) + { + if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar) + { + X86CompilerVar *vdata = x86Compiler->_getVar(o.getId()); + ASMJIT_ASSERT(vdata); + + x86Context._markMemoryUsed(vdata); + + if (vdata->workOffset != this->_offset) + { + if (!x86Context._isActive(vdata)) + x86Context._addActive(vdata); + + vdata->workOffset = this->_offset; + ++variablesCount; + } + } + else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar) + { + X86CompilerVar *vdata = x86Compiler->_getVar(o._mem.base); + ASMJIT_ASSERT(vdata); + + if (vdata->workOffset != this->_offset) + { + if (!x86Context._isActive(vdata)) + x86Context._addActive(vdata); + + vdata->workOffset = this->_offset; + ++variablesCount; + } + } + + if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar) + { + X86CompilerVar *vdata = x86Compiler->_getVar(o._mem.index); + ASMJIT_ASSERT(vdata); + + if (vdata->workOffset != this->_offset) + { + if (!x86Context._isActive(vdata)) + x86Context._addActive(vdata); + + vdata->workOffset = this->_offset; + ++variablesCount; + } + } + } + } + + if (!variablesCount) + { + ++x86Context._currentOffset; + return; + } + + this->_vars = reinterpret_cast<VarAllocRecord *>(x86Compiler->getZoneMemory().alloc(sizeof(VarAllocRecord) * variablesCount)); + if (!this->_vars) + { + x86Compiler->setError(kErrorNoHeapMemory); + ++x86Context._currentOffset; + return; + } + + this->_variablesCount = variablesCount; + + VarAllocRecord *cur = this->_vars; + VarAllocRecord *var = nullptr; + + bool _isGpbUsed = hasInstFlag(kX86CompilerInstFlagIsGpbLoUsed) | hasInstFlag(kX86CompilerInstFlagIsGpbHiUsed); + uint32_t gpRestrictMask = IntUtil::maskUpToIndex(kX86RegNumGp); + +#ifdef ASMJIT_X64 + if (hasInstFlag(kX86CompilerInstFlagIsGpbHiUsed)) + gpRestrictMask &= IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEbx) | IntUtil::maskFromIndex(kX86RegIndexEcx) | IntUtil::maskFromIndex(kX86RegIndexEdx) | + IntUtil::maskFromIndex(kX86RegIndexEbp) | IntUtil::maskFromIndex(kX86RegIndexEsi) | IntUtil::maskFromIndex(kX86RegIndexEdi); #endif // ASMJIT_X64 - for (i = 0; i < len; i++) - { - Operand& o = _operands[i]; - - if (o.isVar()) - { - X86CompilerVar* vdata = x86Compiler->_getVar(o.getId()); - ASMJIT_ASSERT(!!vdata); - - __GET_VARIABLE(vdata) - var->vflags |= kVarAllocRegister; - - if (_isGpbUsed) - { -#if defined(ASMJIT_X86) - if (reinterpret_cast<GpVar*>(&o)->isGpb()) - { - var->regMask &= IntUtil::maskFromIndex(kX86RegIndexEax) | - IntUtil::maskFromIndex(kX86RegIndexEbx) | - IntUtil::maskFromIndex(kX86RegIndexEcx) | - IntUtil::maskFromIndex(kX86RegIndexEdx) ; - } + for (i = 0; i < len; ++i) + { + Operand &o = this->_operands[i]; + + if (o.isVar()) + { + X86CompilerVar *vdata = x86Compiler->_getVar(o.getId()); + ASMJIT_ASSERT(vdata); + + __GET_VARIABLE(vdata) + var->vflags |= kVarAllocRegister; + + if (_isGpbUsed) + { +#ifdef ASMJIT_X86 + if (reinterpret_cast<GpVar *>(&o)->isGpb()) + var->regMask &= IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEbx) | IntUtil::maskFromIndex(kX86RegIndexEcx) | IntUtil::maskFromIndex(kX86RegIndexEdx); #else - // Restrict all BYTE registers to RAX/RBX/RCX/RDX if HI BYTE register - // is used (REX prefix makes HI BYTE addressing unencodable). - if (hasInstFlag(kX86CompilerInstFlagIsGpbHiUsed)) - { - if (reinterpret_cast<GpVar*>(&o)->isGpb()) - { - var->regMask &= IntUtil::maskFromIndex(kX86RegIndexEax) | - IntUtil::maskFromIndex(kX86RegIndexEbx) | - IntUtil::maskFromIndex(kX86RegIndexEcx) | - IntUtil::maskFromIndex(kX86RegIndexEdx) ; - } - } + // Restrict all BYTE registers to RAX/RBX/RCX/RDX if HI BYTE register + // is used (REX prefix makes HI BYTE addressing unencodable). + if (hasInstFlag(kX86CompilerInstFlagIsGpbHiUsed)) + { + if (reinterpret_cast<GpVar *>(&o)->isGpb()) + var->regMask &= IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEbx) | IntUtil::maskFromIndex(kX86RegIndexEcx) | IntUtil::maskFromIndex(kX86RegIndexEdx); + } #endif // ASMJIT_X86/X64 - } - - if (isSpecial()) - { - // ${SPECIAL_INSTRUCTION_HANDLING_BEGIN} - switch (_code) - { - case kX86InstCpuId: - switch (i) - { - case 0: - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); - gpRestrictMask &= ~var->regMask; - break; - case 1: - vdata->regWriteCount++; - var->vflags |= kVarAllocWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEbx); - gpRestrictMask &= ~var->regMask; - break; - case 2: - vdata->regWriteCount++; - var->vflags |= kVarAllocWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); - gpRestrictMask &= ~var->regMask; - break; - case 3: - vdata->regWriteCount++; - var->vflags |= kVarAllocWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); - gpRestrictMask &= ~var->regMask; - break; - - default: - ASMJIT_ASSERT(0); - } - break; - - case kX86InstCbw: - case kX86InstCdqe: - case kX86InstCwde: - switch (i) - { - case 0: - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); - gpRestrictMask &= ~var->regMask; - break; - - default: - ASMJIT_ASSERT(0); - } - break; - - case kX86InstCdq: - case kX86InstCwd: - case kX86InstCqo: - switch (i) - { - case 0: - vdata->regWriteCount++; - var->vflags |= kVarAllocWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); - gpRestrictMask &= ~var->regMask; - break; - case 1: - vdata->regReadCount++; - var->vflags |= kVarAllocRead | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); - gpRestrictMask &= ~var->regMask; - break; - - default: - ASMJIT_ASSERT(0); - } - break; - - case kX86InstCmpXCHG: - switch (i) - { - case 0: - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); - gpRestrictMask &= ~var->regMask; - break; - case 1: - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite; - break; - case 2: - vdata->regReadCount++; - var->vflags |= kVarAllocRead; - break; - - default: - ASMJIT_ASSERT(0); - } - break; - - case kX86InstCmpXCHG8B: -#if defined(ASMJIT_X64) - case kX86InstCmpXCHG16B: + } + + if (this->isSpecial()) + { + // ${SPECIAL_INSTRUCTION_HANDLING_BEGIN} + switch (this->_code) + { + case kX86InstCpuId: + switch (i) + { + case 0: + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); + gpRestrictMask &= ~var->regMask; + break; + case 1: + ++vdata->regWriteCount; + var->vflags |= kVarAllocWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEbx); + gpRestrictMask &= ~var->regMask; + break; + case 2: + ++vdata->regWriteCount; + var->vflags |= kVarAllocWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); + gpRestrictMask &= ~var->regMask; + break; + case 3: + ++vdata->regWriteCount; + var->vflags |= kVarAllocWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); + gpRestrictMask &= ~var->regMask; + break; + + default: + ASMJIT_ASSERT(0); + } + break; + + case kX86InstCbw: + case kX86InstCdqe: + case kX86InstCwde: + switch (i) + { + case 0: + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); + gpRestrictMask &= ~var->regMask; + break; + + default: + ASMJIT_ASSERT(0); + } + break; + + case kX86InstCdq: + case kX86InstCwd: + case kX86InstCqo: + switch (i) + { + case 0: + ++vdata->regWriteCount; + var->vflags |= kVarAllocWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); + gpRestrictMask &= ~var->regMask; + break; + case 1: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); + gpRestrictMask &= ~var->regMask; + break; + + default: + ASMJIT_ASSERT(0); + } + break; + + case kX86InstCmpXCHG: + switch (i) + { + case 0: + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); + gpRestrictMask &= ~var->regMask; + break; + case 1: + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite; + break; + case 2: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead; + break; + + default: + ASMJIT_ASSERT(0); + } + break; + + case kX86InstCmpXCHG8B: +#ifdef ASMJIT_X64 + case kX86InstCmpXCHG16B: #endif // ASMJIT_X64 - switch (i) - { - case 0: - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); - gpRestrictMask &= ~var->regMask; - break; - case 1: - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); - gpRestrictMask &= ~var->regMask; - break; - case 2: - vdata->regReadCount++; - var->vflags |= kVarAllocRead | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); - gpRestrictMask &= ~var->regMask; - break; - case 3: - vdata->regReadCount++; - var->vflags |= kVarAllocRead | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEbx); - gpRestrictMask &= ~var->regMask; - break; - - default: - ASMJIT_ASSERT(0); - } - break; - -#if defined(ASMJIT_X86) - case kX86InstDaa: - case kX86InstDas: - ASMJIT_ASSERT(!i); - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); - gpRestrictMask &= ~var->regMask; - break; + switch (i) + { + case 0: + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); + gpRestrictMask &= ~var->regMask; + break; + case 1: + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); + gpRestrictMask &= ~var->regMask; + break; + case 2: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); + gpRestrictMask &= ~var->regMask; + break; + case 3: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEbx); + gpRestrictMask &= ~var->regMask; + break; + + default: + ASMJIT_ASSERT(0); + } + break; + +#ifdef ASMJIT_X86 + case kX86InstDaa: + case kX86InstDas: + ASMJIT_ASSERT(!i); + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); + gpRestrictMask &= ~var->regMask; + break; #endif // ASMJIT_X86 - case kX86InstIMul: - case kX86InstMul: - case kX86InstIDiv: - case kX86InstDiv: - switch (i) - { - case 0: - vdata->regWriteCount++; - var->vflags |= kVarAllocWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); - gpRestrictMask &= ~var->regMask; - break; - case 1: - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); - gpRestrictMask &= ~var->regMask; - break; - case 2: - vdata->regReadCount++; - var->vflags |= kVarAllocRead; - break; - - default: - ASMJIT_ASSERT(0); - } - break; - - case kX86InstMovPtr: - switch (i) - { - case 0: - vdata->regWriteCount++; - var->vflags |= kVarAllocWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); - gpRestrictMask &= ~var->regMask; - break; - case 1: - vdata->regReadCount++; - var->vflags |= kVarAllocRead | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); - gpRestrictMask &= ~var->regMask; - break; - default: - ASMJIT_ASSERT(0); - } - break; - - case kX86InstLahf: - ASMJIT_ASSERT(!i); - vdata->regWriteCount++; - var->vflags |= kVarAllocWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); - gpRestrictMask &= ~var->regMask; - break; - - case kX86InstSahf: - ASMJIT_ASSERT(!i); - vdata->regReadCount++; - var->vflags |= kVarAllocRead | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); - gpRestrictMask &= ~var->regMask; - break; - - case kX86InstMaskMovQ: - case kX86InstMaskMovDQU: - switch (i) - { - case 0: - vdata->regReadCount++; - var->vflags |= kVarAllocRead | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); - gpRestrictMask &= ~var->regMask; - break; - case 1: - case 2: - vdata->regReadCount++; - var->vflags |= kVarAllocRead; - break; - } - break; - - case kX86InstEnter: - case kX86InstLeave: - // TODO: SPECIAL INSTRUCTION. - break; - - case kX86InstRet: - // TODO: SPECIAL INSTRUCTION. - break; - - case kX86InstMonitor: - case kX86InstMWait: - // TODO: MONITOR/MWAIT (COMPILER). - break; - - case kX86InstPop: - // TODO: SPECIAL INSTRUCTION. - break; - - case kX86InstPopAD: - case kX86InstPopFD: - case kX86InstPopFQ: - // TODO: SPECIAL INSTRUCTION. - break; - - case kX86InstPush: - // TODO: SPECIAL INSTRUCTION. - break; - - case kX86InstPushAD: - case kX86InstPushFD: - case kX86InstPushFQ: - // TODO: SPECIAL INSTRUCTION. - break; - - case kX86InstRcl: - case kX86InstRcr: - case kX86InstRol: - case kX86InstRor: - case kX86InstSal: - case kX86InstSar: - case kX86InstShl: - case kX86InstShr: - switch (i) - { - case 0: - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite; - break; - case 1: - vdata->regReadCount++; - var->vflags |= kVarAllocRead | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); - gpRestrictMask &= ~var->regMask; - break; - - default: - ASMJIT_ASSERT(0); - } - break; - - case kX86InstShld: - case kX86InstShrd: - switch (i) - { - case 0: - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite; - break; - case 1: - vdata->regReadCount++; - var->vflags |= kVarAllocRead; - break; - case 2: - vdata->regReadCount++; - var->vflags |= kVarAllocRead | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); - gpRestrictMask &= ~var->regMask; - break; - - default: - ASMJIT_ASSERT(0); - } - break; - - case kX86InstRdtsc: - case kX86InstRdtscP: - switch (i) - { - case 0: - vdata->regWriteCount++; - var->vflags |= kVarAllocWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); - gpRestrictMask &= ~var->regMask; - break; - case 1: - vdata->regWriteCount++; - var->vflags |= kVarAllocWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); - gpRestrictMask &= ~var->regMask; - break; - case 2: - ASMJIT_ASSERT(_code == kX86InstRdtscP); - vdata->regWriteCount++; - var->vflags |= kVarAllocWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); - gpRestrictMask &= ~var->regMask; - break; - - default: - ASMJIT_ASSERT(0); - } - break; - - case kX86InstRepLodSB: - case kX86InstRepLodSD: - case kX86InstRepLodSQ: - case kX86InstRepLodSW: - switch (i) - { - case 0: - vdata->regWriteCount++; - var->vflags |= kVarAllocWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); - gpRestrictMask &= ~var->regMask; - break; - case 1: - vdata->regReadCount++; - var->vflags |= kVarAllocRead | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEsi); - gpRestrictMask &= ~var->regMask; - break; - case 2: - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); - gpRestrictMask &= ~var->regMask; - break; - default: - ASMJIT_ASSERT(0); - } - break; - - case kX86InstRepMovSB: - case kX86InstRepMovSD: - case kX86InstRepMovSQ: - case kX86InstRepMovSW: - case kX86InstRepECmpSB: - case kX86InstRepECmpSD: - case kX86InstRepECmpSQ: - case kX86InstRepECmpSW: - case kX86InstRepNECmpSB: - case kX86InstRepNECmpSD: - case kX86InstRepNECmpSQ: - case kX86InstRepNECmpSW: - switch (i) - { - case 0: - vdata->regReadCount++; - var->vflags |= kVarAllocRead | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); - gpRestrictMask &= ~var->regMask; - break; - case 1: - vdata->regReadCount++; - var->vflags |= kVarAllocRead | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEsi); - gpRestrictMask &= ~var->regMask; - break; - case 2: - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); - gpRestrictMask &= ~var->regMask; - break; - default: - ASMJIT_ASSERT(0); - } - break; - - case kX86InstRepStoSB: - case kX86InstRepStoSD: - case kX86InstRepStoSQ: - case kX86InstRepStoSW: - switch (i) - { - case 0: - vdata->regReadCount++; - var->vflags |= kVarAllocRead | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); - gpRestrictMask &= ~var->regMask; - break; - case 1: - vdata->regReadCount++; - var->vflags |= kVarAllocRead | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); - gpRestrictMask &= ~var->regMask; - break; - case 2: - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); - gpRestrictMask &= ~var->regMask; - break; - default: - ASMJIT_ASSERT(0); - } - break; - - case kX86InstRepEScaSB: - case kX86InstRepEScaSD: - case kX86InstRepEScaSQ: - case kX86InstRepEScaSW: - case kX86InstRepNEScaSB: - case kX86InstRepNEScaSD: - case kX86InstRepNEScaSQ: - case kX86InstRepNEScaSW: - switch (i) - { - case 0: - vdata->regReadCount++; - var->vflags |= kVarAllocRead | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); - gpRestrictMask &= ~var->regMask; - break; - case 1: - vdata->regReadCount++; - var->vflags |= kVarAllocRead | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); - gpRestrictMask &= ~var->regMask; - break; - case 2: - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; - var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); - gpRestrictMask &= ~var->regMask; - break; - default: - ASMJIT_ASSERT(0); - } - break; - - default: - ASMJIT_ASSERT(0); - } - // ${SPECIAL_INSTRUCTION_HANDLING_END} - } - else - { - if (!i) - { - // CMP/TEST instruction. - if (id->getCode() == kX86InstCmp || id->getCode() == kX86InstTest) - { - // Read-only case. - vdata->regReadCount++; - var->vflags |= kVarAllocRead; - } - // CVTTSD2SI/CVTTSS2SI instructions. - else if (id->getCode() == kX86InstCvttSD2SI || id->getCode() == kX86InstCvttSS2SI) - { - // In 32-bit mode the whole destination is replaced. In 64-bit mode - // we need to check whether the destination operand size is 64-bits. -#if defined(ASMJIT_X64) - if (_operands[0].isRegType(kX86RegTypeGpq)) - { + case kX86InstIMul: + case kX86InstMul: + case kX86InstIDiv: + case kX86InstDiv: + switch (i) + { + case 0: + ++vdata->regWriteCount; + var->vflags |= kVarAllocWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); + gpRestrictMask &= ~var->regMask; + break; + case 1: + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); + gpRestrictMask &= ~var->regMask; + break; + case 2: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead; + break; + + default: + ASMJIT_ASSERT(0); + } + break; + + case kX86InstMovPtr: + switch (i) + { + case 0: + ++vdata->regWriteCount; + var->vflags |= kVarAllocWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); + gpRestrictMask &= ~var->regMask; + break; + case 1: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); + gpRestrictMask &= ~var->regMask; + break; + + default: + ASMJIT_ASSERT(0); + } + break; + + case kX86InstLahf: + ASMJIT_ASSERT(!i); + ++vdata->regWriteCount; + var->vflags |= kVarAllocWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); + gpRestrictMask &= ~var->regMask; + break; + + case kX86InstSahf: + ASMJIT_ASSERT(!i); + ++vdata->regReadCount; + var->vflags |= kVarAllocRead | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); + gpRestrictMask &= ~var->regMask; + break; + + case kX86InstMaskMovQ: + case kX86InstMaskMovDQU: + switch (i) + { + case 0: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); + gpRestrictMask &= ~var->regMask; + break; + case 1: + case 2: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead; + } + break; + + case kX86InstEnter: + case kX86InstLeave: + // TODO: SPECIAL INSTRUCTION. + break; + + case kX86InstRet: + // TODO: SPECIAL INSTRUCTION. + break; + + case kX86InstMonitor: + case kX86InstMWait: + // TODO: MONITOR/MWAIT (COMPILER). + break; + + case kX86InstPop: + // TODO: SPECIAL INSTRUCTION. + break; + + case kX86InstPopAD: + case kX86InstPopFD: + case kX86InstPopFQ: + // TODO: SPECIAL INSTRUCTION. + break; + + case kX86InstPush: + // TODO: SPECIAL INSTRUCTION. + break; + + case kX86InstPushAD: + case kX86InstPushFD: + case kX86InstPushFQ: + // TODO: SPECIAL INSTRUCTION. + break; + + case kX86InstRcl: + case kX86InstRcr: + case kX86InstRol: + case kX86InstRor: + case kX86InstSal: + case kX86InstSar: + case kX86InstShl: + case kX86InstShr: + switch (i) + { + case 0: + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite; + break; + case 1: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); + gpRestrictMask &= ~var->regMask; + break; + + default: + ASMJIT_ASSERT(0); + } + break; + + case kX86InstShld: + case kX86InstShrd: + switch (i) + { + case 0: + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite; + break; + case 1: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead; + break; + case 2: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); + gpRestrictMask &= ~var->regMask; + break; + + default: + ASMJIT_ASSERT(0); + } + break; + + case kX86InstRdtsc: + case kX86InstRdtscP: + switch (i) + { + case 0: + ++vdata->regWriteCount; + var->vflags |= kVarAllocWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdx); + gpRestrictMask &= ~var->regMask; + break; + case 1: + ++vdata->regWriteCount; + var->vflags |= kVarAllocWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); + gpRestrictMask &= ~var->regMask; + break; + case 2: + ASMJIT_ASSERT(this->_code == kX86InstRdtscP); + ++vdata->regWriteCount; + var->vflags |= kVarAllocWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); + gpRestrictMask &= ~var->regMask; + break; + + default: + ASMJIT_ASSERT(0); + } + break; + + case kX86InstRepLodSB: + case kX86InstRepLodSD: + case kX86InstRepLodSQ: + case kX86InstRepLodSW: + switch (i) + { + case 0: + ++vdata->regWriteCount; + var->vflags |= kVarAllocWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); + gpRestrictMask &= ~var->regMask; + break; + case 1: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEsi); + gpRestrictMask &= ~var->regMask; + break; + case 2: + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); + gpRestrictMask &= ~var->regMask; + break; + + default: + ASMJIT_ASSERT(0); + } + break; + + case kX86InstRepMovSB: + case kX86InstRepMovSD: + case kX86InstRepMovSQ: + case kX86InstRepMovSW: + case kX86InstRepECmpSB: + case kX86InstRepECmpSD: + case kX86InstRepECmpSQ: + case kX86InstRepECmpSW: + case kX86InstRepNECmpSB: + case kX86InstRepNECmpSD: + case kX86InstRepNECmpSQ: + case kX86InstRepNECmpSW: + switch (i) + { + case 0: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); + gpRestrictMask &= ~var->regMask; + break; + case 1: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEsi); + gpRestrictMask &= ~var->regMask; + break; + case 2: + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); + gpRestrictMask &= ~var->regMask; + break; + + default: + ASMJIT_ASSERT(0); + } + break; + + case kX86InstRepStoSB: + case kX86InstRepStoSD: + case kX86InstRepStoSQ: + case kX86InstRepStoSW: + switch (i) + { + case 0: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); + gpRestrictMask &= ~var->regMask; + break; + case 1: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); + gpRestrictMask &= ~var->regMask; + break; + case 2: + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); + gpRestrictMask &= ~var->regMask; + break; + + default: + ASMJIT_ASSERT(0); + } + break; + + case kX86InstRepEScaSB: + case kX86InstRepEScaSD: + case kX86InstRepEScaSQ: + case kX86InstRepEScaSW: + case kX86InstRepNEScaSB: + case kX86InstRepNEScaSD: + case kX86InstRepNEScaSQ: + case kX86InstRepNEScaSW: + switch (i) + { + case 0: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEdi); + gpRestrictMask &= ~var->regMask; + break; + case 1: + ++vdata->regReadCount; + var->vflags |= kVarAllocRead | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEax); + gpRestrictMask &= ~var->regMask; + break; + case 2: + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite | kVarAllocSpecial; + var->regMask = IntUtil::maskFromIndex(kX86RegIndexEcx); + gpRestrictMask &= ~var->regMask; + break; + + default: + ASMJIT_ASSERT(0); + } + break; + + default: + ASMJIT_ASSERT(0); + } + // ${SPECIAL_INSTRUCTION_HANDLING_END} + } + else + { + if (!i) + { + // CMP/TEST instruction. + if (id->getCode() == kX86InstCmp || id->getCode() == kX86InstTest) + { + // Read-only case. + ++vdata->regReadCount; + var->vflags |= kVarAllocRead; + } + // CVTTSD2SI/CVTTSS2SI instructions. + else if (id->getCode() == kX86InstCvttSD2SI || id->getCode() == kX86InstCvttSS2SI) + { + // In 32-bit mode the whole destination is replaced. In 64-bit mode + // we need to check whether the destination operand size is 64-bits. +#ifdef ASMJIT_X64 + if (this->_operands[0].isRegType(kX86RegTypeGpq)) + { #endif // ASMJIT_X64 - // Write-only case. - vdata->regWriteCount++; - var->vflags |= kVarAllocWrite; -#if defined(ASMJIT_X64) - } - else - { - // Read/Write. - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite; - } + // Write-only case. + ++vdata->regWriteCount; + var->vflags |= kVarAllocWrite; +#ifdef ASMJIT_X64 + } + else + { + // Read/Write. + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite; + } #endif // ASMJIT_X64 - } - // MOV/MOVSS/MOVSD instructions. - // - // If instruction is MOV (source replaces the destination) or - // MOVSS/MOVSD and source operand is memory location then register - // allocator should know that previous destination value is lost - // (write only operation). - else if ((id->isMov()) || - ((id->getCode() == kX86InstMovSS || id->getCode() == kX86InstMovSD) /* && _operands[1].isMem() */) || - (id->getCode() == kX86InstIMul && _operandsCount == 3 && !isSpecial())) - { - // Write-only case. - vdata->regWriteCount++; - var->vflags |= kVarAllocWrite; - } - else if (id->getCode() == kX86InstLea) - { - // Write. - vdata->regWriteCount++; - var->vflags |= kVarAllocWrite; - } - else - { - // Read/Write. - vdata->regRwCount++; - var->vflags |= kVarAllocReadWrite; - } - } - else - { - // Second, third, ... operands are read-only. - vdata->regReadCount++; - var->vflags |= kVarAllocRead; - } - - if (!_memOp && i < 2 && (id->_opFlags[i] & kX86InstOpMem)) - { - var->vflags |= kVarAllocMem; - } - } - - // If variable must be in specific register we could add some hint to allocator. - if (var->vflags & kVarAllocSpecial) - { - vdata->prefRegisterMask |= var->regMask; - x86Context._newRegisterHomeIndex(vdata, IntUtil::findFirstBit(var->regMask)); - } - } - else if (o.isMem()) - { - if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar) - { - X86CompilerVar* vdata = x86Compiler->_getVar(o.getId()); - ASMJIT_ASSERT(!!vdata); - - __GET_VARIABLE(vdata) - - if (!i) - { - // If variable is MOV instruction type (source replaces the destination) - // or variable is MOVSS/MOVSD instruction then register allocator should - // know that previous destination value is lost (write only operation). - if (id->isMov() || ((id->getCode() == kX86InstMovSS || id->getCode() == kX86InstMovSD))) - { - // Write only case. - vdata->memWriteCount++; - } - else - { - vdata->memRwCount++; - } - } - else - { - vdata->memReadCount++; - } - } - else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar) - { - X86CompilerVar* vdata = x86Compiler->_getVar(reinterpret_cast<Mem&>(o).getBase()); - ASMJIT_ASSERT(!!vdata); - - __GET_VARIABLE(vdata) - vdata->regReadCount++; - var->vflags |= kVarAllocRegister | kVarAllocRead; - var->regMask &= gpRestrictMask; - } - - if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar) - { - X86CompilerVar* vdata = x86Compiler->_getVar(reinterpret_cast<Mem&>(o).getIndex()); - ASMJIT_ASSERT(!!vdata); - - __GET_VARIABLE(vdata) - vdata->regReadCount++; - var->vflags |= kVarAllocRegister | kVarAllocRead; - var->regMask &= gpRestrictMask; - } - } - } - - // Traverse all variables and update firstItem / lastItem. This - // function is called from iterator that scans items using forward - // direction so we can use this knowledge to optimize the process. - // - // Similar to X86CompilerFuncCall::prepare(). - for (i = 0; i < _variablesCount; i++) - { - X86CompilerVar* v = _vars[i].vdata; - - // Update GP register allocator restrictions. - if (X86Util::isVarTypeInt(v->getType())) - { - if (_vars[i].regMask == 0xFFFFFFFF) _vars[i].regMask &= gpRestrictMask; - } - - // Update first/last item (begin of variable scope). - if (!v->firstItem) v->firstItem = this; - v->lastItem = this; - } - - // There are some instructions that can be used to clear or to set all bits - // in a register: - // - // - andn reg, reg ; Set all bits in reg to 0. - // - xor/pxor reg, reg ; Set all bits in reg to 0. - // - sub/psub reg, reg ; Set all bits in reg to 0. - // - pcmpgt reg, reg ; Set all bits in reg to 0. - // - pcmpeq reg, reg ; Set all bits in reg to 1. - // - // There are also combinations which do nothing: - // - // - and reg, reg ; Nop. - // - or reg, reg ; Nop. - // - xchg reg, reg ; Nop. - - if (_variablesCount == 1 && _operandsCount > 1 && _operands[0].isVar() && _operands[1].isVar() && !_memOp) - { - switch (_code) - { - // ---------------------------------------------------------------------- - // [Zeros/Ones] - // ---------------------------------------------------------------------- - - // ANDN Instructions. - case kX86InstPAndN: - - // XOR Instructions. - case kX86InstXor: - case kX86InstXorPD: - case kX86InstXorPS: - case kX86InstPXor: - - // SUB Instructions. - case kX86InstSub: - case kX86InstPSubB: - case kX86InstPSubW: - case kX86InstPSubD: - case kX86InstPSubQ: - case kX86InstPSubSB: - case kX86InstPSubSW: - case kX86InstPSubUSB: - case kX86InstPSubUSW: - - // PCMPEQ Instructions. - case kX86InstPCmpEqB: - case kX86InstPCmpEqW: - case kX86InstPCmpEqD: - case kX86InstPCmpEqQ: - - // PCMPGT Instructions. - case kX86InstPCmpGtB: - case kX86InstPCmpGtW: - case kX86InstPCmpGtD: - case kX86InstPCmpGtQ: - // Clear the read flag. This prevents variable alloc/spill. - _vars[0].vflags = kVarAllocWrite; - _vars[0].vdata->regReadCount--; - break; - - // ---------------------------------------------------------------------- - // [Nop] - // ---------------------------------------------------------------------- - - // AND Instructions. - case kX86InstAnd: - case kX86InstAndPD: - case kX86InstAndPS: - case kX86InstPAnd: - - // OR Instructions. - case kX86InstOr: - case kX86InstOrPD: - case kX86InstOrPS: - case kX86InstPOr: - - // XCHG Instruction. - case kX86InstXchg: - - // Clear the write flag. - _vars[0].vflags = kVarAllocRead; - _vars[0].vdata->regWriteCount--; - break; - } - } - x86Context._currentOffset++; + } + // MOV/MOVSS/MOVSD instructions. + // + // If instruction is MOV (source replaces the destination) or + // MOVSS/MOVSD and source operand is memory location then register + // allocator should know that previous destination value is lost + // (write only operation). + else if ((id->isMov()) || ((id->getCode() == kX86InstMovSS || id->getCode() == kX86InstMovSD) /* && _operands[1].isMem() */) || + (id->getCode() == kX86InstIMul && this->_operandsCount == 3 && !isSpecial())) + { + // Write-only case. + ++vdata->regWriteCount; + var->vflags |= kVarAllocWrite; + } + else if (id->getCode() == kX86InstLea) + { + // Write. + ++vdata->regWriteCount; + var->vflags |= kVarAllocWrite; + } + else + { + // Read/Write. + ++vdata->regRwCount; + var->vflags |= kVarAllocReadWrite; + } + } + else + { + // Second, third, ... operands are read-only. + ++vdata->regReadCount; + var->vflags |= kVarAllocRead; + } + + if (!this->_memOp && i < 2 && (id->_opFlags[i] & kX86InstOpMem)) + var->vflags |= kVarAllocMem; + } + + // If variable must be in specific register we could add some hint to allocator. + if (var->vflags & kVarAllocSpecial) + { + vdata->prefRegisterMask |= var->regMask; + x86Context._newRegisterHomeIndex(vdata, IntUtil::findFirstBit(var->regMask)); + } + } + else if (o.isMem()) + { + if ((o.getId() & kOperandIdTypeMask) == kOperandIdTypeVar) + { + X86CompilerVar *vdata = x86Compiler->_getVar(o.getId()); + ASMJIT_ASSERT(vdata); + + __GET_VARIABLE(vdata) + + if (!i) + { + // If variable is MOV instruction type (source replaces the destination) + // or variable is MOVSS/MOVSD instruction then register allocator should + // know that previous destination value is lost (write only operation). + if (id->isMov() || (id->getCode() == kX86InstMovSS || id->getCode() == kX86InstMovSD)) + // Write only case. + ++vdata->memWriteCount; + else + ++vdata->memRwCount; + } + else + ++vdata->memReadCount; + } + else if ((o._mem.base & kOperandIdTypeMask) == kOperandIdTypeVar) + { + X86CompilerVar *vdata = x86Compiler->_getVar(reinterpret_cast<Mem &>(o).getBase()); + ASMJIT_ASSERT(vdata); + + __GET_VARIABLE(vdata) + ++vdata->regReadCount; + var->vflags |= kVarAllocRegister | kVarAllocRead; + var->regMask &= gpRestrictMask; + } + + if ((o._mem.index & kOperandIdTypeMask) == kOperandIdTypeVar) + { + X86CompilerVar *vdata = x86Compiler->_getVar(reinterpret_cast<Mem &>(o).getIndex()); + ASMJIT_ASSERT(vdata); + + __GET_VARIABLE(vdata) + ++vdata->regReadCount; + var->vflags |= kVarAllocRegister | kVarAllocRead; + var->regMask &= gpRestrictMask; + } + } + } + + // Traverse all variables and update firstItem / lastItem. This + // function is called from iterator that scans items using forward + // direction so we can use this knowledge to optimize the process. + // + // Similar to X86CompilerFuncCall::prepare(). + for (i = 0; i < this->_variablesCount; ++i) + { + X86CompilerVar *v = this->_vars[i].vdata; + + // Update GP register allocator restrictions. + if (X86Util::isVarTypeInt(v->getType()) && this->_vars[i].regMask == 0xFFFFFFFF) + this->_vars[i].regMask &= gpRestrictMask; + + // Update first/last item (begin of variable scope). + if (!v->firstItem) + v->firstItem = this; + v->lastItem = this; + } + + // There are some instructions that can be used to clear or to set all bits + // in a register: + // + // - andn reg, reg ; Set all bits in reg to 0. + // - xor/pxor reg, reg ; Set all bits in reg to 0. + // - sub/psub reg, reg ; Set all bits in reg to 0. + // - pcmpgt reg, reg ; Set all bits in reg to 0. + // - pcmpeq reg, reg ; Set all bits in reg to 1. + // + // There are also combinations which do nothing: + // + // - and reg, reg ; Nop. + // - or reg, reg ; Nop. + // - xchg reg, reg ; Nop. + + if (this->_variablesCount == 1 && this->_operandsCount > 1 && this->_operands[0].isVar() && this->_operands[1].isVar() && !this->_memOp) + { + switch (this->_code) + { + // ---------------------------------------------------------------------- + // [Zeros/Ones] + // ---------------------------------------------------------------------- + + // ANDN Instructions. + case kX86InstPAndN: + // XOR Instructions. + case kX86InstXor: + case kX86InstXorPD: + case kX86InstXorPS: + case kX86InstPXor: + // SUB Instructions. + case kX86InstSub: + case kX86InstPSubB: + case kX86InstPSubW: + case kX86InstPSubD: + case kX86InstPSubQ: + case kX86InstPSubSB: + case kX86InstPSubSW: + case kX86InstPSubUSB: + case kX86InstPSubUSW: + // PCMPEQ Instructions. + case kX86InstPCmpEqB: + case kX86InstPCmpEqW: + case kX86InstPCmpEqD: + case kX86InstPCmpEqQ: + // PCMPGT Instructions. + case kX86InstPCmpGtB: + case kX86InstPCmpGtW: + case kX86InstPCmpGtD: + case kX86InstPCmpGtQ: + // Clear the read flag. This prevents variable alloc/spill. + this->_vars[0].vflags = kVarAllocWrite; + --this->_vars[0].vdata->regReadCount; + break; + + // ---------------------------------------------------------------------- + // [Nop] + // ---------------------------------------------------------------------- + + // AND Instructions. + case kX86InstAnd: + case kX86InstAndPD: + case kX86InstAndPS: + case kX86InstPAnd: + // OR Instructions. + case kX86InstOr: + case kX86InstOrPD: + case kX86InstOrPS: + case kX86InstPOr: + // XCHG Instruction. + case kX86InstXchg: + // Clear the write flag. + this->_vars[0].vflags = kVarAllocRead; + --this->_vars[0].vdata->regWriteCount; + break; + } + } + ++x86Context._currentOffset; #undef __GET_VARIABLE } -CompilerItem* X86CompilerInst::translate(CompilerContext& cc) -{ - X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc); - X86Compiler* x86Compiler = getCompiler(); - - uint32_t i; - uint32_t variablesCount = _variablesCount; - - if (variablesCount > 0) - { - // These variables are used by the instruction and we set current offset - // to their work offsets -> getSpillCandidate never return the variable - // used this instruction. - for (i = 0; i < variablesCount; i++) - { - _vars[i].vdata->workOffset = x86Context._currentOffset; - } - - // Alloc variables used by the instruction (special first). - for (i = 0; i < variablesCount; i++) - { - VarAllocRecord& r = _vars[i]; - // Alloc variables with specific register first. - if (r.vflags & kVarAllocSpecial) - x86Context.allocVar(r.vdata, r.regMask, r.vflags); - } - - for (i = 0; i < variablesCount; i++) - { - VarAllocRecord& r = _vars[i]; - // Alloc variables without specific register last. - if (!(r.vflags & kVarAllocSpecial)) - x86Context.allocVar(r.vdata, r.regMask, r.vflags); - } - - x86Context.translateOperands(_operands, _operandsCount); - } - - if (_memOp && (_memOp->getId() & kOperandIdTypeMask) == kOperandIdTypeVar) - { - X86CompilerVar* cv = x86Compiler->_getVar(_memOp->getId()); - ASMJIT_ASSERT(!!cv); - - switch (cv->state) - { - case kVarStateUnused: - cv->state = kVarStateMem; - break; - case kVarStateReg: - cv->changed = false; - x86Context.unuseVar(cv, kVarStateMem); - break; - } - } - - for (i = 0; i < variablesCount; i++) - { - x86Context._unuseVarOnEndOfScope(this, &_vars[i]); - } - - return translated(); -} - -void X86CompilerInst::emit(Assembler& a) -{ - X86Assembler& x86Asm = static_cast<X86Assembler&>(a); - - x86Asm._inlineComment = _comment; - x86Asm._emitOptions = _emitOptions; - - if (isSpecial()) - { - // ${SPECIAL_INSTRUCTION_HANDLING_BEGIN} - switch (_code) - { - case kX86InstCpuId: - x86Asm._emitInstruction(_code); - return; - - case kX86InstCbw: - case kX86InstCdq: - case kX86InstCdqe: - case kX86InstCwd: - case kX86InstCwde: - case kX86InstCqo: - x86Asm._emitInstruction(_code); - return; - - case kX86InstCmpXCHG: - x86Asm._emitInstruction(_code, &_operands[1], &_operands[2]); - return; - - case kX86InstCmpXCHG8B: -#if defined(ASMJIT_X64) - case kX86InstCmpXCHG16B: +CompilerItem *X86CompilerInst::translate(CompilerContext &cc) +{ + X86CompilerContext &x86Context = static_cast<X86CompilerContext &>(cc); + X86Compiler *x86Compiler = this->getCompiler(); + + uint32_t i; + uint32_t variablesCount = this->_variablesCount; + + if (variablesCount > 0) + { + // These variables are used by the instruction and we set current offset + // to their work offsets -> getSpillCandidate never return the variable + // used this instruction. + for (i = 0; i < variablesCount; ++i) + this->_vars[i].vdata->workOffset = x86Context._currentOffset; + + // Alloc variables used by the instruction (special first). + for (i = 0; i < variablesCount; ++i) + { + VarAllocRecord &r = this->_vars[i]; + // Alloc variables with specific register first. + if (r.vflags & kVarAllocSpecial) + x86Context.allocVar(r.vdata, r.regMask, r.vflags); + } + + for (i = 0; i < variablesCount; ++i) + { + VarAllocRecord &r = this->_vars[i]; + // Alloc variables without specific register last. + if (!(r.vflags & kVarAllocSpecial)) + x86Context.allocVar(r.vdata, r.regMask, r.vflags); + } + + x86Context.translateOperands(this->_operands, this->_operandsCount); + } + + if (this->_memOp && (this->_memOp->getId() & kOperandIdTypeMask) == kOperandIdTypeVar) + { + X86CompilerVar *cv = x86Compiler->_getVar(this->_memOp->getId()); + ASMJIT_ASSERT(cv); + + switch (cv->state) + { + case kVarStateUnused: + cv->state = kVarStateMem; + break; + case kVarStateReg: + cv->changed = false; + x86Context.unuseVar(cv, kVarStateMem); + } + } + + for (i = 0; i < variablesCount; ++i) + x86Context._unuseVarOnEndOfScope(this, &this->_vars[i]); + + return this->translated(); +} + +void X86CompilerInst::emit(Assembler &a) +{ + X86Assembler &x86Asm = static_cast<X86Assembler &>(a); + + x86Asm._inlineComment = this->_comment; + x86Asm._emitOptions = this->_emitOptions; + + if (this->isSpecial()) + { + // ${SPECIAL_INSTRUCTION_HANDLING_BEGIN} + switch (this->_code) + { + case kX86InstCpuId: + x86Asm._emitInstruction(this->_code); + return; + + case kX86InstCbw: + case kX86InstCdq: + case kX86InstCdqe: + case kX86InstCwd: + case kX86InstCwde: + case kX86InstCqo: + x86Asm._emitInstruction(this->_code); + return; + + case kX86InstCmpXCHG: + x86Asm._emitInstruction(this->_code, &this->_operands[1], &this->_operands[2]); + return; + + case kX86InstCmpXCHG8B: +#ifdef ASMJIT_X64 + case kX86InstCmpXCHG16B: #endif // ASMJIT_X64 - x86Asm._emitInstruction(_code, &_operands[4]); - return; - -#if defined(ASMJIT_X86) - case kX86InstDaa: - case kX86InstDas: - x86Asm._emitInstruction(_code); - return; + x86Asm._emitInstruction(this->_code, &this->_operands[4]); + return; + +#ifdef ASMJIT_X86 + case kX86InstDaa: + case kX86InstDas: + x86Asm._emitInstruction(this->_code); + return; #endif // ASMJIT_X86 - case kX86InstIMul: - case kX86InstMul: - case kX86InstIDiv: - case kX86InstDiv: - // INST dst_lo (implicit), dst_hi (implicit), src (explicit) - ASMJIT_ASSERT(_operandsCount == 3); - x86Asm._emitInstruction(_code, &_operands[2]); - return; - - case kX86InstMovPtr: - break; - - case kX86InstLahf: - case kX86InstSahf: - x86Asm._emitInstruction(_code); - return; - - case kX86InstMaskMovQ: - case kX86InstMaskMovDQU: - x86Asm._emitInstruction(_code, &_operands[1], &_operands[2]); - return; - - case kX86InstEnter: - case kX86InstLeave: - // TODO: SPECIAL INSTRUCTION. - break; - - case kX86InstRet: - // TODO: SPECIAL INSTRUCTION. - break; - - case kX86InstMonitor: - case kX86InstMWait: - // TODO: MONITOR/MWAIT (COMPILER). - break; - - case kX86InstPop: - case kX86InstPopAD: - case kX86InstPopFD: - case kX86InstPopFQ: - // TODO: SPECIAL INSTRUCTION. - break; - - case kX86InstPush: - case kX86InstPushAD: - case kX86InstPushFD: - case kX86InstPushFQ: - // TODO: SPECIAL INSTRUCTION. - break; - - case kX86InstRcl: - case kX86InstRcr: - case kX86InstRol: - case kX86InstRor: - case kX86InstSal: - case kX86InstSar: - case kX86InstShl: - case kX86InstShr: - x86Asm._emitInstruction(_code, &_operands[0], &cl); - return; - - case kX86InstShld: - case kX86InstShrd: - x86Asm._emitInstruction(_code, &_operands[0], &_operands[1], &cl); - return; - - case kX86InstRdtsc: - case kX86InstRdtscP: - x86Asm._emitInstruction(_code); - return; - - case kX86InstRepLodSB: - case kX86InstRepLodSD: - case kX86InstRepLodSQ: - case kX86InstRepLodSW: - case kX86InstRepMovSB: - case kX86InstRepMovSD: - case kX86InstRepMovSQ: - case kX86InstRepMovSW: - case kX86InstRepStoSB: - case kX86InstRepStoSD: - case kX86InstRepStoSQ: - case kX86InstRepStoSW: - case kX86InstRepECmpSB: - case kX86InstRepECmpSD: - case kX86InstRepECmpSQ: - case kX86InstRepECmpSW: - case kX86InstRepEScaSB: - case kX86InstRepEScaSD: - case kX86InstRepEScaSQ: - case kX86InstRepEScaSW: - case kX86InstRepNECmpSB: - case kX86InstRepNECmpSD: - case kX86InstRepNECmpSQ: - case kX86InstRepNECmpSW: - case kX86InstRepNEScaSB: - case kX86InstRepNEScaSD: - case kX86InstRepNEScaSQ: - case kX86InstRepNEScaSW: - x86Asm._emitInstruction(_code); - return; - - default: - ASMJIT_ASSERT(0); - } - // ${SPECIAL_INSTRUCTION_HANDLING_END} - } - - switch (_operandsCount) - { - case 0: - x86Asm._emitInstruction(_code); - break; - case 1: - x86Asm._emitInstruction(_code, &_operands[0]); - break; - case 2: - x86Asm._emitInstruction(_code, &_operands[0], &_operands[1]); - break; - case 3: - x86Asm._emitInstruction(_code, &_operands[0], &_operands[1], &_operands[2]); - break; - default: - ASMJIT_ASSERT(0); - break; - } + case kX86InstIMul: + case kX86InstMul: + case kX86InstIDiv: + case kX86InstDiv: + // INST dst_lo (implicit), dst_hi (implicit), src (explicit) + ASMJIT_ASSERT(this->_operandsCount == 3); + x86Asm._emitInstruction(this->_code, &this->_operands[2]); + return; + + case kX86InstMovPtr: + break; + + case kX86InstLahf: + case kX86InstSahf: + x86Asm._emitInstruction(this->_code); + return; + + case kX86InstMaskMovQ: + case kX86InstMaskMovDQU: + x86Asm._emitInstruction(this->_code, &this->_operands[1], &this->_operands[2]); + return; + + case kX86InstEnter: + case kX86InstLeave: + // TODO: SPECIAL INSTRUCTION. + break; + + case kX86InstRet: + // TODO: SPECIAL INSTRUCTION. + break; + + case kX86InstMonitor: + case kX86InstMWait: + // TODO: MONITOR/MWAIT (COMPILER). + break; + + case kX86InstPop: + case kX86InstPopAD: + case kX86InstPopFD: + case kX86InstPopFQ: + // TODO: SPECIAL INSTRUCTION. + break; + + case kX86InstPush: + case kX86InstPushAD: + case kX86InstPushFD: + case kX86InstPushFQ: + // TODO: SPECIAL INSTRUCTION. + break; + + case kX86InstRcl: + case kX86InstRcr: + case kX86InstRol: + case kX86InstRor: + case kX86InstSal: + case kX86InstSar: + case kX86InstShl: + case kX86InstShr: + x86Asm._emitInstruction(this->_code, &this->_operands[0], &cl); + return; + + case kX86InstShld: + case kX86InstShrd: + x86Asm._emitInstruction(this->_code, &this->_operands[0], &this->_operands[1], &cl); + return; + + case kX86InstRdtsc: + case kX86InstRdtscP: + x86Asm._emitInstruction(this->_code); + return; + + case kX86InstRepLodSB: + case kX86InstRepLodSD: + case kX86InstRepLodSQ: + case kX86InstRepLodSW: + case kX86InstRepMovSB: + case kX86InstRepMovSD: + case kX86InstRepMovSQ: + case kX86InstRepMovSW: + case kX86InstRepStoSB: + case kX86InstRepStoSD: + case kX86InstRepStoSQ: + case kX86InstRepStoSW: + case kX86InstRepECmpSB: + case kX86InstRepECmpSD: + case kX86InstRepECmpSQ: + case kX86InstRepECmpSW: + case kX86InstRepEScaSB: + case kX86InstRepEScaSD: + case kX86InstRepEScaSQ: + case kX86InstRepEScaSW: + case kX86InstRepNECmpSB: + case kX86InstRepNECmpSD: + case kX86InstRepNECmpSQ: + case kX86InstRepNECmpSW: + case kX86InstRepNEScaSB: + case kX86InstRepNEScaSD: + case kX86InstRepNEScaSQ: + case kX86InstRepNEScaSW: + x86Asm._emitInstruction(this->_code); + return; + + default: + ASMJIT_ASSERT(0); + } + // ${SPECIAL_INSTRUCTION_HANDLING_END} + } + + switch (this->_operandsCount) + { + case 0: + x86Asm._emitInstruction(this->_code); + break; + case 1: + x86Asm._emitInstruction(this->_code, &this->_operands[0]); + break; + case 2: + x86Asm._emitInstruction(this->_code, &this->_operands[0], &this->_operands[1]); + break; + case 3: + x86Asm._emitInstruction(this->_code, &this->_operands[0], &this->_operands[1], &this->_operands[2]); + break; + default: + ASMJIT_ASSERT(0); + } } // ============================================================================ @@ -1582,44 +1546,41 @@ int X86CompilerInst::getMaxSize() const { - // TODO: Instruction max size. - return 15; -} - -bool X86CompilerInst::_tryUnuseVar(CompilerVar* _v) -{ - X86CompilerVar* cv = static_cast<X86CompilerVar*>(_v); - - for (uint32_t i = 0; i < _variablesCount; i++) - { - if (_vars[i].vdata == cv) - { - _vars[i].vflags |= kVarAllocUnuseAfterUse; - return true; - } - } - - return false; + // TODO: Instruction max size. + return 15; +} + +bool X86CompilerInst::_tryUnuseVar(CompilerVar *_v) +{ + X86CompilerVar *cv = static_cast<X86CompilerVar *>(_v); + + for (uint32_t i = 0; i < this->_variablesCount; ++i) + if (this->_vars[i].vdata == cv) + { + this->_vars[i].vflags |= kVarAllocUnuseAfterUse; + return true; + } + + return false; } // ============================================================================ // [AsmJit::X86CompilerJmpInst - Construction / Destruction] // ============================================================================ -X86CompilerJmpInst::X86CompilerJmpInst(X86Compiler* x86Compiler, uint32_t code, Operand* opData, uint32_t opCount) : - X86CompilerInst(x86Compiler, code, opData, opCount) -{ - _jumpTarget = x86Compiler->_getTarget(_operands[0].getId()); - _jumpTarget->_jumpsCount++; - - _jumpNext = static_cast<X86CompilerJmpInst*>(_jumpTarget->_from); - _jumpTarget->_from = this; - - // The 'jmp' is always taken, conditional jump can contain hint, we detect it. - if (getCode() == kX86InstJmp) - setInstFlag(kX86CompilerInstFlagIsTaken); - else if (opCount > 1 && opData[1].isImm() && reinterpret_cast<Imm*>(&opData[1])->getValue() == kCondHintLikely) - setInstFlag(kX86CompilerInstFlagIsTaken); +X86CompilerJmpInst::X86CompilerJmpInst(X86Compiler *x86Compiler, uint32_t code, Operand *opData, uint32_t opCount) : X86CompilerInst(x86Compiler, code, opData, opCount) +{ + this->_jumpTarget = x86Compiler->_getTarget(this->_operands[0].getId()); + ++this->_jumpTarget->_jumpsCount; + + this->_jumpNext = static_cast<X86CompilerJmpInst *>(this->_jumpTarget->_from); + this->_jumpTarget->_from = this; + + // The 'jmp' is always taken, conditional jump can contain hint, we detect it. + if (this->getCode() == kX86InstJmp) + this->setInstFlag(kX86CompilerInstFlagIsTaken); + else if (opCount > 1 && opData[1].isImm() && reinterpret_cast<Imm *>(&opData[1])->getValue() == kCondHintLikely) + this->setInstFlag(kX86CompilerInstFlagIsTaken); } X86CompilerJmpInst::~X86CompilerJmpInst() @@ -1630,196 +1591,194 @@ // [AsmJit::X86CompilerJmpInst - Interface] // ============================================================================ -void X86CompilerJmpInst::prepare(CompilerContext& cc) -{ - X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc); - _offset = x86Context._currentOffset; - - // Update _isTaken to true if this is conditional backward jump. This behavior - // can be overridden by using kCondHintUnlikely when using the instruction. - if (getCode() != kX86InstJmp && _operandsCount == 1 && _jumpTarget->getOffset() < getOffset()) - { - setInstFlag(kX86CompilerInstFlagIsTaken); - } - - // Now patch all variables where jump location is in the active range. - if (_jumpTarget->getOffset() != kInvalidValue && x86Context._active) - { - X86CompilerVar* first = static_cast<X86CompilerVar*>(x86Context._active); - X86CompilerVar* var = first; - uint32_t jumpOffset = _jumpTarget->getOffset(); - - do { - if (var->firstItem) - { - ASMJIT_ASSERT(!!var->lastItem); - uint32_t start = var->firstItem->getOffset(); - uint32_t end = var->lastItem->getOffset(); - - if (jumpOffset >= start && jumpOffset <= end) - var->lastItem = this; - } - var = var->nextActive; - } while (var != first); - } - - x86Context._currentOffset++; -} - -CompilerItem* X86CompilerJmpInst::translate(CompilerContext& cc) -{ - X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc); - - // Translate using X86CompilerInst. - CompilerItem* ret = X86CompilerInst::translate(cc); - - // We jump with item if its kX86InstJUMP (not based on condiiton) and it - // points into yet unknown location. - if (_code == kX86InstJmp && !_jumpTarget->isTranslated()) - { - x86Context.addBackwardCode(this); - ret = _jumpTarget; - } - else - { - _state = x86Context._saveState(); - if (_jumpTarget->isTranslated()) - { - doJump(cc); - } - else - { - // State is not known, so we need to call doJump() later. Compiler will - // do it for us. - x86Context.addForwardJump(this); - _jumpTarget->_state = _state; - } - - // Mark next code as unreachable, cleared by a next label (CompilerTarget). - if (_code == kX86InstJmp) - x86Context._isUnreachable = 1; - } - - // Need to traverse over all active variables and unuse them if their scope ends - // here. - if (x86Context._active) - { - X86CompilerVar* first = static_cast<X86CompilerVar*>(x86Context._active); - X86CompilerVar* var = first; - - do { - x86Context._unuseVarOnEndOfScope(this, var); - var = var->nextActive; - } while (var != first); - } - - return ret; -} - -void X86CompilerJmpInst::emit(Assembler& a) -{ - static const unsigned MAXIMUM_SHORT_JMP_SIZE = 127; - - // Try to minimize size of jump using SHORT jump (8-bit displacement) by - // traversing into the target and calculating the maximum code size. We - // end when code size reaches MAXIMUM_SHORT_JMP_SIZE. - if (!(_emitOptions & kX86EmitOptionShortJump) && getJumpTarget()->getOffset() > getOffset()) - { - // Calculate the code size. - unsigned codeSize = 0; - CompilerItem* cur = this->getNext(); - CompilerItem* target = getJumpTarget(); - - while (cur) - { - if (cur == target) - { - // Target found, we can tell assembler to generate short form of jump. - _emitOptions |= kX86EmitOptionShortJump; - goto _End; - } - - int s = cur->getMaxSize(); - if (s == -1) break; - - codeSize += (unsigned)s; - if (codeSize > MAXIMUM_SHORT_JMP_SIZE) break; - - cur = cur->getNext(); - } - } +void X86CompilerJmpInst::prepare(CompilerContext &cc) +{ + X86CompilerContext &x86Context = static_cast<X86CompilerContext &>(cc); + this->_offset = x86Context._currentOffset; + + // Update _isTaken to true if this is conditional backward jump. This behavior + // can be overridden by using kCondHintUnlikely when using the instruction. + if (this->getCode() != kX86InstJmp && this->_operandsCount == 1 && this->_jumpTarget->getOffset() < getOffset()) + this->setInstFlag(kX86CompilerInstFlagIsTaken); + + // Now patch all variables where jump location is in the active range. + if (this->_jumpTarget->getOffset() != kInvalidValue && x86Context._active) + { + X86CompilerVar *first = static_cast<X86CompilerVar *>(x86Context._active); + X86CompilerVar *var = first; + uint32_t jumpOffset = this->_jumpTarget->getOffset(); + + do + { + if (var->firstItem) + { + ASMJIT_ASSERT(var->lastItem); + uint32_t start = var->firstItem->getOffset(); + uint32_t end = var->lastItem->getOffset(); + + if (jumpOffset >= start && jumpOffset <= end) + var->lastItem = this; + } + var = var->nextActive; + } while (var != first); + } + + ++x86Context._currentOffset; +} + +CompilerItem* X86CompilerJmpInst::translate(CompilerContext &cc) +{ + X86CompilerContext &x86Context = static_cast<X86CompilerContext &>(cc); + + // Translate using X86CompilerInst. + CompilerItem *ret = X86CompilerInst::translate(cc); + + // We jump with item if its kX86InstJUMP (not based on condiiton) and it + // points into yet unknown location. + if (this->_code == kX86InstJmp && !this->_jumpTarget->isTranslated()) + { + x86Context.addBackwardCode(this); + ret = this->_jumpTarget; + } + else + { + this->_state = x86Context._saveState(); + if (this->_jumpTarget->isTranslated()) + this->doJump(cc); + else + { + // State is not known, so we need to call doJump() later. Compiler will + // do it for us. + x86Context.addForwardJump(this); + this->_jumpTarget->_state = this->_state; + } + + // Mark next code as unreachable, cleared by a next label (CompilerTarget). + if (this->_code == kX86InstJmp) + x86Context._isUnreachable = 1; + } + + // Need to traverse over all active variables and unuse them if their scope ends + // here. + if (x86Context._active) + { + X86CompilerVar *first = static_cast<X86CompilerVar *>(x86Context._active); + X86CompilerVar *var = first; + + do + { + x86Context._unuseVarOnEndOfScope(this, var); + var = var->nextActive; + } while (var != first); + } + + return ret; +} + +void X86CompilerJmpInst::emit(Assembler &a) +{ + static const unsigned MAXIMUM_SHORT_JMP_SIZE = 127; + + // Try to minimize size of jump using SHORT jump (8-bit displacement) by + // traversing into the target and calculating the maximum code size. We + // end when code size reaches MAXIMUM_SHORT_JMP_SIZE. + if (!(this->_emitOptions & kX86EmitOptionShortJump) && this->getJumpTarget()->getOffset() > this->getOffset()) + { + // Calculate the code size. + unsigned codeSize = 0; + CompilerItem *cur = this->getNext(); + CompilerItem *target = this->getJumpTarget(); + + while (cur) + { + if (cur == target) + { + // Target found, we can tell assembler to generate short form of jump. + this->_emitOptions |= kX86EmitOptionShortJump; + goto _End; + } + + int s = cur->getMaxSize(); + if (s == -1) + break; + + codeSize += s; + if (codeSize > MAXIMUM_SHORT_JMP_SIZE) + break; + + cur = cur->getNext(); + } + } _End: - X86CompilerInst::emit(a); + X86CompilerInst::emit(a); } // ============================================================================ // [AsmJit::X86CompilerJmpInst - DoJump] // ============================================================================ -void X86CompilerJmpInst::doJump(CompilerContext& cc) -{ - X86CompilerContext& x86Context = static_cast<X86CompilerContext&>(cc); - X86Compiler* x86Compiler = getCompiler(); - - // The state have to be already known. The doJump() method is called by - // translate() or by Compiler in case that it's forward jump. - ASMJIT_ASSERT(_jumpTarget->getState()); - - if (getCode() == kX86InstJmp || (isTaken() && _jumpTarget->getOffset() < getOffset())) - { - // Instruction type is JMP or conditional jump that should be taken (likely). - // We can set state here instead of jumping out, setting state and jumping - // to _jumpTarget. - // - // NOTE: We can't use this technique if instruction is forward conditional - // jump. The reason is that when generating code we can't change state here, - // because the next instruction depends on it. - x86Context._restoreState(_jumpTarget->getState(), _jumpTarget->getOffset()); - } - else - { - // Instruction type is JMP or conditional jump that should be not normally - // taken. If we need add code that will switch between different states we - // add it after the end of function body (after epilog, using 'ExtraBlock'). - CompilerItem* ext = x86Context.getExtraBlock(); - CompilerItem* old = x86Compiler->setCurrentItem(ext); - - x86Context._restoreState(_jumpTarget->getState(), _jumpTarget->getOffset()); - - if (x86Compiler->getCurrentItem() != ext) - { - // Add the jump to the target. - x86Compiler->jmp(_jumpTarget->_label); - ext = x86Compiler->getCurrentItem(); - - // The x86Context._restoreState() method emitted some instructions so we need to - // patch the jump. - Label L = x86Compiler->newLabel(); - x86Compiler->setCurrentItem(x86Context.getExtraBlock()); - x86Compiler->bind(L); - - // Finally, patch the jump target. - ASMJIT_ASSERT(_operandsCount > 0); - _operands[0] = L; // Operand part (Label). - _jumpTarget = x86Compiler->_getTarget(L.getId()); // Compiler part (CompilerTarget). - } - - x86Context.setExtraBlock(ext); - x86Compiler->setCurrentItem(old); - - // Assign state back. - x86Context._assignState(static_cast<X86CompilerState*>(_state)); - } +void X86CompilerJmpInst::doJump(CompilerContext &cc) +{ + X86CompilerContext &x86Context = static_cast<X86CompilerContext &>(cc); + X86Compiler *x86Compiler = this->getCompiler(); + + // The state have to be already known. The doJump() method is called by + // translate() or by Compiler in case that it's forward jump. + ASMJIT_ASSERT(this->_jumpTarget->getState()); + + if (this->getCode() == kX86InstJmp || (this->isTaken() && this->_jumpTarget->getOffset() < this->getOffset())) + // Instruction type is JMP or conditional jump that should be taken (likely). + // We can set state here instead of jumping out, setting state and jumping + // to _jumpTarget. + // + // NOTE: We can't use this technique if instruction is forward conditional + // jump. The reason is that when generating code we can't change state here, + // because the next instruction depends on it. + x86Context._restoreState(this->_jumpTarget->getState(), this->_jumpTarget->getOffset()); + else + { + // Instruction type is JMP or conditional jump that should be not normally + // taken. If we need add code that will switch between different states we + // add it after the end of function body (after epilog, using 'ExtraBlock'). + CompilerItem *ext = x86Context.getExtraBlock(); + CompilerItem *old = x86Compiler->setCurrentItem(ext); + + x86Context._restoreState(this->_jumpTarget->getState(), this->_jumpTarget->getOffset()); + + if (x86Compiler->getCurrentItem() != ext) + { + // Add the jump to the target. + x86Compiler->jmp(this->_jumpTarget->_label); + ext = x86Compiler->getCurrentItem(); + + // The x86Context._restoreState() method emitted some instructions so we need to + // patch the jump. + Label L = x86Compiler->newLabel(); + x86Compiler->setCurrentItem(x86Context.getExtraBlock()); + x86Compiler->bind(L); + + // Finally, patch the jump target. + ASMJIT_ASSERT(this->_operandsCount > 0); + this->_operands[0] = L; // Operand part (Label). + this->_jumpTarget = x86Compiler->_getTarget(L.getId()); // Compiler part (CompilerTarget). + } + + x86Context.setExtraBlock(ext); + x86Compiler->setCurrentItem(old); + + // Assign state back. + x86Context._assignState(static_cast<X86CompilerState *>(this->_state)); + } } // ============================================================================ // [AsmJit::X86CompilerJmpInst - GetJumpTarget] // ============================================================================ -CompilerTarget* X86CompilerJmpInst::getJumpTarget() const -{ - return _jumpTarget; +CompilerTarget *X86CompilerJmpInst::getJumpTarget() const +{ + return this->_jumpTarget; } } // AsmJit namespace
--- a/src/in_2sf/desmume/utils/AsmJit/x86/x86cpuinfo.cpp +++ b/src/in_2sf/desmume/utils/AsmJit/x86/x86cpuinfo.cpp @@ -12,16 +12,15 @@ // 2009-02-05: Thanks to Mike Tajmajer for VC7.1 compiler support. It shouldn't // affect x64 compilation, because x64 compiler starts with VS2005 (VC8.0). -#if defined(_MSC_VER) -# if _MSC_VER >= 1400 -# include <intrin.h> -# endif // _MSC_VER >= 1400 (>= VS2005) -#endif // _MSC_VER +#if defined(_MSC_VER) && _MSC_VER >= 1400 +# include <intrin.h> +#endif // _MSC_VER && _MSC_VER >= 1400 (>= VS2005) // [Api-Begin] #include "../core/apibegin.h" -namespace AsmJit { +namespace AsmJit +{ // ============================================================================ // [AsmJit::X86CpuVendor] @@ -29,71 +28,72 @@ struct X86CpuVendor { - uint32_t id; - char text[12]; + uint32_t id; + char text[12]; }; static const X86CpuVendor x86CpuVendor[] = { - { kCpuIntel , { 'G', 'e', 'n', 'u', 'i', 'n', 'e', 'I', 'n', 't', 'e', 'l' } }, - - { kCpuAmd , { 'A', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'A', 'M', 'D' } }, - { kCpuAmd , { 'A', 'M', 'D', 'i', 's', 'b', 'e', 't', 't', 'e', 'r', '!' } }, - - { kCpuNSM , { 'G', 'e', 'o', 'd', 'e', ' ', 'b', 'y', ' ', 'N', 'S', 'C' } }, - { kCpuNSM , { 'C', 'y', 'r', 'i', 'x', 'I', 'n', 's', 't', 'e', 'a', 'd' } }, - - { kCpuTransmeta, { 'G', 'e', 'n', 'u', 'i', 'n', 'e', 'T', 'M', 'x', '8', '6' } }, - { kCpuTransmeta, { 'T', 'r', 'a', 'n', 's', 'm', 'e', 't', 'a', 'C', 'P', 'U' } }, - - { kCpuVia , { 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 } }, - { kCpuVia , { 'C', 'e', 'n', 't', 'a', 'u', 'r', 'H', 'a', 'u', 'l', 's' } } + { kCpuIntel , { 'G', 'e', 'n', 'u', 'i', 'n', 'e', 'I', 'n', 't', 'e', 'l' } }, + + { kCpuAmd , { 'A', 'u', 't', 'h', 'e', 'n', 't', 'i', 'c', 'A', 'M', 'D' } }, + { kCpuAmd , { 'A', 'M', 'D', 'i', 's', 'b', 'e', 't', 't', 'e', 'r', '!' } }, + + { kCpuNSM , { 'G', 'e', 'o', 'd', 'e', ' ', 'b', 'y', ' ', 'N', 'S', 'C' } }, + { kCpuNSM , { 'C', 'y', 'r', 'i', 'x', 'I', 'n', 's', 't', 'e', 'a', 'd' } }, + + { kCpuTransmeta, { 'G', 'e', 'n', 'u', 'i', 'n', 'e', 'T', 'M', 'x', '8', '6' } }, + { kCpuTransmeta, { 'T', 'r', 'a', 'n', 's', 'm', 'e', 't', 'a', 'C', 'P', 'U' } }, + + { kCpuVia , { 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 , 'V', 'I', 'A', 0 } }, + { kCpuVia , { 'C', 'e', 'n', 't', 'a', 'u', 'r', 'H', 'a', 'u', 'l', 's' } } }; -static inline bool x86CpuVendorEq(const X86CpuVendor& info, const char* vendorString) -{ - const uint32_t* a = reinterpret_cast<const uint32_t*>(info.text); - const uint32_t* b = reinterpret_cast<const uint32_t*>(vendorString); - - return (a[0] == b[0]) & - (a[1] == b[1]) & - (a[2] == b[2]) ; +static inline bool x86CpuVendorEq(const X86CpuVendor &info, const char *vendorString) +{ + const uint32_t *a = reinterpret_cast<const uint32_t *>(info.text); + const uint32_t *b = reinterpret_cast<const uint32_t *>(vendorString); + + return a[0] == b[0] && a[1] == b[1] && a[2] == b[2]; } // ============================================================================ // [AsmJit::x86CpuSimplifyBrandString] // ============================================================================ -static inline void x86CpuSimplifyBrandString(char* s) -{ - // Always clear the current character in the buffer. This ensures that there - // is no garbage after the string NULL terminator. - char* d = s; - - char prev = 0; - char curr = s[0]; - s[0] = '\0'; - - for (;;) - { - if (!curr) break; - - if (curr == ' ') - { - if (prev == '@') goto _Skip; - if (s[1] == ' ' || s[1] == '@') goto _Skip; - } - - d[0] = curr; - d++; - prev = curr; - -_Skip: - curr = *++s; - s[0] = '\0'; - } - - d[0] = '\0'; +static inline void x86CpuSimplifyBrandString(char *s) +{ + // Always clear the current character in the buffer. This ensures that there + // is no garbage after the string NULL terminator. + char *d = s; + + char prev = 0; + char curr = s[0]; + s[0] = 0; + + for (;;) + { + if (!curr) + break; + + if (curr == ' ') + { + if (prev == '@') + goto _Skip; + if (s[1] == ' ' || s[1] == '@') + goto _Skip; + } + + d[0] = curr; + ++d; + prev = curr; + + _Skip: + curr = *++s; + s[0] = 0; + } + + d[0] = 0; } // ============================================================================ @@ -107,49 +107,45 @@ // x86CpuId() and detectCpuInfo() for x86 and x64 platforms begins here. #if defined(ASMJIT_X86) || defined(ASMJIT_X64) -void x86CpuId(uint32_t in, X86CpuId* out) -{ -#if defined(_MSC_VER) - -// 2009-02-05: Thanks to Mike Tajmajer for supporting VC7.1 compiler. -// ASMJIT_X64 is here only for readibility, only VS2005 can compile 64-bit code. +void x86CpuId(uint32_t in, X86CpuId *out) +{ +#ifdef _MSC_VER + // 2009-02-05: Thanks to Mike Tajmajer for supporting VC7.1 compiler. + // ASMJIT_X64 is here only for readibility, only VS2005 can compile 64-bit code. # if _MSC_VER >= 1400 || defined(ASMJIT_X64) - // Done by intrinsics. - __cpuid(reinterpret_cast<int*>(out->i), in); + // Done by intrinsics. + __cpuid(reinterpret_cast<int *>(out->i), in); # else // _MSC_VER < 1400 - uint32_t cpuid_in = in; - uint32_t* cpuid_out = out->i; - - __asm - { - mov eax, cpuid_in - mov edi, cpuid_out - cpuid - mov dword ptr[edi + 0], eax - mov dword ptr[edi + 4], ebx - mov dword ptr[edi + 8], ecx - mov dword ptr[edi + 12], edx - } + uint32_t cpuid_in = in; + uint32_t *cpuid_out = out->i; + + __asm + { + mov eax, cpuid_in + mov edi, cpuid_out + cpuid + mov dword ptr[edi + 0], eax + mov dword ptr[edi + 4], ebx + mov dword ptr[edi + 8], ecx + mov dword ptr[edi + 12], edx + } # endif // _MSC_VER < 1400 - #elif defined(__GNUC__) - // Note, need to preserve ebx/rbx register! -# if defined(ASMJIT_X86) +# ifdef ASMJIT_X86 # define __myCpuId(a, b, c, d, inp) \ - asm ("mov %%ebx, %%edi\n" \ - "cpuid\n" \ - "xchg %%edi, %%ebx\n" \ - : "=a" (a), "=D" (b), "=c" (c), "=d" (d) : "a" (inp)) + asm ("mov %%ebx, %%edi\n" \ + "cpuid\n" \ + "xchg %%edi, %%ebx\n" \ + : "=a" (a), "=D" (b), "=c" (c), "=d" (d) : "a" (inp)) # else # define __myCpuId(a, b, c, d, inp) \ - asm ("mov %%rbx, %%rdi\n" \ - "cpuid\n" \ - "xchg %%rdi, %%rbx\n" \ - : "=a" (a), "=D" (b), "=c" (c), "=d" (d) : "a" (inp)) + asm ("mov %%rbx, %%rdi\n" \ + "cpuid\n" \ + "xchg %%rdi, %%rbx\n" \ + : "=a" (a), "=D" (b), "=c" (c), "=d" (d) : "a" (inp)) # endif - __myCpuId(out->eax, out->ebx, out->ecx, out->edx, in); - + __myCpuId(out->eax, out->ebx, out->ecx, out->edx, in); #endif // Compiler #ifdef. } @@ -157,144 +153,171 @@ // [AsmJit::x86CpuDetect] // ============================================================================ -void x86CpuDetect(X86CpuInfo* out) -{ - uint32_t i; - X86CpuId regs; - - // Clear everything except the '_size' member. - memset(reinterpret_cast<uint8_t*>(out) + sizeof(uint32_t), - 0, sizeof(CpuInfo) - sizeof(uint32_t)); - - // Fill safe defaults. - memcpy(out->_vendorString, "Unknown", 8); - out->_numberOfProcessors = CpuInfo::detectNumberOfProcessors(); - - // Get vendor string/id. - x86CpuId(0, ®s); - - memcpy(out->_vendorString, ®s.ebx, 4); - memcpy(out->_vendorString + 4, ®s.edx, 4); - memcpy(out->_vendorString + 8, ®s.ecx, 4); - - for (i = 0; i < 3; i++) - { - if (x86CpuVendorEq(x86CpuVendor[i], out->_vendorString)) - { - out->_vendorId = x86CpuVendor[i].id; - break; - } - } - - // Get feature flags in ecx/edx, and family/model in eax. - x86CpuId(1, ®s); - - // Fill family and model fields. - out->_family = (regs.eax >> 8) & 0x0F; - out->_model = (regs.eax >> 4) & 0x0F; - out->_stepping = (regs.eax ) & 0x0F; - - // Use extended family and model fields. - if (out->_family == 0x0F) - { - out->_family += ((regs.eax >> 20) & 0xFF); - out->_model += ((regs.eax >> 16) & 0x0F) << 4; - } - - out->_processorType = ((regs.eax >> 12) & 0x03); - out->_brandIndex = ((regs.ebx ) & 0xFF); - out->_flushCacheLineSize = ((regs.ebx >> 8) & 0xFF) * 8; - out->_maxLogicalProcessors = ((regs.ebx >> 16) & 0xFF); - out->_apicPhysicalId = ((regs.ebx >> 24) & 0xFF); - - if (regs.ecx & 0x00000001U) out->_features |= kX86FeatureSse3; - if (regs.ecx & 0x00000002U) out->_features |= kX86FeaturePclMulDQ; - if (regs.ecx & 0x00000008U) out->_features |= kX86FeatureMonitorMWait; - if (regs.ecx & 0x00000200U) out->_features |= kX86FeatureSsse3; - if (regs.ecx & 0x00002000U) out->_features |= kX86FeatureCmpXchg16B; - if (regs.ecx & 0x00080000U) out->_features |= kX86FeatureSse41; - if (regs.ecx & 0x00100000U) out->_features |= kX86FeatureSse42; - if (regs.ecx & 0x00400000U) out->_features |= kX86FeatureMovBE; - if (regs.ecx & 0x00800000U) out->_features |= kX86FeaturePopCnt; - if (regs.ecx & 0x10000000U) out->_features |= kX86FeatureAvx; - - if (regs.edx & 0x00000010U) out->_features |= kX86FeatureRdtsc; - if (regs.edx & 0x00000100U) out->_features |= kX86FeatureCmpXchg8B; - if (regs.edx & 0x00008000U) out->_features |= kX86FeatureCMov; - if (regs.edx & 0x00800000U) out->_features |= kX86FeatureMmx; - if (regs.edx & 0x01000000U) out->_features |= kX86FeatureFXSR; - if (regs.edx & 0x02000000U) out->_features |= kX86FeatureSse | kX86FeatureMmxExt; - if (regs.edx & 0x04000000U) out->_features |= kX86FeatureSse | kX86FeatureSse2; - if (regs.edx & 0x10000000U) out->_features |= kX86FeatureMultiThreading; - - if (out->_vendorId == kCpuAmd && (regs.edx & 0x10000000U)) - { - // AMD sets Multithreading to ON if it has more cores. - if (out->_numberOfProcessors == 1) out->_numberOfProcessors = 2; - } - - // This comment comes from V8 and I think that its important: - // - // Opteron Rev E has i bug in which on very rare occasions i locked - // instruction doesn't act as i read-acquire barrier if followed by i - // non-locked read-modify-write instruction. Rev F has this bug in - // pre-release versions, but not in versions released to customers, - // so we test only for Rev E, which is family 15, model 32..63 inclusive. - - if (out->_vendorId == kCpuAmd && out->_family == 15 && out->_model >= 32 && out->_model <= 63) - { - out->_bugs |= kX86BugAmdLockMB; - } - - // Calling cpuid with 0x80000000 as the in argument - // gets the number of valid extended IDs. - - x86CpuId(0x80000000, ®s); - - uint32_t exIds = regs.eax; - if (exIds > 0x80000004) exIds = 0x80000004; - - uint32_t* brand = reinterpret_cast<uint32_t*>(out->_brandString); - - for (i = 0x80000001; i <= exIds; i++) - { - x86CpuId(i, ®s); - - switch (i) - { - case 0x80000001: - if (regs.ecx & 0x00000001U) out->_features |= kX86FeatureLahfSahf; - if (regs.ecx & 0x00000020U) out->_features |= kX86FeatureLzCnt; - if (regs.ecx & 0x00000040U) out->_features |= kX86FeatureSse4A; - if (regs.ecx & 0x00000080U) out->_features |= kX86FeatureMSse; - if (regs.ecx & 0x00000100U) out->_features |= kX86FeaturePrefetch; - - if (regs.edx & 0x00100000U) out->_features |= kX86FeatureExecuteDisableBit; - if (regs.edx & 0x00200000U) out->_features |= kX86FeatureFFXSR; - if (regs.edx & 0x00400000U) out->_features |= kX86FeatureMmxExt; - if (regs.edx & 0x08000000U) out->_features |= kX86FeatureRdtscP; - if (regs.edx & 0x20000000U) out->_features |= kX86Feature64Bit; - if (regs.edx & 0x40000000U) out->_features |= kX86Feature3dNowExt | kX86FeatureMmxExt; - if (regs.edx & 0x80000000U) out->_features |= kX86Feature3dNow; - break; - - case 0x80000002: - case 0x80000003: - case 0x80000004: - *brand++ = regs.eax; - *brand++ = regs.ebx; - *brand++ = regs.ecx; - *brand++ = regs.edx; - break; - - default: - // Additional features can be detected in the future. - break; - } - } - - // Simplify the brand string (remove unnecessary spaces to make it printable). - x86CpuSimplifyBrandString(out->_brandString); +void x86CpuDetect(X86CpuInfo *out) +{ + uint32_t i; + X86CpuId regs; + + // Clear everything except the '_size' member. + memset(reinterpret_cast<uint8_t *>(out) + sizeof(uint32_t), 0, sizeof(CpuInfo) - sizeof(uint32_t)); + + // Fill safe defaults. + memcpy(out->_vendorString, "Unknown", 8); + out->_numberOfProcessors = CpuInfo::detectNumberOfProcessors(); + + // Get vendor string/id. + x86CpuId(0, ®s); + + memcpy(out->_vendorString, ®s.ebx, 4); + memcpy(out->_vendorString + 4, ®s.edx, 4); + memcpy(out->_vendorString + 8, ®s.ecx, 4); + + for (i = 0; i < 3; ++i) + if (x86CpuVendorEq(x86CpuVendor[i], out->_vendorString)) + { + out->_vendorId = x86CpuVendor[i].id; + break; + } + + // Get feature flags in ecx/edx, and family/model in eax. + x86CpuId(1, ®s); + + // Fill family and model fields. + out->_family = (regs.eax >> 8) & 0x0F; + out->_model = (regs.eax >> 4) & 0x0F; + out->_stepping = regs.eax & 0x0F; + + // Use extended family and model fields. + if (out->_family == 0x0F) + { + out->_family += (regs.eax >> 20) & 0xFF; + out->_model += ((regs.eax >> 16) & 0x0F) << 4; + } + + out->_processorType = (regs.eax >> 12) & 0x03; + out->_brandIndex = regs.ebx & 0xFF; + out->_flushCacheLineSize = ((regs.ebx >> 8) & 0xFF) * 8; + out->_maxLogicalProcessors = (regs.ebx >> 16) & 0xFF; + out->_apicPhysicalId = (regs.ebx >> 24) & 0xFF; + + if (regs.ecx & 0x00000001U) + out->_features |= kX86FeatureSse3; + if (regs.ecx & 0x00000002U) + out->_features |= kX86FeaturePclMulDQ; + if (regs.ecx & 0x00000008U) + out->_features |= kX86FeatureMonitorMWait; + if (regs.ecx & 0x00000200U) + out->_features |= kX86FeatureSsse3; + if (regs.ecx & 0x00002000U) + out->_features |= kX86FeatureCmpXchg16B; + if (regs.ecx & 0x00080000U) + out->_features |= kX86FeatureSse41; + if (regs.ecx & 0x00100000U) + out->_features |= kX86FeatureSse42; + if (regs.ecx & 0x00400000U) + out->_features |= kX86FeatureMovBE; + if (regs.ecx & 0x00800000U) + out->_features |= kX86FeaturePopCnt; + if (regs.ecx & 0x10000000U) + out->_features |= kX86FeatureAvx; + + if (regs.edx & 0x00000010U) + out->_features |= kX86FeatureRdtsc; + if (regs.edx & 0x00000100U) + out->_features |= kX86FeatureCmpXchg8B; + if (regs.edx & 0x00008000U) + out->_features |= kX86FeatureCMov; + if (regs.edx & 0x00800000U) + out->_features |= kX86FeatureMmx; + if (regs.edx & 0x01000000U) + out->_features |= kX86FeatureFXSR; + if (regs.edx & 0x02000000U) + out->_features |= kX86FeatureSse | kX86FeatureMmxExt; + if (regs.edx & 0x04000000U) + out->_features |= kX86FeatureSse | kX86FeatureSse2; + if (regs.edx & 0x10000000U) + out->_features |= kX86FeatureMultiThreading; + + if (out->_vendorId == kCpuAmd && (regs.edx & 0x10000000U)) + { + // AMD sets Multithreading to ON if it has more cores. + if (out->_numberOfProcessors == 1) + out->_numberOfProcessors = 2; + } + + // This comment comes from V8 and I think that its important: + // + // Opteron Rev E has i bug in which on very rare occasions i locked + // instruction doesn't act as i read-acquire barrier if followed by i + // non-locked read-modify-write instruction. Rev F has this bug in + // pre-release versions, but not in versions released to customers, + // so we test only for Rev E, which is family 15, model 32..63 inclusive. + + if (out->_vendorId == kCpuAmd && out->_family == 15 && out->_model >= 32 && out->_model <= 63) + out->_bugs |= kX86BugAmdLockMB; + + // Calling cpuid with 0x80000000 as the in argument + // gets the number of valid extended IDs. + + x86CpuId(0x80000000, ®s); + + uint32_t exIds = regs.eax; + if (exIds > 0x80000004) + exIds = 0x80000004; + + uint32_t *brand = reinterpret_cast<uint32_t *>(out->_brandString); + + for (i = 0x80000001; i <= exIds; ++i) + { + x86CpuId(i, ®s); + + switch (i) + { + case 0x80000001: + if (regs.ecx & 0x00000001U) + out->_features |= kX86FeatureLahfSahf; + if (regs.ecx & 0x00000020U) + out->_features |= kX86FeatureLzCnt; + if (regs.ecx & 0x00000040U) + out->_features |= kX86FeatureSse4A; + if (regs.ecx & 0x00000080U) + out->_features |= kX86FeatureMSse; + if (regs.ecx & 0x00000100U) + out->_features |= kX86FeaturePrefetch; + + if (regs.edx & 0x00100000U) + out->_features |= kX86FeatureExecuteDisableBit; + if (regs.edx & 0x00200000U) + out->_features |= kX86FeatureFFXSR; + if (regs.edx & 0x00400000U) + out->_features |= kX86FeatureMmxExt; + if (regs.edx & 0x08000000U) + out->_features |= kX86FeatureRdtscP; + if (regs.edx & 0x20000000U) + out->_features |= kX86Feature64Bit; + if (regs.edx & 0x40000000U) + out->_features |= kX86Feature3dNowExt | kX86FeatureMmxExt; + if (regs.edx & 0x80000000U) + out->_features |= kX86Feature3dNow; + break; + + case 0x80000002: + case 0x80000003: + case 0x80000004: + *brand++ = regs.eax; + *brand++ = regs.ebx; + *brand++ = regs.ecx; + *brand++ = regs.edx; + break; + + default: + // Additional features can be detected in the future. + break; + } + } + + // Simplify the brand string (remove unnecessary spaces to make it printable). + x86CpuSimplifyBrandString(out->_brandString); } #endif
--- a/src/in_2sf/desmume/utils/AsmJit/x86/x86defs.cpp +++ b/src/in_2sf/desmume/utils/AsmJit/x86/x86defs.cpp @@ -12,7 +12,8 @@ // [Api-Begin] #include "../core/apibegin.h" -namespace AsmJit { +namespace AsmJit +{ // ============================================================================ // [AsmJit::x86InstName] @@ -23,586 +24,585 @@ // // ${X86_INST_DATA:BEGIN} const char x86InstName[] = - "\0" - "adc\0" - "add\0" - "addpd\0" - "addps\0" - "addsd\0" - "addss\0" - "addsubpd\0" - "addsubps\0" - "amd_prefetch\0" - "amd_prefetchw\0" - "and\0" - "andnpd\0" - "andnps\0" - "andpd\0" - "andps\0" - "blendpd\0" - "blendps\0" - "blendvpd\0" - "blendvps\0" - "bsf\0" - "bsr\0" - "bswap\0" - "bt\0" - "btc\0" - "btr\0" - "bts\0" - "call\0" - "cbw\0" - "cdq\0" - "cdqe\0" - "clc\0" - "cld\0" - "clflush\0" - "cmc\0" - "cmova\0" - "cmovae\0" - "cmovb\0" - "cmovbe\0" - "cmovc\0" - "cmove\0" - "cmovg\0" - "cmovge\0" - "cmovl\0" - "cmovle\0" - "cmovna\0" - "cmovnae\0" - "cmovnb\0" - "cmovnbe\0" - "cmovnc\0" - "cmovne\0" - "cmovng\0" - "cmovnge\0" - "cmovnl\0" - "cmovnle\0" - "cmovno\0" - "cmovnp\0" - "cmovns\0" - "cmovnz\0" - "cmovo\0" - "cmovp\0" - "cmovpe\0" - "cmovpo\0" - "cmovs\0" - "cmovz\0" - "cmp\0" - "cmppd\0" - "cmpps\0" - "cmpsd\0" - "cmpss\0" - "cmpxchg\0" - "cmpxchg16b\0" - "cmpxchg8b\0" - "comisd\0" - "comiss\0" - "cpuid\0" - "cqo\0" - "crc32\0" - "cvtdq2pd\0" - "cvtdq2ps\0" - "cvtpd2dq\0" - "cvtpd2pi\0" - "cvtpd2ps\0" - "cvtpi2pd\0" - "cvtpi2ps\0" - "cvtps2dq\0" - "cvtps2pd\0" - "cvtps2pi\0" - "cvtsd2si\0" - "cvtsd2ss\0" - "cvtsi2sd\0" - "cvtsi2ss\0" - "cvtss2sd\0" - "cvtss2si\0" - "cvttpd2dq\0" - "cvttpd2pi\0" - "cvttps2dq\0" - "cvttps2pi\0" - "cvttsd2si\0" - "cvttss2si\0" - "cwd\0" - "cwde\0" - "daa\0" - "das\0" - "dec\0" - "div\0" - "divpd\0" - "divps\0" - "divsd\0" - "divss\0" - "dppd\0" - "dpps\0" - "emms\0" - "enter\0" - "extractps\0" - "f2xm1\0" - "fabs\0" - "fadd\0" - "faddp\0" - "fbld\0" - "fbstp\0" - "fchs\0" - "fclex\0" - "fcmovb\0" - "fcmovbe\0" - "fcmove\0" - "fcmovnb\0" - "fcmovnbe\0" - "fcmovne\0" - "fcmovnu\0" - "fcmovu\0" - "fcom\0" - "fcomi\0" - "fcomip\0" - "fcomp\0" - "fcompp\0" - "fcos\0" - "fdecstp\0" - "fdiv\0" - "fdivp\0" - "fdivr\0" - "fdivrp\0" - "femms\0" - "ffree\0" - "fiadd\0" - "ficom\0" - "ficomp\0" - "fidiv\0" - "fidivr\0" - "fild\0" - "fimul\0" - "fincstp\0" - "finit\0" - "fist\0" - "fistp\0" - "fisttp\0" - "fisub\0" - "fisubr\0" - "fld\0" - "fld1\0" - "fldcw\0" - "fldenv\0" - "fldl2e\0" - "fldl2t\0" - "fldlg2\0" - "fldln2\0" - "fldpi\0" - "fldz\0" - "fmul\0" - "fmulp\0" - "fnclex\0" - "fninit\0" - "fnop\0" - "fnsave\0" - "fnstcw\0" - "fnstenv\0" - "fnstsw\0" - "fpatan\0" - "fprem\0" - "fprem1\0" - "fptan\0" - "frndint\0" - "frstor\0" - "fsave\0" - "fscale\0" - "fsin\0" - "fsincos\0" - "fsqrt\0" - "fst\0" - "fstcw\0" - "fstenv\0" - "fstp\0" - "fstsw\0" - "fsub\0" - "fsubp\0" - "fsubr\0" - "fsubrp\0" - "ftst\0" - "fucom\0" - "fucomi\0" - "fucomip\0" - "fucomp\0" - "fucompp\0" - "fwait\0" - "fxam\0" - "fxch\0" - "fxrstor\0" - "fxsave\0" - "fxtract\0" - "fyl2x\0" - "fyl2xp1\0" - "haddpd\0" - "haddps\0" - "hsubpd\0" - "hsubps\0" - "idiv\0" - "imul\0" - "inc\0" - "int3\0" - "ja\0" - "jae\0" - "jb\0" - "jbe\0" - "jc\0" - "je\0" - "jg\0" - "jge\0" - "jl\0" - "jle\0" - "jna\0" - "jnae\0" - "jnb\0" - "jnbe\0" - "jnc\0" - "jne\0" - "jng\0" - "jnge\0" - "jnl\0" - "jnle\0" - "jno\0" - "jnp\0" - "jns\0" - "jnz\0" - "jo\0" - "jp\0" - "jpe\0" - "jpo\0" - "js\0" - "jz\0" - "jmp\0" - "lddqu\0" - "ldmxcsr\0" - "lahf\0" - "lea\0" - "leave\0" - "lfence\0" - "maskmovdqu\0" - "maskmovq\0" - "maxpd\0" - "maxps\0" - "maxsd\0" - "maxss\0" - "mfence\0" - "minpd\0" - "minps\0" - "minsd\0" - "minss\0" - "monitor\0" - "mov\0" - "movapd\0" - "movaps\0" - "movbe\0" - "movd\0" - "movddup\0" - "movdq2q\0" - "movdqa\0" - "movdqu\0" - "movhlps\0" - "movhpd\0" - "movhps\0" - "movlhps\0" - "movlpd\0" - "movlps\0" - "movmskpd\0" - "movmskps\0" - "movntdq\0" - "movntdqa\0" - "movnti\0" - "movntpd\0" - "movntps\0" - "movntq\0" - "movq\0" - "movq2dq\0" - "movsd\0" - "movshdup\0" - "movsldup\0" - "movss\0" - "movsx\0" - "movsxd\0" - "movupd\0" - "movups\0" - "movzx\0" - "mov_ptr\0" - "mpsadbw\0" - "mul\0" - "mulpd\0" - "mulps\0" - "mulsd\0" - "mulss\0" - "mwait\0" - "neg\0" - "nop\0" - "not\0" - "or\0" - "orpd\0" - "orps\0" - "pabsb\0" - "pabsd\0" - "pabsw\0" - "packssdw\0" - "packsswb\0" - "packusdw\0" - "packuswb\0" - "paddb\0" - "paddd\0" - "paddq\0" - "paddsb\0" - "paddsw\0" - "paddusb\0" - "paddusw\0" - "paddw\0" - "palignr\0" - "pand\0" - "pandn\0" - "pause\0" - "pavgb\0" - "pavgw\0" - "pblendvb\0" - "pblendw\0" - "pcmpeqb\0" - "pcmpeqd\0" - "pcmpeqq\0" - "pcmpeqw\0" - "pcmpestri\0" - "pcmpestrm\0" - "pcmpgtb\0" - "pcmpgtd\0" - "pcmpgtq\0" - "pcmpgtw\0" - "pcmpistri\0" - "pcmpistrm\0" - "pextrb\0" - "pextrd\0" - "pextrq\0" - "pextrw\0" - "pf2id\0" - "pf2iw\0" - "pfacc\0" - "pfadd\0" - "pfcmpeq\0" - "pfcmpge\0" - "pfcmpgt\0" - "pfmax\0" - "pfmin\0" - "pfmul\0" - "pfnacc\0" - "pfpnacc\0" - "pfrcp\0" - "pfrcpit1\0" - "pfrcpit2\0" - "pfrsqit1\0" - "pfrsqrt\0" - "pfsub\0" - "pfsubr\0" - "phaddd\0" - "phaddsw\0" - "phaddw\0" - "phminposuw\0" - "phsubd\0" - "phsubsw\0" - "phsubw\0" - "pi2fd\0" - "pi2fw\0" - "pinsrb\0" - "pinsrd\0" - "pinsrq\0" - "pinsrw\0" - "pmaddubsw\0" - "pmaddwd\0" - "pmaxsb\0" - "pmaxsd\0" - "pmaxsw\0" - "pmaxub\0" - "pmaxud\0" - "pmaxuw\0" - "pminsb\0" - "pminsd\0" - "pminsw\0" - "pminub\0" - "pminud\0" - "pminuw\0" - "pmovmskb\0" - "pmovsxbd\0" - "pmovsxbq\0" - "pmovsxbw\0" - "pmovsxdq\0" - "pmovsxwd\0" - "pmovsxwq\0" - "pmovzxbd\0" - "pmovzxbq\0" - "pmovzxbw\0" - "pmovzxdq\0" - "pmovzxwd\0" - "pmovzxwq\0" - "pmuldq\0" - "pmulhrsw\0" - "pmulhuw\0" - "pmulhw\0" - "pmulld\0" - "pmullw\0" - "pmuludq\0" - "pop\0" - "popad\0" - "popcnt\0" - "popfd\0" - "popfq\0" - "por\0" - "prefetch\0" - "psadbw\0" - "pshufb\0" - "pshufd\0" - "pshufw\0" - "pshufhw\0" - "pshuflw\0" - "psignb\0" - "psignd\0" - "psignw\0" - "pslld\0" - "pslldq\0" - "psllq\0" - "psllw\0" - "psrad\0" - "psraw\0" - "psrld\0" - "psrldq\0" - "psrlq\0" - "psrlw\0" - "psubb\0" - "psubd\0" - "psubq\0" - "psubsb\0" - "psubsw\0" - "psubusb\0" - "psubusw\0" - "psubw\0" - "pswapd\0" - "ptest\0" - "punpckhbw\0" - "punpckhdq\0" - "punpckhqdq\0" - "punpckhwd\0" - "punpcklbw\0" - "punpckldq\0" - "punpcklqdq\0" - "punpcklwd\0" - "push\0" - "pushad\0" - "pushfd\0" - "pushfq\0" - "pxor\0" - "rcl\0" - "rcpps\0" - "rcpss\0" - "rcr\0" - "rdtsc\0" - "rdtscp\0" - "rep lodsb\0" - "rep lodsd\0" - "rep lodsq\0" - "rep lodsw\0" - "rep movsb\0" - "rep movsd\0" - "rep movsq\0" - "rep movsw\0" - "rep stosb\0" - "rep stosd\0" - "rep stosq\0" - "rep stosw\0" - "repe cmpsb\0" - "repe cmpsd\0" - "repe cmpsq\0" - "repe cmpsw\0" - "repe scasb\0" - "repe scasd\0" - "repe scasq\0" - "repe scasw\0" - "repne cmpsb\0" - "repne cmpsd\0" - "repne cmpsq\0" - "repne cmpsw\0" - "repne scasb\0" - "repne scasd\0" - "repne scasq\0" - "repne scasw\0" - "ret\0" - "rol\0" - "ror\0" - "roundpd\0" - "roundps\0" - "roundsd\0" - "roundss\0" - "rsqrtps\0" - "rsqrtss\0" - "sahf\0" - "sal\0" - "sar\0" - "sbb\0" - "seta\0" - "setae\0" - "setb\0" - "setbe\0" - "setc\0" - "sete\0" - "setg\0" - "setge\0" - "setl\0" - "setle\0" - "setna\0" - "setnae\0" - "setnb\0" - "setnbe\0" - "setnc\0" - "setne\0" - "setng\0" - "setnge\0" - "setnl\0" - "setnle\0" - "setno\0" - "setnp\0" - "setns\0" - "setnz\0" - "seto\0" - "setp\0" - "setpe\0" - "setpo\0" - "sets\0" - "setz\0" - "sfence\0" - "shl\0" - "shld\0" - "shr\0" - "shrd\0" - "shufpd\0" - "shufps\0" - "sqrtpd\0" - "sqrtps\0" - "sqrtsd\0" - "sqrtss\0" - "stc\0" - "std\0" - "stmxcsr\0" - "sub\0" - "subpd\0" - "subps\0" - "subsd\0" - "subss\0" - "test\0" - "ucomisd\0" - "ucomiss\0" - "ud2\0" - "unpckhpd\0" - "unpckhps\0" - "unpcklpd\0" - "unpcklps\0" - "xadd\0" - "xchg\0" - "xor\0" - "xorpd\0" - "xorps\0" - ; + "\0" + "adc\0" + "add\0" + "addpd\0" + "addps\0" + "addsd\0" + "addss\0" + "addsubpd\0" + "addsubps\0" + "amd_prefetch\0" + "amd_prefetchw\0" + "and\0" + "andnpd\0" + "andnps\0" + "andpd\0" + "andps\0" + "blendpd\0" + "blendps\0" + "blendvpd\0" + "blendvps\0" + "bsf\0" + "bsr\0" + "bswap\0" + "bt\0" + "btc\0" + "btr\0" + "bts\0" + "call\0" + "cbw\0" + "cdq\0" + "cdqe\0" + "clc\0" + "cld\0" + "clflush\0" + "cmc\0" + "cmova\0" + "cmovae\0" + "cmovb\0" + "cmovbe\0" + "cmovc\0" + "cmove\0" + "cmovg\0" + "cmovge\0" + "cmovl\0" + "cmovle\0" + "cmovna\0" + "cmovnae\0" + "cmovnb\0" + "cmovnbe\0" + "cmovnc\0" + "cmovne\0" + "cmovng\0" + "cmovnge\0" + "cmovnl\0" + "cmovnle\0" + "cmovno\0" + "cmovnp\0" + "cmovns\0" + "cmovnz\0" + "cmovo\0" + "cmovp\0" + "cmovpe\0" + "cmovpo\0" + "cmovs\0" + "cmovz\0" + "cmp\0" + "cmppd\0" + "cmpps\0" + "cmpsd\0" + "cmpss\0" + "cmpxchg\0" + "cmpxchg16b\0" + "cmpxchg8b\0" + "comisd\0" + "comiss\0" + "cpuid\0" + "cqo\0" + "crc32\0" + "cvtdq2pd\0" + "cvtdq2ps\0" + "cvtpd2dq\0" + "cvtpd2pi\0" + "cvtpd2ps\0" + "cvtpi2pd\0" + "cvtpi2ps\0" + "cvtps2dq\0" + "cvtps2pd\0" + "cvtps2pi\0" + "cvtsd2si\0" + "cvtsd2ss\0" + "cvtsi2sd\0" + "cvtsi2ss\0" + "cvtss2sd\0" + "cvtss2si\0" + "cvttpd2dq\0" + "cvttpd2pi\0" + "cvttps2dq\0" + "cvttps2pi\0" + "cvttsd2si\0" + "cvttss2si\0" + "cwd\0" + "cwde\0" + "daa\0" + "das\0" + "dec\0" + "div\0" + "divpd\0" + "divps\0" + "divsd\0" + "divss\0" + "dppd\0" + "dpps\0" + "emms\0" + "enter\0" + "extractps\0" + "f2xm1\0" + "fabs\0" + "fadd\0" + "faddp\0" + "fbld\0" + "fbstp\0" + "fchs\0" + "fclex\0" + "fcmovb\0" + "fcmovbe\0" + "fcmove\0" + "fcmovnb\0" + "fcmovnbe\0" + "fcmovne\0" + "fcmovnu\0" + "fcmovu\0" + "fcom\0" + "fcomi\0" + "fcomip\0" + "fcomp\0" + "fcompp\0" + "fcos\0" + "fdecstp\0" + "fdiv\0" + "fdivp\0" + "fdivr\0" + "fdivrp\0" + "femms\0" + "ffree\0" + "fiadd\0" + "ficom\0" + "ficomp\0" + "fidiv\0" + "fidivr\0" + "fild\0" + "fimul\0" + "fincstp\0" + "finit\0" + "fist\0" + "fistp\0" + "fisttp\0" + "fisub\0" + "fisubr\0" + "fld\0" + "fld1\0" + "fldcw\0" + "fldenv\0" + "fldl2e\0" + "fldl2t\0" + "fldlg2\0" + "fldln2\0" + "fldpi\0" + "fldz\0" + "fmul\0" + "fmulp\0" + "fnclex\0" + "fninit\0" + "fnop\0" + "fnsave\0" + "fnstcw\0" + "fnstenv\0" + "fnstsw\0" + "fpatan\0" + "fprem\0" + "fprem1\0" + "fptan\0" + "frndint\0" + "frstor\0" + "fsave\0" + "fscale\0" + "fsin\0" + "fsincos\0" + "fsqrt\0" + "fst\0" + "fstcw\0" + "fstenv\0" + "fstp\0" + "fstsw\0" + "fsub\0" + "fsubp\0" + "fsubr\0" + "fsubrp\0" + "ftst\0" + "fucom\0" + "fucomi\0" + "fucomip\0" + "fucomp\0" + "fucompp\0" + "fwait\0" + "fxam\0" + "fxch\0" + "fxrstor\0" + "fxsave\0" + "fxtract\0" + "fyl2x\0" + "fyl2xp1\0" + "haddpd\0" + "haddps\0" + "hsubpd\0" + "hsubps\0" + "idiv\0" + "imul\0" + "inc\0" + "int3\0" + "ja\0" + "jae\0" + "jb\0" + "jbe\0" + "jc\0" + "je\0" + "jg\0" + "jge\0" + "jl\0" + "jle\0" + "jna\0" + "jnae\0" + "jnb\0" + "jnbe\0" + "jnc\0" + "jne\0" + "jng\0" + "jnge\0" + "jnl\0" + "jnle\0" + "jno\0" + "jnp\0" + "jns\0" + "jnz\0" + "jo\0" + "jp\0" + "jpe\0" + "jpo\0" + "js\0" + "jz\0" + "jmp\0" + "lddqu\0" + "ldmxcsr\0" + "lahf\0" + "lea\0" + "leave\0" + "lfence\0" + "maskmovdqu\0" + "maskmovq\0" + "maxpd\0" + "maxps\0" + "maxsd\0" + "maxss\0" + "mfence\0" + "minpd\0" + "minps\0" + "minsd\0" + "minss\0" + "monitor\0" + "mov\0" + "movapd\0" + "movaps\0" + "movbe\0" + "movd\0" + "movddup\0" + "movdq2q\0" + "movdqa\0" + "movdqu\0" + "movhlps\0" + "movhpd\0" + "movhps\0" + "movlhps\0" + "movlpd\0" + "movlps\0" + "movmskpd\0" + "movmskps\0" + "movntdq\0" + "movntdqa\0" + "movnti\0" + "movntpd\0" + "movntps\0" + "movntq\0" + "movq\0" + "movq2dq\0" + "movsd\0" + "movshdup\0" + "movsldup\0" + "movss\0" + "movsx\0" + "movsxd\0" + "movupd\0" + "movups\0" + "movzx\0" + "mov_ptr\0" + "mpsadbw\0" + "mul\0" + "mulpd\0" + "mulps\0" + "mulsd\0" + "mulss\0" + "mwait\0" + "neg\0" + "nop\0" + "not\0" + "or\0" + "orpd\0" + "orps\0" + "pabsb\0" + "pabsd\0" + "pabsw\0" + "packssdw\0" + "packsswb\0" + "packusdw\0" + "packuswb\0" + "paddb\0" + "paddd\0" + "paddq\0" + "paddsb\0" + "paddsw\0" + "paddusb\0" + "paddusw\0" + "paddw\0" + "palignr\0" + "pand\0" + "pandn\0" + "pause\0" + "pavgb\0" + "pavgw\0" + "pblendvb\0" + "pblendw\0" + "pcmpeqb\0" + "pcmpeqd\0" + "pcmpeqq\0" + "pcmpeqw\0" + "pcmpestri\0" + "pcmpestrm\0" + "pcmpgtb\0" + "pcmpgtd\0" + "pcmpgtq\0" + "pcmpgtw\0" + "pcmpistri\0" + "pcmpistrm\0" + "pextrb\0" + "pextrd\0" + "pextrq\0" + "pextrw\0" + "pf2id\0" + "pf2iw\0" + "pfacc\0" + "pfadd\0" + "pfcmpeq\0" + "pfcmpge\0" + "pfcmpgt\0" + "pfmax\0" + "pfmin\0" + "pfmul\0" + "pfnacc\0" + "pfpnacc\0" + "pfrcp\0" + "pfrcpit1\0" + "pfrcpit2\0" + "pfrsqit1\0" + "pfrsqrt\0" + "pfsub\0" + "pfsubr\0" + "phaddd\0" + "phaddsw\0" + "phaddw\0" + "phminposuw\0" + "phsubd\0" + "phsubsw\0" + "phsubw\0" + "pi2fd\0" + "pi2fw\0" + "pinsrb\0" + "pinsrd\0" + "pinsrq\0" + "pinsrw\0" + "pmaddubsw\0" + "pmaddwd\0" + "pmaxsb\0" + "pmaxsd\0" + "pmaxsw\0" + "pmaxub\0" + "pmaxud\0" + "pmaxuw\0" + "pminsb\0" + "pminsd\0" + "pminsw\0" + "pminub\0" + "pminud\0" + "pminuw\0" + "pmovmskb\0" + "pmovsxbd\0" + "pmovsxbq\0" + "pmovsxbw\0" + "pmovsxdq\0" + "pmovsxwd\0" + "pmovsxwq\0" + "pmovzxbd\0" + "pmovzxbq\0" + "pmovzxbw\0" + "pmovzxdq\0" + "pmovzxwd\0" + "pmovzxwq\0" + "pmuldq\0" + "pmulhrsw\0" + "pmulhuw\0" + "pmulhw\0" + "pmulld\0" + "pmullw\0" + "pmuludq\0" + "pop\0" + "popad\0" + "popcnt\0" + "popfd\0" + "popfq\0" + "por\0" + "prefetch\0" + "psadbw\0" + "pshufb\0" + "pshufd\0" + "pshufw\0" + "pshufhw\0" + "pshuflw\0" + "psignb\0" + "psignd\0" + "psignw\0" + "pslld\0" + "pslldq\0" + "psllq\0" + "psllw\0" + "psrad\0" + "psraw\0" + "psrld\0" + "psrldq\0" + "psrlq\0" + "psrlw\0" + "psubb\0" + "psubd\0" + "psubq\0" + "psubsb\0" + "psubsw\0" + "psubusb\0" + "psubusw\0" + "psubw\0" + "pswapd\0" + "ptest\0" + "punpckhbw\0" + "punpckhdq\0" + "punpckhqdq\0" + "punpckhwd\0" + "punpcklbw\0" + "punpckldq\0" + "punpcklqdq\0" + "punpcklwd\0" + "push\0" + "pushad\0" + "pushfd\0" + "pushfq\0" + "pxor\0" + "rcl\0" + "rcpps\0" + "rcpss\0" + "rcr\0" + "rdtsc\0" + "rdtscp\0" + "rep lodsb\0" + "rep lodsd\0" + "rep lodsq\0" + "rep lodsw\0" + "rep movsb\0" + "rep movsd\0" + "rep movsq\0" + "rep movsw\0" + "rep stosb\0" + "rep stosd\0" + "rep stosq\0" + "rep stosw\0" + "repe cmpsb\0" + "repe cmpsd\0" + "repe cmpsq\0" + "repe cmpsw\0" + "repe scasb\0" + "repe scasd\0" + "repe scasq\0" + "repe scasw\0" + "repne cmpsb\0" + "repne cmpsd\0" + "repne cmpsq\0" + "repne cmpsw\0" + "repne scasb\0" + "repne scasd\0" + "repne scasq\0" + "repne scasw\0" + "ret\0" + "rol\0" + "ror\0" + "roundpd\0" + "roundps\0" + "roundsd\0" + "roundss\0" + "rsqrtps\0" + "rsqrtss\0" + "sahf\0" + "sal\0" + "sar\0" + "sbb\0" + "seta\0" + "setae\0" + "setb\0" + "setbe\0" + "setc\0" + "sete\0" + "setg\0" + "setge\0" + "setl\0" + "setle\0" + "setna\0" + "setnae\0" + "setnb\0" + "setnbe\0" + "setnc\0" + "setne\0" + "setng\0" + "setnge\0" + "setnl\0" + "setnle\0" + "setno\0" + "setnp\0" + "setns\0" + "setnz\0" + "seto\0" + "setp\0" + "setpe\0" + "setpo\0" + "sets\0" + "setz\0" + "sfence\0" + "shl\0" + "shld\0" + "shr\0" + "shrd\0" + "shufpd\0" + "shufps\0" + "sqrtpd\0" + "sqrtps\0" + "sqrtsd\0" + "sqrtss\0" + "stc\0" + "std\0" + "stmxcsr\0" + "sub\0" + "subpd\0" + "subps\0" + "subsd\0" + "subss\0" + "test\0" + "ucomisd\0" + "ucomiss\0" + "ud2\0" + "unpckhpd\0" + "unpckhps\0" + "unpcklpd\0" + "unpcklps\0" + "xadd\0" + "xchg\0" + "xor\0" + "xorpd\0" + "xorps\0"; #define INDEX_kInstNone 0 #define INDEX_kX86InstAdc 1 @@ -1190,7 +1190,7 @@ // ============================================================================ #define INST(_Code_, _Name_, _Group_, _Flags_, _OpFlags0_, _OpFlags1_, _OpReg_, _OpCode0_, _OpCode1_) \ - { _Code_, INDEX_##_Code_, _Group_, _Flags_, { _OpFlags0_, _OpFlags1_ }, _OpReg_, { _OpCode0_, _OpCode1_ } } + { _Code_, INDEX_##_Code_, _Group_, _Flags_, { _OpFlags0_, _OpFlags1_ }, _OpReg_, { _OpCode0_, _OpCode1_ } } #define G(_Group_) kX86InstGroup##_Group_ #define F(_Flags_) kX86InstFlag##_Flags_ @@ -1198,586 +1198,586 @@ const X86InstInfo x86InstInfo[] = { - // Instruction code | Instruction name | Instruction group| Instruction flags| Operand flags[0] | Operand flags[1] | r| opCode[0] | opcode[1] - INST(kInstNone , "" , G(None) , F(None) , 0 , 0 , 0, 0 , 0), - INST(kX86InstAdc , "adc" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 2, 0x00000010, 0x00000080), - INST(kX86InstAdd , "add" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 0, 0x00000000, 0x00000080), - INST(kX86InstAddPD , "addpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F58, 0), - INST(kX86InstAddPS , "addps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F58, 0), - INST(kX86InstAddSD , "addsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F58, 0), - INST(kX86InstAddSS , "addss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F58, 0), - INST(kX86InstAddSubPD , "addsubpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000FD0, 0), - INST(kX86InstAddSubPS , "addsubps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000FD0, 0), - INST(kX86InstAmdPrefetch , "amd_prefetch" , G(Mem) , F(None) , O(Mem) , 0 , 0, 0x00000F0D, 0), - INST(kX86InstAmdPrefetchW , "amd_prefetchw" , G(Mem) , F(None) , O(Mem) , 0 , 1, 0x00000F0D, 0), - INST(kX86InstAnd , "and" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 4, 0x00000020, 0x00000080), - INST(kX86InstAndnPD , "andnpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F55, 0), - INST(kX86InstAndnPS , "andnps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F55, 0), - INST(kX86InstAndPD , "andpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F54, 0), - INST(kX86InstAndPS , "andps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F54, 0), - INST(kX86InstBlendPD , "blendpd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0D, 0), - INST(kX86InstBlendPS , "blendps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0C, 0), - INST(kX86InstBlendVPD , "blendvpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3815, 0), - INST(kX86InstBlendVPS , "blendvps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3814, 0), - INST(kX86InstBsf , "bsf" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000FBC, 0), - INST(kX86InstBsr , "bsr" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000FBD, 0), - INST(kX86InstBSwap , "bswap" , G(BSwap) , F(None) , O(Gqd) , 0 , 0, 0 , 0), - INST(kX86InstBt , "bt" , G(BTest) , F(None) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 4, 0x00000FA3, 0x00000FBA), - INST(kX86InstBtc , "btc" , G(BTest) , F(Lockable) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 7, 0x00000FBB, 0x00000FBA), - INST(kX86InstBtr , "btr" , G(BTest) , F(Lockable) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 6, 0x00000FB3, 0x00000FBA), - INST(kX86InstBts , "bts" , G(BTest) , F(Lockable) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 5, 0x00000FAB, 0x00000FBA), - INST(kX86InstCall , "call" , G(Call) , F(Jump) , O(Gqd) |O(Mem) , 0 , 0, 0 , 0), - INST(kX86InstCbw , "cbw" , G(Emit) , F(Special) , 0 , 0 , 0, 0x66000098, 0), - INST(kX86InstCdq , "cdq" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000099, 0), - INST(kX86InstCdqe , "cdqe" , G(Emit) , F(Special) , 0 , 0 , 0, 0x48000098, 0), - INST(kX86InstClc , "clc" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000F8, 0), - INST(kX86InstCld , "cld" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000FC, 0), - INST(kX86InstClFlush , "clflush" , G(Mem) , F(None) , O(Mem) , 0 , 7, 0x00000FAE, 0), - INST(kX86InstCmc , "cmc" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000F5, 0), - INST(kX86InstCMovA , "cmova" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F47, 0), - INST(kX86InstCMovAE , "cmovae" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F43, 0), - INST(kX86InstCMovB , "cmovb" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F42, 0), - INST(kX86InstCMovBE , "cmovbe" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F46, 0), - INST(kX86InstCMovC , "cmovc" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F42, 0), - INST(kX86InstCMovE , "cmove" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F44, 0), - INST(kX86InstCMovG , "cmovg" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4F, 0), - INST(kX86InstCMovGE , "cmovge" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4D, 0), - INST(kX86InstCMovL , "cmovl" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4C, 0), - INST(kX86InstCMovLE , "cmovle" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4E, 0), - INST(kX86InstCMovNA , "cmovna" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F46, 0), - INST(kX86InstCMovNAE , "cmovnae" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F42, 0), - INST(kX86InstCMovNB , "cmovnb" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F43, 0), - INST(kX86InstCMovNBE , "cmovnbe" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F47, 0), - INST(kX86InstCMovNC , "cmovnc" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F43, 0), - INST(kX86InstCMovNE , "cmovne" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F45, 0), - INST(kX86InstCMovNG , "cmovng" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4E, 0), - INST(kX86InstCMovNGE , "cmovnge" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4C, 0), - INST(kX86InstCMovNL , "cmovnl" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4D, 0), - INST(kX86InstCMovNLE , "cmovnle" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4F, 0), - INST(kX86InstCMovNO , "cmovno" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F41, 0), - INST(kX86InstCMovNP , "cmovnp" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4B, 0), - INST(kX86InstCMovNS , "cmovns" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F49, 0), - INST(kX86InstCMovNZ , "cmovnz" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F45, 0), - INST(kX86InstCMovO , "cmovo" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F40, 0), - INST(kX86InstCMovP , "cmovp" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4A, 0), - INST(kX86InstCMovPE , "cmovpe" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4A, 0), - INST(kX86InstCMovPO , "cmovpo" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4B, 0), - INST(kX86InstCMovS , "cmovs" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F48, 0), - INST(kX86InstCMovZ , "cmovz" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F44, 0), - INST(kX86InstCmp , "cmp" , G(Arith) , F(None) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 7, 0x00000038, 0x00000080), - INST(kX86InstCmpPD , "cmppd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000FC2, 0), - INST(kX86InstCmpPS , "cmpps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000FC2, 0), - INST(kX86InstCmpSD , "cmpsd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000FC2, 0), - INST(kX86InstCmpSS , "cmpss" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000FC2, 0), - INST(kX86InstCmpXCHG , "cmpxchg" , G(RmReg) , F(Special)|F(Lockable), 0 , 0 , 0, 0x00000FB0, 0), - INST(kX86InstCmpXCHG16B , "cmpxchg16b" , G(Mem) , F(Special) , O(Mem) , 0 , 1, 0x00000FC7, 1 /* RexW */), - INST(kX86InstCmpXCHG8B , "cmpxchg8b" , G(Mem) , F(Special) , O(Mem) , 0 , 1, 0x00000FC7, 0), - INST(kX86InstComISD , "comisd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F2F, 0), - INST(kX86InstComISS , "comiss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F2F, 0), - INST(kX86InstCpuId , "cpuid" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000FA2, 0), - INST(kX86InstCqo , "cqo" , G(Emit) , F(Special) , 0 , 0 , 0, 0x48000099, 0), // TODO, set RexW bit instead? - INST(kX86InstCrc32 , "crc32" , G(Crc32) , F(None) , O(Gqd) , O(GqdwbMem) , 0, 0xF20F38F0, 0), - INST(kX86InstCvtDQ2PD , "cvtdq2pd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000FE6, 0), - INST(kX86InstCvtDQ2PS , "cvtdq2ps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F5B, 0), - INST(kX86InstCvtPD2DQ , "cvtpd2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF2000FE6, 0), - INST(kX86InstCvtPD2PI , "cvtpd2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x66000F2D, 0), - INST(kX86InstCvtPD2PS , "cvtpd2ps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F5A, 0), - INST(kX86InstCvtPI2PD , "cvtpi2pd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(MmMem) , 0, 0x66000F2A, 0), - INST(kX86InstCvtPI2PS , "cvtpi2ps" , G(MmuRmI) , F(None) , O(Xmm) , O(MmMem) , 0, 0x00000F2A, 0), - INST(kX86InstCvtPS2DQ , "cvtps2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F5B, 0), - INST(kX86InstCvtPS2PD , "cvtps2pd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F5A, 0), - INST(kX86InstCvtPS2PI , "cvtps2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x00000F2D, 0), - INST(kX86InstCvtSD2SI , "cvtsd2si" , G(MmuRmI) , F(Mov) , O(Gqd) , O(XmmMem) , 0, 0xF2000F2D, 0), - INST(kX86InstCvtSD2SS , "cvtsd2ss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5A, 0), - INST(kX86InstCvtSI2SD , "cvtsi2sd" , G(MmuRmI) , F(None) , O(Xmm) , O(Gqd)|O(Mem) , 0, 0xF2000F2A, 0), - INST(kX86InstCvtSI2SS , "cvtsi2ss" , G(MmuRmI) , F(None) , O(Xmm) , O(Gqd)|O(Mem) , 0, 0xF3000F2A, 0), - INST(kX86InstCvtSS2SD , "cvtss2sd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5A, 0), - INST(kX86InstCvtSS2SI , "cvtss2si" , G(MmuRmI) , F(None) , O(Gqd) , O(XmmMem) , 0, 0xF3000F2D, 0), - INST(kX86InstCvttPD2DQ , "cvttpd2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000FE6, 0), - INST(kX86InstCvttPD2PI , "cvttpd2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x66000F2C, 0), - INST(kX86InstCvttPS2DQ , "cvttps2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5B, 0), - INST(kX86InstCvttPS2PI , "cvttps2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x00000F2C, 0), - INST(kX86InstCvttSD2SI , "cvttsd2si" , G(MmuRmI) , F(None) , O(Gqd) , O(XmmMem) , 0, 0xF2000F2C, 0), - INST(kX86InstCvttSS2SI , "cvttss2si" , G(MmuRmI) , F(None) , O(Gqd) , O(XmmMem) , 0, 0xF3000F2C, 0), - INST(kX86InstCwd , "cwd" , G(Emit) , F(Special) , 0 , 0 , 0, 0x66000099, 0), - INST(kX86InstCwde , "cwde" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000098, 0), - INST(kX86InstDaa , "daa" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000027, 0), - INST(kX86InstDas , "das" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000002F, 0), - INST(kX86InstDec , "dec" , G(IncDec) , F(Lockable) , O(GqdwbMem) , 0 , 1, 0x00000048, 0x000000FE), - INST(kX86InstDiv , "div" , G(Rm) , F(Special) , 0 , 0 , 6, 0x000000F6, 0), - INST(kX86InstDivPD , "divpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5E, 0), - INST(kX86InstDivPS , "divps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5E, 0), - INST(kX86InstDivSD , "divsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5E, 0), - INST(kX86InstDivSS , "divss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5E, 0), - INST(kX86InstDpPD , "dppd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A41, 0), - INST(kX86InstDpPS , "dpps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A40, 0), - INST(kX86InstEmms , "emms" , G(Emit) , F(None) , 0 , 0 , 0, 0x00000F77, 0), - INST(kX86InstEnter , "enter" , G(Enter) , F(Special) , 0 , 0 , 0, 0x000000C8, 0), - INST(kX86InstExtractPS , "extractps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A17, 0), - INST(kX86InstF2XM1 , "f2xm1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F0, 0), - INST(kX86InstFAbs , "fabs" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E1, 0), - INST(kX86InstFAdd , "fadd" , G(X87StM) , F(Fpu) , 0 , 0 , 0, 0xD8DCC0C0, 0), - INST(kX86InstFAddP , "faddp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEC0, 0), - INST(kX86InstFBLd , "fbld" , G(Mem) , F(Fpu) , O(Mem) , 0 , 4, 0x000000DF, 0), - INST(kX86InstFBStP , "fbstp" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x000000DF, 0), - INST(kX86InstFCHS , "fchs" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E0, 0), - INST(kX86InstFClex , "fclex" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x9B00DBE2, 0), - INST(kX86InstFCMovB , "fcmovb" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAC0, 0), - INST(kX86InstFCMovBE , "fcmovbe" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAD0, 0), - INST(kX86InstFCMovE , "fcmove" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAC8, 0), - INST(kX86InstFCMovNB , "fcmovnb" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBC0, 0), - INST(kX86InstFCMovNBE , "fcmovnbe" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBD0, 0), - INST(kX86InstFCMovNE , "fcmovne" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBC8, 0), - INST(kX86InstFCMovNU , "fcmovnu" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBD8, 0), - INST(kX86InstFCMovU , "fcmovu" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAD8, 0), - INST(kX86InstFCom , "fcom" , G(X87StM) , F(Fpu) , 0 , 0 , 2, 0xD8DCD0D0, 0), - INST(kX86InstFComI , "fcomi" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBF0, 0), - INST(kX86InstFComIP , "fcomip" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DFF0, 0), - INST(kX86InstFComP , "fcomp" , G(X87StM) , F(Fpu) , 0 , 0 , 3, 0xD8DCD8D8, 0), - INST(kX86InstFComPP , "fcompp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DED9, 0), - INST(kX86InstFCos , "fcos" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FF, 0), - INST(kX86InstFDecStP , "fdecstp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F6, 0), - INST(kX86InstFDiv , "fdiv" , G(X87StM) , F(Fpu) , 0 , 0 , 6, 0xD8DCF0F8, 0), - INST(kX86InstFDivP , "fdivp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEF8, 0), - INST(kX86InstFDivR , "fdivr" , G(X87StM) , F(Fpu) , 0 , 0 , 7, 0xD8DCF8F0, 0), - INST(kX86InstFDivRP , "fdivrp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEF0, 0), - INST(kX86InstFEmms , "femms" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x00000F0E, 0), - INST(kX86InstFFree , "ffree" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DDC0, 0), - INST(kX86InstFIAdd , "fiadd" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 0, 0xDEDA0000, 0), - INST(kX86InstFICom , "ficom" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 2, 0xDEDA0000, 0), - INST(kX86InstFIComP , "ficomp" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 3, 0xDEDA0000, 0), - INST(kX86InstFIDiv , "fidiv" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 6, 0xDEDA0000, 0), - INST(kX86InstFIDivR , "fidivr" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 7, 0xDEDA0000, 0), - INST(kX86InstFILd , "fild" , G(X87Mem) , F(Fpu) , O(StM2_4_8) , 0 , 0, 0xDFDBDF05, 0), - INST(kX86InstFIMul , "fimul" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 1, 0xDEDA0000, 0), - INST(kX86InstFIncStP , "fincstp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F7, 0), - INST(kX86InstFInit , "finit" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x9B00DBE3, 0), - INST(kX86InstFISt , "fist" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 2, 0xDFDB0000, 0), - INST(kX86InstFIStP , "fistp" , G(X87Mem) , F(Fpu) , O(StM2_4_8) , 0 , 3, 0xDFDBDF07, 0), - INST(kX86InstFISttP , "fisttp" , G(X87Mem) , F(Fpu) , O(StM2_4_8) , 0 , 1, 0xDFDBDD01, 0), - INST(kX86InstFISub , "fisub" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 4, 0xDEDA0000, 0), - INST(kX86InstFISubR , "fisubr" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 5, 0xDEDA0000, 0), - INST(kX86InstFLd , "fld" , G(X87FldFst) , F(Fpu) , O(StM4_8_10) , 0 , 0, 0x00D9DD00, 0xD9C0DB05), - INST(kX86InstFLd1 , "fld1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E8, 0), - INST(kX86InstFLdCw , "fldcw" , G(Mem) , F(Fpu) , O(Mem) , 0 , 5, 0x000000D9, 0), - INST(kX86InstFLdEnv , "fldenv" , G(Mem) , F(Fpu) , O(Mem) , 0 , 4, 0x000000D9, 0), - INST(kX86InstFLdL2E , "fldl2e" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EA, 0), - INST(kX86InstFLdL2T , "fldl2t" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E9, 0), - INST(kX86InstFLdLg2 , "fldlg2" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EC, 0), - INST(kX86InstFLdLn2 , "fldln2" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9ED, 0), - INST(kX86InstFLdPi , "fldpi" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EB, 0), - INST(kX86InstFLdZ , "fldz" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EE, 0), - INST(kX86InstFMul , "fmul" , G(X87StM) , F(Fpu) , 0 , 0 , 1, 0xD8DCC8C8, 0), - INST(kX86InstFMulP , "fmulp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEC8, 0), - INST(kX86InstFNClex , "fnclex" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DBE2, 0), - INST(kX86InstFNInit , "fninit" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DBE3, 0), - INST(kX86InstFNop , "fnop" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9D0, 0), - INST(kX86InstFNSave , "fnsave" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x000000DD, 0), - INST(kX86InstFNStCw , "fnstcw" , G(Mem) , F(Fpu) , O(Mem) , 0 , 7, 0x000000D9, 0), - INST(kX86InstFNStEnv , "fnstenv" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x000000D9, 0), - INST(kX86InstFNStSw , "fnstsw" , G(X87Status) , F(Fpu) , O(Mem) , 0 , 7, 0x000000DD, 0x0000DFE0), - INST(kX86InstFPAtan , "fpatan" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F3, 0), - INST(kX86InstFPRem , "fprem" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F8, 0), - INST(kX86InstFPRem1 , "fprem1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F5, 0), - INST(kX86InstFPTan , "fptan" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F2, 0), - INST(kX86InstFRndInt , "frndint" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FC, 0), - INST(kX86InstFRstor , "frstor" , G(Mem) , F(Fpu) , O(Mem) , 0 , 4, 0x000000DD, 0), - INST(kX86InstFSave , "fsave" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x9B0000DD, 0), - INST(kX86InstFScale , "fscale" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FD, 0), - INST(kX86InstFSin , "fsin" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FE, 0), - INST(kX86InstFSinCos , "fsincos" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FB, 0), - INST(kX86InstFSqrt , "fsqrt" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FA, 0), - INST(kX86InstFSt , "fst" , G(X87FldFst) , F(Fpu) , O(StM4_8) , 0 , 2, 0x00D9DD02, 0xDDD00000), - INST(kX86InstFStCw , "fstcw" , G(Mem) , F(Fpu) , O(Mem) , 0 , 7, 0x9B0000D9, 0), - INST(kX86InstFStEnv , "fstenv" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x9B0000D9, 0), - INST(kX86InstFStP , "fstp" , G(X87FldFst) , F(Fpu) , O(StM4_8_10) , 0 , 3, 0x00D9DD03, 0xDDD8DB07), - INST(kX86InstFStSw , "fstsw" , G(X87Status) , F(Fpu) , O(Mem) , 0 , 7, 0x9B0000DD, 0x9B00DFE0), - INST(kX86InstFSub , "fsub" , G(X87StM) , F(Fpu) , 0 , 0 , 4, 0xD8DCE0E8, 0), - INST(kX86InstFSubP , "fsubp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEE8, 0), - INST(kX86InstFSubR , "fsubr" , G(X87StM) , F(Fpu) , 0 , 0 , 5, 0xD8DCE8E0, 0), - INST(kX86InstFSubRP , "fsubrp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEE0, 0), - INST(kX86InstFTst , "ftst" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E4, 0), - INST(kX86InstFUCom , "fucom" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DDE0, 0), - INST(kX86InstFUComI , "fucomi" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBE8, 0), - INST(kX86InstFUComIP , "fucomip" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DFE8, 0), - INST(kX86InstFUComP , "fucomp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DDE8, 0), - INST(kX86InstFUComPP , "fucompp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DAE9, 0), - INST(kX86InstFWait , "fwait" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x000000DB, 0), - INST(kX86InstFXam , "fxam" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E5, 0), - INST(kX86InstFXch , "fxch" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000D9C8, 0), - INST(kX86InstFXRstor , "fxrstor" , G(Mem) , F(Fpu) , 0 , 0 , 1, 0x00000FAE, 0), - INST(kX86InstFXSave , "fxsave" , G(Mem) , F(Fpu) , 0 , 0 , 0, 0x00000FAE, 0), - INST(kX86InstFXtract , "fxtract" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F4, 0), - INST(kX86InstFYL2X , "fyl2x" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F1, 0), - INST(kX86InstFYL2XP1 , "fyl2xp1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F9, 0), - INST(kX86InstHAddPD , "haddpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F7C, 0), - INST(kX86InstHAddPS , "haddps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F7C, 0), - INST(kX86InstHSubPD , "hsubpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F7D, 0), - INST(kX86InstHSubPS , "hsubps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F7D, 0), - INST(kX86InstIDiv , "idiv" , G(Rm) , F(Special) , 0 , 0 , 7, 0x000000F6, 0), - INST(kX86InstIMul , "imul" , G(IMul) , F(Special) , 0 , 0 , 0, 0 , 0), - INST(kX86InstInc , "inc" , G(IncDec) , F(Lockable) , O(GqdwbMem) , 0 , 0, 0x00000040, 0x000000FE), - INST(kX86InstInt3 , "int3" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000CC, 0), - INST(kX86InstJA , "ja" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x7 , 0), - INST(kX86InstJAE , "jae" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x3 , 0), - INST(kX86InstJB , "jb" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x2 , 0), - INST(kX86InstJBE , "jbe" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x6 , 0), - INST(kX86InstJC , "jc" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x2 , 0), - INST(kX86InstJE , "je" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x4 , 0), - INST(kX86InstJG , "jg" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xF , 0), - INST(kX86InstJGE , "jge" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xD , 0), - INST(kX86InstJL , "jl" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xC , 0), - INST(kX86InstJLE , "jle" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xE , 0), - INST(kX86InstJNA , "jna" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x6 , 0), - INST(kX86InstJNAE , "jnae" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x2 , 0), - INST(kX86InstJNB , "jnb" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x3 , 0), - INST(kX86InstJNBE , "jnbe" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x7 , 0), - INST(kX86InstJNC , "jnc" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x3 , 0), - INST(kX86InstJNE , "jne" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x5 , 0), - INST(kX86InstJNG , "jng" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xE , 0), - INST(kX86InstJNGE , "jnge" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xC , 0), - INST(kX86InstJNL , "jnl" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xD , 0), - INST(kX86InstJNLE , "jnle" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xF , 0), - INST(kX86InstJNO , "jno" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x1 , 0), - INST(kX86InstJNP , "jnp" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xB , 0), - INST(kX86InstJNS , "jns" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x9 , 0), - INST(kX86InstJNZ , "jnz" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x5 , 0), - INST(kX86InstJO , "jo" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x0 , 0), - INST(kX86InstJP , "jp" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xA , 0), - INST(kX86InstJPE , "jpe" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xA , 0), - INST(kX86InstJPO , "jpo" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xB , 0), - INST(kX86InstJS , "js" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x8 , 0), - INST(kX86InstJZ , "jz" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x4 , 0), - INST(kX86InstJmp , "jmp" , G(Jmp) , F(Jump) , 0 , 0 , 0, 0 , 0), - INST(kX86InstLdDQU , "lddqu" , G(MmuRmI) , F(None) , O(Xmm) , O(Mem) , 0, 0xF2000FF0, 0), - INST(kX86InstLdMXCSR , "ldmxcsr" , G(Mem) , F(None) , O(Mem) , 0 , 2, 0x00000FAE, 0), - INST(kX86InstLahf , "lahf" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009F, 0), - INST(kX86InstLea , "lea" , G(Lea) , F(None) , O(Gqd) , O(Mem) , 0, 0 , 0), - INST(kX86InstLeave , "leave" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000000C9, 0), - INST(kX86InstLFence , "lfence" , G(Emit) , F(None) , 0 , 0 , 0, 0x000FAEE8, 0), - INST(kX86InstMaskMovDQU , "maskmovdqu" , G(MmuRmI) , F(Special) , O(Xmm) , O(Xmm) , 0, 0x66000F57, 0), - INST(kX86InstMaskMovQ , "maskmovq" , G(MmuRmI) , F(Special) , O(Mm) , O(Mm) , 0, 0x00000FF7, 0), - INST(kX86InstMaxPD , "maxpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5F, 0), - INST(kX86InstMaxPS , "maxps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5F, 0), - INST(kX86InstMaxSD , "maxsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5F, 0), - INST(kX86InstMaxSS , "maxss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5F, 0), - INST(kX86InstMFence , "mfence" , G(Emit) , F(None) , 0 , 0 , 0, 0x000FAEF0, 0), - INST(kX86InstMinPD , "minpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5D, 0), - INST(kX86InstMinPS , "minps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5D, 0), - INST(kX86InstMinSD , "minsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5D, 0), - INST(kX86InstMinSS , "minss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5D, 0), - INST(kX86InstMonitor , "monitor" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000F01C8, 0), - INST(kX86InstMov , "mov" , G(Mov) , F(Mov) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 0, 0 , 0), - INST(kX86InstMovAPD , "movapd" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x66000F28, 0x66000F29), - INST(kX86InstMovAPS , "movaps" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x00000F28, 0x00000F29), - INST(kX86InstMovBE , "movbe" , G(MovBE) , F(Mov) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Mem) , 0, 0x000F38F0, 0x000F38F1), - INST(kX86InstMovD , "movd" , G(MmuMovD) , F(Mov) , O(Gd)|O(MmXmmMem) , O(Gd)|O(MmXmmMem) , 0, 0 , 0), - INST(kX86InstMovDDup , "movddup" , G(MmuMov) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF2000F12, 0), - INST(kX86InstMovDQ2Q , "movdq2q" , G(MmuMov) , F(Mov) , O(Mm) , O(Xmm) , 0, 0xF2000FD6, 0), - INST(kX86InstMovDQA , "movdqa" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x66000F6F, 0x66000F7F), - INST(kX86InstMovDQU , "movdqu" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0xF3000F6F, 0xF3000F7F), - INST(kX86InstMovHLPS , "movhlps" , G(MmuMov) , F(None) , O(Xmm) , O(Xmm) , 0, 0x00000F12, 0), - INST(kX86InstMovHPD , "movhpd" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x66000F16, 0x66000F17), - INST(kX86InstMovHPS , "movhps" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x00000F16, 0x00000F17), - INST(kX86InstMovLHPS , "movlhps" , G(MmuMov) , F(None) , O(Xmm) , O(Xmm) , 0, 0x00000F16, 0), - INST(kX86InstMovLPD , "movlpd" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x66000F12, 0x66000F13), - INST(kX86InstMovLPS , "movlps" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x00000F12, 0x00000F13), - INST(kX86InstMovMskPD , "movmskpd" , G(MmuMov) , F(Mov) , O(Gqd)|O(NoRex) , O(Xmm) , 0, 0x66000F50, 0), - INST(kX86InstMovMskPS , "movmskps" , G(MmuMov) , F(Mov) , O(Gqd)|O(NoRex) , O(Xmm) , 0, 0x00000F50, 0), - INST(kX86InstMovNTDQ , "movntdq" , G(MmuMov) , F(None) , O(Mem) , O(Xmm) , 0, 0 , 0x66000FE7), - INST(kX86InstMovNTDQA , "movntdqa" , G(MmuMov) , F(Mov) , O(Xmm) , O(Mem) , 0, 0x660F382A, 0), - INST(kX86InstMovNTI , "movnti" , G(MmuMov) , F(Mov) , O(Mem) , O(Gqd) , 0, 0 , 0x00000FC3), - INST(kX86InstMovNTPD , "movntpd" , G(MmuMov) , F(None) , O(Mem) , O(Xmm) , 0, 0 , 0x66000F2B), - INST(kX86InstMovNTPS , "movntps" , G(MmuMov) , F(None) , O(Mem) , O(Xmm) , 0, 0 , 0x00000F2B), - INST(kX86InstMovNTQ , "movntq" , G(MmuMov) , F(None) , O(Mem) , O(Mm) , 0, 0 , 0x00000FE7), - INST(kX86InstMovQ , "movq" , G(MmuMovQ) , F(Mov) , O(Gq)|O(MmXmmMem) , O(Gq)|O(MmXmmMem) , 0, 0 , 0), - INST(kX86InstMovQ2DQ , "movq2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(Mm) , 0, 0xF3000FD6, 0), - INST(kX86InstMovSD , "movsd" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0xF2000F10, 0xF2000F11), - INST(kX86InstMovSHDup , "movshdup" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F16, 0), - INST(kX86InstMovSLDup , "movsldup" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F12, 0), - INST(kX86InstMovSS , "movss" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0xF3000F10, 0xF3000F11), - INST(kX86InstMovSX , "movsx" , G(MovSxMovZx) , F(None) , O(Gqdw) , O(GwbMem) , 0, 0x00000FBE, 0), - INST(kX86InstMovSXD , "movsxd" , G(MovSxD) , F(None) , O(Gq) , O(GdMem) , 0, 0 , 0), - INST(kX86InstMovUPD , "movupd" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x66000F10, 0x66000F11), - INST(kX86InstMovUPS , "movups" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x00000F10, 0x00000F11), - INST(kX86InstMovZX , "movzx" , G(MovSxMovZx) , F(Mov) , O(Gqdw) , O(GwbMem) , 0, 0x00000FB6, 0), - INST(kX86InstMovPtr , "mov_ptr" , G(MovPtr) , F(Mov)|F(Special), O(Gqdwb) , O(Imm) , 0, 0 , 0), - INST(kX86InstMPSADBW , "mpsadbw" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A42, 0), - INST(kX86InstMul , "mul" , G(Rm) , F(Special) , 0 , 0 , 4, 0x000000F6, 0), - INST(kX86InstMulPD , "mulpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F59, 0), - INST(kX86InstMulPS , "mulps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F59, 0), - INST(kX86InstMulSD , "mulsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F59, 0), - INST(kX86InstMulSS , "mulss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F59, 0), - INST(kX86InstMWait , "mwait" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000F01C9, 0), - INST(kX86InstNeg , "neg" , G(Rm) , F(Lockable) , O(GqdwbMem) , 0 , 3, 0x000000F6, 0), - INST(kX86InstNop , "nop" , G(Emit) , F(None) , 0 , 0 , 0, 0x00000090, 0), - INST(kX86InstNot , "not" , G(Rm) , F(Lockable) , O(GqdwbMem) , 0 , 2, 0x000000F6, 0), - INST(kX86InstOr , "or" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 1, 0x00000008, 0x00000080), - INST(kX86InstOrPD , "orpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F56, 0), - INST(kX86InstOrPS , "orps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F56, 0), - INST(kX86InstPAbsB , "pabsb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F381C, 0), - INST(kX86InstPAbsD , "pabsd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F381E, 0), - INST(kX86InstPAbsW , "pabsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F381D, 0), - INST(kX86InstPackSSDW , "packssdw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F6B, 0), - INST(kX86InstPackSSWB , "packsswb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F63, 0), - INST(kX86InstPackUSDW , "packusdw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F382B, 0), - INST(kX86InstPackUSWB , "packuswb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F67, 0), - INST(kX86InstPAddB , "paddb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFC, 0), - INST(kX86InstPAddD , "paddd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFE, 0), - INST(kX86InstPAddQ , "paddq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD4, 0), - INST(kX86InstPAddSB , "paddsb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEC, 0), - INST(kX86InstPAddSW , "paddsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FED, 0), - INST(kX86InstPAddUSB , "paddusb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDC, 0), - INST(kX86InstPAddUSW , "paddusw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDD, 0), - INST(kX86InstPAddW , "paddw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFD, 0), - INST(kX86InstPAlignR , "palignr" , G(MmuRmImm8) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3A0F, 0), - INST(kX86InstPAnd , "pand" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDB, 0), - INST(kX86InstPAndN , "pandn" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDF, 0), - INST(kX86InstPause , "pause" , G(Emit) , F(None) , 0 , 0 , 0, 0xF3000090, 0), - INST(kX86InstPAvgB , "pavgb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE0, 0), - INST(kX86InstPAvgW , "pavgw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE3, 0), - INST(kX86InstPBlendVB , "pblendvb" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3810, 0), - INST(kX86InstPBlendW , "pblendw" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0E, 0), - INST(kX86InstPCmpEqB , "pcmpeqb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F74, 0), - INST(kX86InstPCmpEqD , "pcmpeqd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F76, 0), - INST(kX86InstPCmpEqQ , "pcmpeqq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3829, 0), - INST(kX86InstPCmpEqW , "pcmpeqw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F75, 0), - INST(kX86InstPCmpEStrI , "pcmpestri" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A61, 0), - INST(kX86InstPCmpEStrM , "pcmpestrm" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A60, 0), - INST(kX86InstPCmpGtB , "pcmpgtb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F64, 0), - INST(kX86InstPCmpGtD , "pcmpgtd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F66, 0), - INST(kX86InstPCmpGtQ , "pcmpgtq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3837, 0), - INST(kX86InstPCmpGtW , "pcmpgtw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F65, 0), - INST(kX86InstPCmpIStrI , "pcmpistri" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A63, 0), - INST(kX86InstPCmpIStrM , "pcmpistrm" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A62, 0), - INST(kX86InstPExtrB , "pextrb" , G(MmuExtract) , F(None) , O(Gd)|O(Gb)|O(Mem) , O(Xmm) , 0, 0x000F3A14, 0), - INST(kX86InstPExtrD , "pextrd" , G(MmuExtract) , F(None) , O(Gd) |O(Mem) , O(Xmm) , 0, 0x000F3A16, 0), - INST(kX86InstPExtrQ , "pextrq" , G(MmuExtract) , F(None) , O(Gqd) |O(Mem) , O(Xmm) , 1, 0x000F3A16, 0), - INST(kX86InstPExtrW , "pextrw" , G(MmuExtract) , F(None) , O(Gd) |O(Mem) , O(MmXmm) , 0, 0x000F3A15, 0), - INST(kX86InstPF2ID , "pf2id" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x1D), - INST(kX86InstPF2IW , "pf2iw" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x1C), - INST(kX86InstPFAcc , "pfacc" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xAE), - INST(kX86InstPFAdd , "pfadd" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x9E), - INST(kX86InstPFCmpEQ , "pfcmpeq" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xB0), - INST(kX86InstPFCmpGE , "pfcmpge" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x90), - INST(kX86InstPFCmpGT , "pfcmpgt" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA0), - INST(kX86InstPFMax , "pfmax" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA4), - INST(kX86InstPFMin , "pfmin" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x94), - INST(kX86InstPFMul , "pfmul" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xB4), - INST(kX86InstPFNAcc , "pfnacc" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x8A), - INST(kX86InstPFPNAcc , "pfpnacc" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x8E), - INST(kX86InstPFRcp , "pfrcp" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x96), - INST(kX86InstPFRcpIt1 , "pfrcpit1" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA6), - INST(kX86InstPFRcpIt2 , "pfrcpit2" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xB6), - INST(kX86InstPFRSqIt1 , "pfrsqit1" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA7), - INST(kX86InstPFRSqrt , "pfrsqrt" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x97), - INST(kX86InstPFSub , "pfsub" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x9A), - INST(kX86InstPFSubR , "pfsubr" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xAA), - INST(kX86InstPHAddD , "phaddd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3802, 0), - INST(kX86InstPHAddSW , "phaddsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3803, 0), - INST(kX86InstPHAddW , "phaddw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3801, 0), - INST(kX86InstPHMinPOSUW , "phminposuw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3841, 0), - INST(kX86InstPHSubD , "phsubd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3806, 0), - INST(kX86InstPHSubSW , "phsubsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3807, 0), - INST(kX86InstPHSubW , "phsubw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3805, 0), - INST(kX86InstPI2FD , "pi2fd" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x0D), - INST(kX86InstPI2FW , "pi2fw" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x0C), - INST(kX86InstPInsRB , "pinsrb" , G(MmuRmImm8) , F(None) , O(Xmm) , O(Gd) | O(Mem) , 0, 0x660F3A20, 0), - INST(kX86InstPInsRD , "pinsrd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(Gd) | O(Mem) , 0, 0x660F3A22, 0), - INST(kX86InstPInsRQ , "pinsrq" , G(MmuRmImm8) , F(None) , O(Xmm) , O(Gq) | O(Mem) , 0, 0x660F3A22, 0), - INST(kX86InstPInsRW , "pinsrw" , G(MmuRmImm8) , F(None) , O(MmXmm) , O(Gd) | O(Mem) , 0, 0x00000FC4, 0), - INST(kX86InstPMAddUBSW , "pmaddubsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3804, 0), - INST(kX86InstPMAddWD , "pmaddwd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF5, 0), - INST(kX86InstPMaxSB , "pmaxsb" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383C, 0), - INST(kX86InstPMaxSD , "pmaxsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383D, 0), - INST(kX86InstPMaxSW , "pmaxsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEE, 0), - INST(kX86InstPMaxUB , "pmaxub" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDE, 0), - INST(kX86InstPMaxUD , "pmaxud" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383F, 0), - INST(kX86InstPMaxUW , "pmaxuw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383E, 0), - INST(kX86InstPMinSB , "pminsb" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3838, 0), - INST(kX86InstPMinSD , "pminsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3839, 0), - INST(kX86InstPMinSW , "pminsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEA, 0), - INST(kX86InstPMinUB , "pminub" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDA, 0), - INST(kX86InstPMinUD , "pminud" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383B, 0), - INST(kX86InstPMinUW , "pminuw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383A, 0), - INST(kX86InstPMovMskB , "pmovmskb" , G(MmuRmI) , F(Mov) , O(Gqd) , O(MmXmm) , 0, 0x00000FD7, 0), - INST(kX86InstPMovSXBD , "pmovsxbd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3821, 0), - INST(kX86InstPMovSXBQ , "pmovsxbq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3822, 0), - INST(kX86InstPMovSXBW , "pmovsxbw" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3820, 0), - INST(kX86InstPMovSXDQ , "pmovsxdq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3825, 0), - INST(kX86InstPMovSXWD , "pmovsxwd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3823, 0), - INST(kX86InstPMovSXWQ , "pmovsxwq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3824, 0), - INST(kX86InstPMovZXBD , "pmovzxbd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3831, 0), - INST(kX86InstPMovZXBQ , "pmovzxbq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3832, 0), - INST(kX86InstPMovZXBW , "pmovzxbw" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3830, 0), - INST(kX86InstPMovZXDQ , "pmovzxdq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3835, 0), - INST(kX86InstPMovZXWD , "pmovzxwd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3833, 0), - INST(kX86InstPMovZXWQ , "pmovzxwq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3834, 0), - INST(kX86InstPMulDQ , "pmuldq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3828, 0), - INST(kX86InstPMulHRSW , "pmulhrsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F380B, 0), - INST(kX86InstPMulHUW , "pmulhuw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE4, 0), - INST(kX86InstPMulHW , "pmulhw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE5, 0), - INST(kX86InstPMulLD , "pmulld" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3840, 0), - INST(kX86InstPMulLW , "pmullw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD5, 0), - INST(kX86InstPMulUDQ , "pmuludq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF4, 0), - INST(kX86InstPop , "pop" , G(Pop) , F(Special) , 0 , 0 , 0, 0x00000058, 0x0000008F), - INST(kX86InstPopAD , "popad" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000061, 0), - INST(kX86InstPopCnt , "popcnt" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0xF3000FB8, 0), - INST(kX86InstPopFD , "popfd" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009D, 0), - INST(kX86InstPopFQ , "popfq" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009D, 0), - INST(kX86InstPOr , "por" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEB, 0), - INST(kX86InstPrefetch , "prefetch" , G(MmuPrefetch) , F(None) , O(Mem) , O(Imm) , 0, 0 , 0), - INST(kX86InstPSADBW , "psadbw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF6, 0), - INST(kX86InstPShufB , "pshufb" , G(MmuRmI) , F(Mov) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3800, 0), - INST(kX86InstPShufD , "pshufd" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F70, 0), - INST(kX86InstPShufW , "pshufw" , G(MmuRmImm8) , F(Mov) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F70, 0), - INST(kX86InstPShufHW , "pshufhw" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F70, 0), - INST(kX86InstPShufLW , "pshuflw" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF2000F70, 0), - INST(kX86InstPSignB , "psignb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3808, 0), - INST(kX86InstPSignD , "psignd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F380A, 0), - INST(kX86InstPSignW , "psignw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3809, 0), - INST(kX86InstPSllD , "pslld" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 6, 0x00000FF2, 0x00000F72), - INST(kX86InstPSllDQ , "pslldq" , G(MmuRmI) , F(None) , O(Xmm) , O(Imm) , 7, 0 , 0x66000F73), - INST(kX86InstPSllQ , "psllq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 6, 0x00000FF3, 0x00000F73), - INST(kX86InstPSllW , "psllw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 6, 0x00000FF1, 0x00000F71), - INST(kX86InstPSraD , "psrad" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 4, 0x00000FE2, 0x00000F72), - INST(kX86InstPSraW , "psraw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 4, 0x00000FE1, 0x00000F71), - INST(kX86InstPSrlD , "psrld" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 2, 0x00000FD2, 0x00000F72), - INST(kX86InstPSrlDQ , "psrldq" , G(MmuRmI) , F(None) , O(Xmm) , O(Imm) , 3, 0 , 0x66000F73), - INST(kX86InstPSrlQ , "psrlq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 2, 0x00000FD3, 0x00000F73), - INST(kX86InstPSrlW , "psrlw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 2, 0x00000FD1, 0x00000F71), - INST(kX86InstPSubB , "psubb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF8, 0), - INST(kX86InstPSubD , "psubd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFA, 0), - INST(kX86InstPSubQ , "psubq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFB, 0), - INST(kX86InstPSubSB , "psubsb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE8, 0), - INST(kX86InstPSubSW , "psubsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE9, 0), - INST(kX86InstPSubUSB , "psubusb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD8, 0), - INST(kX86InstPSubUSW , "psubusw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD9, 0), - INST(kX86InstPSubW , "psubw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF9, 0), - INST(kX86InstPSwapD , "pswapd" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xBB), - INST(kX86InstPTest , "ptest" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3817, 0), - INST(kX86InstPunpckHBW , "punpckhbw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F68, 0), - INST(kX86InstPunpckHDQ , "punpckhdq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F6A, 0), - INST(kX86InstPunpckHQDQ , "punpckhqdq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F6D, 0), - INST(kX86InstPunpckHWD , "punpckhwd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F69, 0), - INST(kX86InstPunpckLBW , "punpcklbw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F60, 0), - INST(kX86InstPunpckLDQ , "punpckldq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F62, 0), - INST(kX86InstPunpckLQDQ , "punpcklqdq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F6C, 0), - INST(kX86InstPunpckLWD , "punpcklwd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F61, 0), - INST(kX86InstPush , "push" , G(Push) , F(Special) , 0 , 0 , 6, 0x00000050, 0x000000FF), - INST(kX86InstPushAD , "pushad" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000060, 0), - INST(kX86InstPushFD , "pushfd" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009C, 0), - INST(kX86InstPushFQ , "pushfq" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009C, 0), - INST(kX86InstPXor , "pxor" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEF, 0), - INST(kX86InstRcl , "rcl" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 2, 0 , 0), - INST(kX86InstRcpPS , "rcpps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F53, 0), - INST(kX86InstRcpSS , "rcpss" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F53, 0), - INST(kX86InstRcr , "rcr" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 3, 0 , 0), - INST(kX86InstRdtsc , "rdtsc" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000F31, 0), - INST(kX86InstRdtscP , "rdtscp" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000F01F9, 0), - INST(kX86InstRepLodSB , "rep lodsb" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 1 /* Size of mem */), - INST(kX86InstRepLodSD , "rep lodsd" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 4 /* Size of mem */), - INST(kX86InstRepLodSQ , "rep lodsq" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 8 /* Size of mem */), - INST(kX86InstRepLodSW , "rep lodsw" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 2 /* Size of mem */), - INST(kX86InstRepMovSB , "rep movsb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 1 /* Size of mem */), - INST(kX86InstRepMovSD , "rep movsd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 4 /* Size of mem */), - INST(kX86InstRepMovSQ , "rep movsq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 8 /* Size of mem */), - INST(kX86InstRepMovSW , "rep movsw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 2 /* Size of mem */), - INST(kX86InstRepStoSB , "rep stosb" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 1 /* Size of mem */), - INST(kX86InstRepStoSD , "rep stosd" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 4 /* Size of mem */), - INST(kX86InstRepStoSQ , "rep stosq" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 8 /* Size of mem */), - INST(kX86InstRepStoSW , "rep stosw" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 2 /* Size of mem */), - INST(kX86InstRepECmpSB , "repe cmpsb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 1 /* Size of mem */), - INST(kX86InstRepECmpSD , "repe cmpsd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 4 /* Size of mem */), - INST(kX86InstRepECmpSQ , "repe cmpsq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 8 /* Size of mem */), - INST(kX86InstRepECmpSW , "repe cmpsw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 2 /* Size of mem */), - INST(kX86InstRepEScaSB , "repe scasb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 1 /* Size of mem */), - INST(kX86InstRepEScaSD , "repe scasd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 4 /* Size of mem */), - INST(kX86InstRepEScaSQ , "repe scasq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 8 /* Size of mem */), - INST(kX86InstRepEScaSW , "repe scasw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 2 /* Size of mem */), - INST(kX86InstRepNECmpSB , "repne cmpsb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 1 /* Size of mem */), - INST(kX86InstRepNECmpSD , "repne cmpsd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 4 /* Size of mem */), - INST(kX86InstRepNECmpSQ , "repne cmpsq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 8 /* Size of mem */), - INST(kX86InstRepNECmpSW , "repne cmpsw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 2 /* Size of mem */), - INST(kX86InstRepNEScaSB , "repne scasb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 1 /* Size of mem */), - INST(kX86InstRepNEScaSD , "repne scasd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 4 /* Size of mem */), - INST(kX86InstRepNEScaSQ , "repne scasq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 8 /* Size of mem */), - INST(kX86InstRepNEScaSW , "repne scasw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 2 /* Size of mem */), - INST(kX86InstRet , "ret" , G(Ret) , F(Special) , 0 , 0 , 0, 0 , 0), - INST(kX86InstRol , "rol" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 0, 0 , 0), - INST(kX86InstRor , "ror" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 1, 0 , 0), - INST(kX86InstRoundPD , "roundpd" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3A09, 0), - INST(kX86InstRoundPS , "roundps" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3A08, 0), - INST(kX86InstRoundSD , "roundsd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0B, 0), - INST(kX86InstRoundSS , "roundss" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0A, 0), - INST(kX86InstRSqrtPS , "rsqrtps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F52, 0), - INST(kX86InstRSqrtSS , "rsqrtss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F52, 0), - INST(kX86InstSahf , "sahf" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009E, 0), - INST(kX86InstSal , "sal" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 4, 0 , 0), - INST(kX86InstSar , "sar" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 7, 0 , 0), - INST(kX86InstSbb , "sbb" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 3, 0x00000018, 0x00000080), - INST(kX86InstSetA , "seta" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F97, 0), - INST(kX86InstSetAE , "setae" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F93, 0), - INST(kX86InstSetB , "setb" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F92, 0), - INST(kX86InstSetBE , "setbe" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F96, 0), - INST(kX86InstSetC , "setc" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F92, 0), - INST(kX86InstSetE , "sete" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F94, 0), - INST(kX86InstSetG , "setg" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9F, 0), - INST(kX86InstSetGE , "setge" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9D, 0), - INST(kX86InstSetL , "setl" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9C, 0), - INST(kX86InstSetLE , "setle" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9E, 0), - INST(kX86InstSetNA , "setna" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F96, 0), - INST(kX86InstSetNAE , "setnae" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F92, 0), - INST(kX86InstSetNB , "setnb" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F93, 0), - INST(kX86InstSetNBE , "setnbe" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F97, 0), - INST(kX86InstSetNC , "setnc" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F93, 0), - INST(kX86InstSetNE , "setne" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F95, 0), - INST(kX86InstSetNG , "setng" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9E, 0), - INST(kX86InstSetNGE , "setnge" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9C, 0), - INST(kX86InstSetNL , "setnl" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9D, 0), - INST(kX86InstSetNLE , "setnle" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9F, 0), - INST(kX86InstSetNO , "setno" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F91, 0), - INST(kX86InstSetNP , "setnp" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9B, 0), - INST(kX86InstSetNS , "setns" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F99, 0), - INST(kX86InstSetNZ , "setnz" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F95, 0), - INST(kX86InstSetO , "seto" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F90, 0), - INST(kX86InstSetP , "setp" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9A, 0), - INST(kX86InstSetPE , "setpe" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9A, 0), - INST(kX86InstSetPO , "setpo" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9B, 0), - INST(kX86InstSetS , "sets" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F98, 0), - INST(kX86InstSetZ , "setz" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F94, 0), - INST(kX86InstSFence , "sfence" , G(Emit) , F(None) , 0 , 0 , 0, 0x000FAEF8, 0), - INST(kX86InstShl , "shl" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 4, 0 , 0), - INST(kX86InstShld , "shld" , G(ShldShrd) , F(Special) , O(GqdwbMem) , O(Gb) , 0, 0x00000FA4, 0), - INST(kX86InstShr , "shr" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 5, 0 , 0), - INST(kX86InstShrd , "shrd" , G(ShldShrd) , F(Special) , O(GqdwbMem) , O(Gqdwb) , 0, 0x00000FAC, 0), - INST(kX86InstShufPD , "shufpd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000FC6, 0), - INST(kX86InstShufPS , "shufps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000FC6, 0), - INST(kX86InstSqrtPD , "sqrtpd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F51, 0), - INST(kX86InstSqrtPS , "sqrtps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F51, 0), - INST(kX86InstSqrtSD , "sqrtsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F51, 0), - INST(kX86InstSqrtSS , "sqrtss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F51, 0), - INST(kX86InstStc , "stc" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000F9, 0), - INST(kX86InstStd , "std" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000FD, 0), - INST(kX86InstStMXCSR , "stmxcsr" , G(Mem) , F(None) , O(Mem) , 0 , 3, 0x00000FAE, 0), - INST(kX86InstSub , "sub" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 5, 0x00000028, 0x00000080), - INST(kX86InstSubPD , "subpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5C, 0), - INST(kX86InstSubPS , "subps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5C, 0), - INST(kX86InstSubSD , "subsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5C, 0), - INST(kX86InstSubSS , "subss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5C, 0), - INST(kX86InstTest , "test" , G(Test) , F(None) , O(GqdwbMem) , O(Gqdwb)|O(Imm) , 0, 0 , 0), - INST(kX86InstUComISD , "ucomisd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F2E, 0), - INST(kX86InstUComISS , "ucomiss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F2E, 0), - INST(kX86InstUd2 , "ud2" , G(Emit) , F(None) , 0 , 0 , 0, 0x00000F0B, 0), - INST(kX86InstUnpckHPD , "unpckhpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F15, 0), - INST(kX86InstUnpckHPS , "unpckhps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F15, 0), - INST(kX86InstUnpckLPD , "unpcklpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F14, 0), - INST(kX86InstUnpckLPS , "unpcklps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F14, 0), - INST(kX86InstXadd , "xadd" , G(RmReg) , F(Lockable) , O(GqdwbMem) , O(Gqdwb) , 0, 0x00000FC0, 0), - INST(kX86InstXchg , "xchg" , G(Xchg) , F(Lockable) , O(GqdwbMem) , O(Gqdwb) , 0, 0 , 0), - INST(kX86InstXor , "xor" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 6, 0x00000030, 0x00000080), - INST(kX86InstXorPD , "xorpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F57, 0), - INST(kX86InstXorPS , "xorps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F57, 0) + // Instruction code | Instruction name | Instruction group| Instruction flags| Operand flags[0] | Operand flags[1] | r| opCode[0] | opcode[1] + INST(kInstNone , "" , G(None) , F(None) , 0 , 0 , 0, 0 , 0), + INST(kX86InstAdc , "adc" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 2, 0x00000010, 0x00000080), + INST(kX86InstAdd , "add" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 0, 0x00000000, 0x00000080), + INST(kX86InstAddPD , "addpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F58, 0), + INST(kX86InstAddPS , "addps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F58, 0), + INST(kX86InstAddSD , "addsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F58, 0), + INST(kX86InstAddSS , "addss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F58, 0), + INST(kX86InstAddSubPD , "addsubpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000FD0, 0), + INST(kX86InstAddSubPS , "addsubps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000FD0, 0), + INST(kX86InstAmdPrefetch , "amd_prefetch" , G(Mem) , F(None) , O(Mem) , 0 , 0, 0x00000F0D, 0), + INST(kX86InstAmdPrefetchW , "amd_prefetchw" , G(Mem) , F(None) , O(Mem) , 0 , 1, 0x00000F0D, 0), + INST(kX86InstAnd , "and" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 4, 0x00000020, 0x00000080), + INST(kX86InstAndnPD , "andnpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F55, 0), + INST(kX86InstAndnPS , "andnps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F55, 0), + INST(kX86InstAndPD , "andpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F54, 0), + INST(kX86InstAndPS , "andps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F54, 0), + INST(kX86InstBlendPD , "blendpd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0D, 0), + INST(kX86InstBlendPS , "blendps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0C, 0), + INST(kX86InstBlendVPD , "blendvpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3815, 0), + INST(kX86InstBlendVPS , "blendvps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3814, 0), + INST(kX86InstBsf , "bsf" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000FBC, 0), + INST(kX86InstBsr , "bsr" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000FBD, 0), + INST(kX86InstBSwap , "bswap" , G(BSwap) , F(None) , O(Gqd) , 0 , 0, 0 , 0), + INST(kX86InstBt , "bt" , G(BTest) , F(None) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 4, 0x00000FA3, 0x00000FBA), + INST(kX86InstBtc , "btc" , G(BTest) , F(Lockable) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 7, 0x00000FBB, 0x00000FBA), + INST(kX86InstBtr , "btr" , G(BTest) , F(Lockable) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 6, 0x00000FB3, 0x00000FBA), + INST(kX86InstBts , "bts" , G(BTest) , F(Lockable) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Imm) , 5, 0x00000FAB, 0x00000FBA), + INST(kX86InstCall , "call" , G(Call) , F(Jump) , O(Gqd) |O(Mem) , 0 , 0, 0 , 0), + INST(kX86InstCbw , "cbw" , G(Emit) , F(Special) , 0 , 0 , 0, 0x66000098, 0), + INST(kX86InstCdq , "cdq" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000099, 0), + INST(kX86InstCdqe , "cdqe" , G(Emit) , F(Special) , 0 , 0 , 0, 0x48000098, 0), + INST(kX86InstClc , "clc" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000F8, 0), + INST(kX86InstCld , "cld" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000FC, 0), + INST(kX86InstClFlush , "clflush" , G(Mem) , F(None) , O(Mem) , 0 , 7, 0x00000FAE, 0), + INST(kX86InstCmc , "cmc" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000F5, 0), + INST(kX86InstCMovA , "cmova" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F47, 0), + INST(kX86InstCMovAE , "cmovae" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F43, 0), + INST(kX86InstCMovB , "cmovb" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F42, 0), + INST(kX86InstCMovBE , "cmovbe" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F46, 0), + INST(kX86InstCMovC , "cmovc" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F42, 0), + INST(kX86InstCMovE , "cmove" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F44, 0), + INST(kX86InstCMovG , "cmovg" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4F, 0), + INST(kX86InstCMovGE , "cmovge" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4D, 0), + INST(kX86InstCMovL , "cmovl" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4C, 0), + INST(kX86InstCMovLE , "cmovle" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4E, 0), + INST(kX86InstCMovNA , "cmovna" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F46, 0), + INST(kX86InstCMovNAE , "cmovnae" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F42, 0), + INST(kX86InstCMovNB , "cmovnb" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F43, 0), + INST(kX86InstCMovNBE , "cmovnbe" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F47, 0), + INST(kX86InstCMovNC , "cmovnc" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F43, 0), + INST(kX86InstCMovNE , "cmovne" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F45, 0), + INST(kX86InstCMovNG , "cmovng" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4E, 0), + INST(kX86InstCMovNGE , "cmovnge" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4C, 0), + INST(kX86InstCMovNL , "cmovnl" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4D, 0), + INST(kX86InstCMovNLE , "cmovnle" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4F, 0), + INST(kX86InstCMovNO , "cmovno" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F41, 0), + INST(kX86InstCMovNP , "cmovnp" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4B, 0), + INST(kX86InstCMovNS , "cmovns" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F49, 0), + INST(kX86InstCMovNZ , "cmovnz" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F45, 0), + INST(kX86InstCMovO , "cmovo" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F40, 0), + INST(kX86InstCMovP , "cmovp" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4A, 0), + INST(kX86InstCMovPE , "cmovpe" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4A, 0), + INST(kX86InstCMovPO , "cmovpo" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F4B, 0), + INST(kX86InstCMovS , "cmovs" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F48, 0), + INST(kX86InstCMovZ , "cmovz" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0x00000F44, 0), + INST(kX86InstCmp , "cmp" , G(Arith) , F(None) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 7, 0x00000038, 0x00000080), + INST(kX86InstCmpPD , "cmppd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000FC2, 0), + INST(kX86InstCmpPS , "cmpps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000FC2, 0), + INST(kX86InstCmpSD , "cmpsd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000FC2, 0), + INST(kX86InstCmpSS , "cmpss" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000FC2, 0), + INST(kX86InstCmpXCHG , "cmpxchg" , G(RmReg) , F(Special)|F(Lockable), 0 , 0 , 0, 0x00000FB0, 0), + INST(kX86InstCmpXCHG16B , "cmpxchg16b" , G(Mem) , F(Special) , O(Mem) , 0 , 1, 0x00000FC7, 1 /* RexW */), + INST(kX86InstCmpXCHG8B , "cmpxchg8b" , G(Mem) , F(Special) , O(Mem) , 0 , 1, 0x00000FC7, 0), + INST(kX86InstComISD , "comisd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F2F, 0), + INST(kX86InstComISS , "comiss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F2F, 0), + INST(kX86InstCpuId , "cpuid" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000FA2, 0), + INST(kX86InstCqo , "cqo" , G(Emit) , F(Special) , 0 , 0 , 0, 0x48000099, 0), // TODO, set RexW bit instead? + INST(kX86InstCrc32 , "crc32" , G(Crc32) , F(None) , O(Gqd) , O(GqdwbMem) , 0, 0xF20F38F0, 0), + INST(kX86InstCvtDQ2PD , "cvtdq2pd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000FE6, 0), + INST(kX86InstCvtDQ2PS , "cvtdq2ps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F5B, 0), + INST(kX86InstCvtPD2DQ , "cvtpd2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF2000FE6, 0), + INST(kX86InstCvtPD2PI , "cvtpd2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x66000F2D, 0), + INST(kX86InstCvtPD2PS , "cvtpd2ps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F5A, 0), + INST(kX86InstCvtPI2PD , "cvtpi2pd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(MmMem) , 0, 0x66000F2A, 0), + INST(kX86InstCvtPI2PS , "cvtpi2ps" , G(MmuRmI) , F(None) , O(Xmm) , O(MmMem) , 0, 0x00000F2A, 0), + INST(kX86InstCvtPS2DQ , "cvtps2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F5B, 0), + INST(kX86InstCvtPS2PD , "cvtps2pd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F5A, 0), + INST(kX86InstCvtPS2PI , "cvtps2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x00000F2D, 0), + INST(kX86InstCvtSD2SI , "cvtsd2si" , G(MmuRmI) , F(Mov) , O(Gqd) , O(XmmMem) , 0, 0xF2000F2D, 0), + INST(kX86InstCvtSD2SS , "cvtsd2ss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5A, 0), + INST(kX86InstCvtSI2SD , "cvtsi2sd" , G(MmuRmI) , F(None) , O(Xmm) , O(Gqd)|O(Mem) , 0, 0xF2000F2A, 0), + INST(kX86InstCvtSI2SS , "cvtsi2ss" , G(MmuRmI) , F(None) , O(Xmm) , O(Gqd)|O(Mem) , 0, 0xF3000F2A, 0), + INST(kX86InstCvtSS2SD , "cvtss2sd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5A, 0), + INST(kX86InstCvtSS2SI , "cvtss2si" , G(MmuRmI) , F(None) , O(Gqd) , O(XmmMem) , 0, 0xF3000F2D, 0), + INST(kX86InstCvttPD2DQ , "cvttpd2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000FE6, 0), + INST(kX86InstCvttPD2PI , "cvttpd2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x66000F2C, 0), + INST(kX86InstCvttPS2DQ , "cvttps2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5B, 0), + INST(kX86InstCvttPS2PI , "cvttps2pi" , G(MmuRmI) , F(Mov) , O(Mm) , O(XmmMem) , 0, 0x00000F2C, 0), + INST(kX86InstCvttSD2SI , "cvttsd2si" , G(MmuRmI) , F(None) , O(Gqd) , O(XmmMem) , 0, 0xF2000F2C, 0), + INST(kX86InstCvttSS2SI , "cvttss2si" , G(MmuRmI) , F(None) , O(Gqd) , O(XmmMem) , 0, 0xF3000F2C, 0), + INST(kX86InstCwd , "cwd" , G(Emit) , F(Special) , 0 , 0 , 0, 0x66000099, 0), + INST(kX86InstCwde , "cwde" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000098, 0), + INST(kX86InstDaa , "daa" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000027, 0), + INST(kX86InstDas , "das" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000002F, 0), + INST(kX86InstDec , "dec" , G(IncDec) , F(Lockable) , O(GqdwbMem) , 0 , 1, 0x00000048, 0x000000FE), + INST(kX86InstDiv , "div" , G(Rm) , F(Special) , 0 , 0 , 6, 0x000000F6, 0), + INST(kX86InstDivPD , "divpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5E, 0), + INST(kX86InstDivPS , "divps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5E, 0), + INST(kX86InstDivSD , "divsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5E, 0), + INST(kX86InstDivSS , "divss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5E, 0), + INST(kX86InstDpPD , "dppd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A41, 0), + INST(kX86InstDpPS , "dpps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A40, 0), + INST(kX86InstEmms , "emms" , G(Emit) , F(None) , 0 , 0 , 0, 0x00000F77, 0), + INST(kX86InstEnter , "enter" , G(Enter) , F(Special) , 0 , 0 , 0, 0x000000C8, 0), + INST(kX86InstExtractPS , "extractps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A17, 0), + INST(kX86InstF2XM1 , "f2xm1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F0, 0), + INST(kX86InstFAbs , "fabs" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E1, 0), + INST(kX86InstFAdd , "fadd" , G(X87StM) , F(Fpu) , 0 , 0 , 0, 0xD8DCC0C0, 0), + INST(kX86InstFAddP , "faddp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEC0, 0), + INST(kX86InstFBLd , "fbld" , G(Mem) , F(Fpu) , O(Mem) , 0 , 4, 0x000000DF, 0), + INST(kX86InstFBStP , "fbstp" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x000000DF, 0), + INST(kX86InstFCHS , "fchs" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E0, 0), + INST(kX86InstFClex , "fclex" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x9B00DBE2, 0), + INST(kX86InstFCMovB , "fcmovb" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAC0, 0), + INST(kX86InstFCMovBE , "fcmovbe" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAD0, 0), + INST(kX86InstFCMovE , "fcmove" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAC8, 0), + INST(kX86InstFCMovNB , "fcmovnb" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBC0, 0), + INST(kX86InstFCMovNBE , "fcmovnbe" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBD0, 0), + INST(kX86InstFCMovNE , "fcmovne" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBC8, 0), + INST(kX86InstFCMovNU , "fcmovnu" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBD8, 0), + INST(kX86InstFCMovU , "fcmovu" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DAD8, 0), + INST(kX86InstFCom , "fcom" , G(X87StM) , F(Fpu) , 0 , 0 , 2, 0xD8DCD0D0, 0), + INST(kX86InstFComI , "fcomi" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBF0, 0), + INST(kX86InstFComIP , "fcomip" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DFF0, 0), + INST(kX86InstFComP , "fcomp" , G(X87StM) , F(Fpu) , 0 , 0 , 3, 0xD8DCD8D8, 0), + INST(kX86InstFComPP , "fcompp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DED9, 0), + INST(kX86InstFCos , "fcos" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FF, 0), + INST(kX86InstFDecStP , "fdecstp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F6, 0), + INST(kX86InstFDiv , "fdiv" , G(X87StM) , F(Fpu) , 0 , 0 , 6, 0xD8DCF0F8, 0), + INST(kX86InstFDivP , "fdivp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEF8, 0), + INST(kX86InstFDivR , "fdivr" , G(X87StM) , F(Fpu) , 0 , 0 , 7, 0xD8DCF8F0, 0), + INST(kX86InstFDivRP , "fdivrp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEF0, 0), + INST(kX86InstFEmms , "femms" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x00000F0E, 0), + INST(kX86InstFFree , "ffree" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DDC0, 0), + INST(kX86InstFIAdd , "fiadd" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 0, 0xDEDA0000, 0), + INST(kX86InstFICom , "ficom" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 2, 0xDEDA0000, 0), + INST(kX86InstFIComP , "ficomp" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 3, 0xDEDA0000, 0), + INST(kX86InstFIDiv , "fidiv" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 6, 0xDEDA0000, 0), + INST(kX86InstFIDivR , "fidivr" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 7, 0xDEDA0000, 0), + INST(kX86InstFILd , "fild" , G(X87Mem) , F(Fpu) , O(StM2_4_8) , 0 , 0, 0xDFDBDF05, 0), + INST(kX86InstFIMul , "fimul" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 1, 0xDEDA0000, 0), + INST(kX86InstFIncStP , "fincstp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F7, 0), + INST(kX86InstFInit , "finit" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x9B00DBE3, 0), + INST(kX86InstFISt , "fist" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 2, 0xDFDB0000, 0), + INST(kX86InstFIStP , "fistp" , G(X87Mem) , F(Fpu) , O(StM2_4_8) , 0 , 3, 0xDFDBDF07, 0), + INST(kX86InstFISttP , "fisttp" , G(X87Mem) , F(Fpu) , O(StM2_4_8) , 0 , 1, 0xDFDBDD01, 0), + INST(kX86InstFISub , "fisub" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 4, 0xDEDA0000, 0), + INST(kX86InstFISubR , "fisubr" , G(X87Mem) , F(Fpu) , O(StM2_4) , 0 , 5, 0xDEDA0000, 0), + INST(kX86InstFLd , "fld" , G(X87FldFst) , F(Fpu) , O(StM4_8_10) , 0 , 0, 0x00D9DD00, 0xD9C0DB05), + INST(kX86InstFLd1 , "fld1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E8, 0), + INST(kX86InstFLdCw , "fldcw" , G(Mem) , F(Fpu) , O(Mem) , 0 , 5, 0x000000D9, 0), + INST(kX86InstFLdEnv , "fldenv" , G(Mem) , F(Fpu) , O(Mem) , 0 , 4, 0x000000D9, 0), + INST(kX86InstFLdL2E , "fldl2e" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EA, 0), + INST(kX86InstFLdL2T , "fldl2t" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E9, 0), + INST(kX86InstFLdLg2 , "fldlg2" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EC, 0), + INST(kX86InstFLdLn2 , "fldln2" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9ED, 0), + INST(kX86InstFLdPi , "fldpi" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EB, 0), + INST(kX86InstFLdZ , "fldz" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9EE, 0), + INST(kX86InstFMul , "fmul" , G(X87StM) , F(Fpu) , 0 , 0 , 1, 0xD8DCC8C8, 0), + INST(kX86InstFMulP , "fmulp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEC8, 0), + INST(kX86InstFNClex , "fnclex" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DBE2, 0), + INST(kX86InstFNInit , "fninit" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DBE3, 0), + INST(kX86InstFNop , "fnop" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9D0, 0), + INST(kX86InstFNSave , "fnsave" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x000000DD, 0), + INST(kX86InstFNStCw , "fnstcw" , G(Mem) , F(Fpu) , O(Mem) , 0 , 7, 0x000000D9, 0), + INST(kX86InstFNStEnv , "fnstenv" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x000000D9, 0), + INST(kX86InstFNStSw , "fnstsw" , G(X87Status) , F(Fpu) , O(Mem) , 0 , 7, 0x000000DD, 0x0000DFE0), + INST(kX86InstFPAtan , "fpatan" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F3, 0), + INST(kX86InstFPRem , "fprem" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F8, 0), + INST(kX86InstFPRem1 , "fprem1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F5, 0), + INST(kX86InstFPTan , "fptan" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F2, 0), + INST(kX86InstFRndInt , "frndint" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FC, 0), + INST(kX86InstFRstor , "frstor" , G(Mem) , F(Fpu) , O(Mem) , 0 , 4, 0x000000DD, 0), + INST(kX86InstFSave , "fsave" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x9B0000DD, 0), + INST(kX86InstFScale , "fscale" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FD, 0), + INST(kX86InstFSin , "fsin" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FE, 0), + INST(kX86InstFSinCos , "fsincos" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FB, 0), + INST(kX86InstFSqrt , "fsqrt" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9FA, 0), + INST(kX86InstFSt , "fst" , G(X87FldFst) , F(Fpu) , O(StM4_8) , 0 , 2, 0x00D9DD02, 0xDDD00000), + INST(kX86InstFStCw , "fstcw" , G(Mem) , F(Fpu) , O(Mem) , 0 , 7, 0x9B0000D9, 0), + INST(kX86InstFStEnv , "fstenv" , G(Mem) , F(Fpu) , O(Mem) , 0 , 6, 0x9B0000D9, 0), + INST(kX86InstFStP , "fstp" , G(X87FldFst) , F(Fpu) , O(StM4_8_10) , 0 , 3, 0x00D9DD03, 0xDDD8DB07), + INST(kX86InstFStSw , "fstsw" , G(X87Status) , F(Fpu) , O(Mem) , 0 , 7, 0x9B0000DD, 0x9B00DFE0), + INST(kX86InstFSub , "fsub" , G(X87StM) , F(Fpu) , 0 , 0 , 4, 0xD8DCE0E8, 0), + INST(kX86InstFSubP , "fsubp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEE8, 0), + INST(kX86InstFSubR , "fsubr" , G(X87StM) , F(Fpu) , 0 , 0 , 5, 0xD8DCE8E0, 0), + INST(kX86InstFSubRP , "fsubrp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DEE0, 0), + INST(kX86InstFTst , "ftst" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E4, 0), + INST(kX86InstFUCom , "fucom" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DDE0, 0), + INST(kX86InstFUComI , "fucomi" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DBE8, 0), + INST(kX86InstFUComIP , "fucomip" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DFE8, 0), + INST(kX86InstFUComP , "fucomp" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000DDE8, 0), + INST(kX86InstFUComPP , "fucompp" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000DAE9, 0), + INST(kX86InstFWait , "fwait" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x000000DB, 0), + INST(kX86InstFXam , "fxam" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9E5, 0), + INST(kX86InstFXch , "fxch" , G(X87StI) , F(Fpu) , 0 , 0 , 0, 0x0000D9C8, 0), + INST(kX86InstFXRstor , "fxrstor" , G(Mem) , F(Fpu) , 0 , 0 , 1, 0x00000FAE, 0), + INST(kX86InstFXSave , "fxsave" , G(Mem) , F(Fpu) , 0 , 0 , 0, 0x00000FAE, 0), + INST(kX86InstFXtract , "fxtract" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F4, 0), + INST(kX86InstFYL2X , "fyl2x" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F1, 0), + INST(kX86InstFYL2XP1 , "fyl2xp1" , G(Emit) , F(Fpu) , 0 , 0 , 0, 0x0000D9F9, 0), + INST(kX86InstHAddPD , "haddpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F7C, 0), + INST(kX86InstHAddPS , "haddps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F7C, 0), + INST(kX86InstHSubPD , "hsubpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F7D, 0), + INST(kX86InstHSubPS , "hsubps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F7D, 0), + INST(kX86InstIDiv , "idiv" , G(Rm) , F(Special) , 0 , 0 , 7, 0x000000F6, 0), + INST(kX86InstIMul , "imul" , G(IMul) , F(Special) , 0 , 0 , 0, 0 , 0), + INST(kX86InstInc , "inc" , G(IncDec) , F(Lockable) , O(GqdwbMem) , 0 , 0, 0x00000040, 0x000000FE), + INST(kX86InstInt3 , "int3" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000CC, 0), + INST(kX86InstJA , "ja" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x7 , 0), + INST(kX86InstJAE , "jae" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x3 , 0), + INST(kX86InstJB , "jb" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x2 , 0), + INST(kX86InstJBE , "jbe" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x6 , 0), + INST(kX86InstJC , "jc" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x2 , 0), + INST(kX86InstJE , "je" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x4 , 0), + INST(kX86InstJG , "jg" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xF , 0), + INST(kX86InstJGE , "jge" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xD , 0), + INST(kX86InstJL , "jl" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xC , 0), + INST(kX86InstJLE , "jle" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xE , 0), + INST(kX86InstJNA , "jna" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x6 , 0), + INST(kX86InstJNAE , "jnae" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x2 , 0), + INST(kX86InstJNB , "jnb" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x3 , 0), + INST(kX86InstJNBE , "jnbe" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x7 , 0), + INST(kX86InstJNC , "jnc" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x3 , 0), + INST(kX86InstJNE , "jne" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x5 , 0), + INST(kX86InstJNG , "jng" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xE , 0), + INST(kX86InstJNGE , "jnge" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xC , 0), + INST(kX86InstJNL , "jnl" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xD , 0), + INST(kX86InstJNLE , "jnle" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xF , 0), + INST(kX86InstJNO , "jno" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x1 , 0), + INST(kX86InstJNP , "jnp" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xB , 0), + INST(kX86InstJNS , "jns" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x9 , 0), + INST(kX86InstJNZ , "jnz" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x5 , 0), + INST(kX86InstJO , "jo" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x0 , 0), + INST(kX86InstJP , "jp" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xA , 0), + INST(kX86InstJPE , "jpe" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xA , 0), + INST(kX86InstJPO , "jpo" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0xB , 0), + INST(kX86InstJS , "js" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x8 , 0), + INST(kX86InstJZ , "jz" , G(Jcc) , F(Jump) , 0 , 0 , 0, 0x4 , 0), + INST(kX86InstJmp , "jmp" , G(Jmp) , F(Jump) , 0 , 0 , 0, 0 , 0), + INST(kX86InstLdDQU , "lddqu" , G(MmuRmI) , F(None) , O(Xmm) , O(Mem) , 0, 0xF2000FF0, 0), + INST(kX86InstLdMXCSR , "ldmxcsr" , G(Mem) , F(None) , O(Mem) , 0 , 2, 0x00000FAE, 0), + INST(kX86InstLahf , "lahf" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009F, 0), + INST(kX86InstLea , "lea" , G(Lea) , F(None) , O(Gqd) , O(Mem) , 0, 0 , 0), + INST(kX86InstLeave , "leave" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000000C9, 0), + INST(kX86InstLFence , "lfence" , G(Emit) , F(None) , 0 , 0 , 0, 0x000FAEE8, 0), + INST(kX86InstMaskMovDQU , "maskmovdqu" , G(MmuRmI) , F(Special) , O(Xmm) , O(Xmm) , 0, 0x66000F57, 0), + INST(kX86InstMaskMovQ , "maskmovq" , G(MmuRmI) , F(Special) , O(Mm) , O(Mm) , 0, 0x00000FF7, 0), + INST(kX86InstMaxPD , "maxpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5F, 0), + INST(kX86InstMaxPS , "maxps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5F, 0), + INST(kX86InstMaxSD , "maxsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5F, 0), + INST(kX86InstMaxSS , "maxss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5F, 0), + INST(kX86InstMFence , "mfence" , G(Emit) , F(None) , 0 , 0 , 0, 0x000FAEF0, 0), + INST(kX86InstMinPD , "minpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5D, 0), + INST(kX86InstMinPS , "minps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5D, 0), + INST(kX86InstMinSD , "minsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5D, 0), + INST(kX86InstMinSS , "minss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5D, 0), + INST(kX86InstMonitor , "monitor" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000F01C8, 0), + INST(kX86InstMov , "mov" , G(Mov) , F(Mov) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 0, 0 , 0), + INST(kX86InstMovAPD , "movapd" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x66000F28, 0x66000F29), + INST(kX86InstMovAPS , "movaps" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x00000F28, 0x00000F29), + INST(kX86InstMovBE , "movbe" , G(MovBE) , F(Mov) , O(Gqdw)|O(Mem) , O(Gqdw)|O(Mem) , 0, 0x000F38F0, 0x000F38F1), + INST(kX86InstMovD , "movd" , G(MmuMovD) , F(Mov) , O(Gd)|O(MmXmmMem) , O(Gd)|O(MmXmmMem) , 0, 0 , 0), + INST(kX86InstMovDDup , "movddup" , G(MmuMov) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF2000F12, 0), + INST(kX86InstMovDQ2Q , "movdq2q" , G(MmuMov) , F(Mov) , O(Mm) , O(Xmm) , 0, 0xF2000FD6, 0), + INST(kX86InstMovDQA , "movdqa" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x66000F6F, 0x66000F7F), + INST(kX86InstMovDQU , "movdqu" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0xF3000F6F, 0xF3000F7F), + INST(kX86InstMovHLPS , "movhlps" , G(MmuMov) , F(None) , O(Xmm) , O(Xmm) , 0, 0x00000F12, 0), + INST(kX86InstMovHPD , "movhpd" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x66000F16, 0x66000F17), + INST(kX86InstMovHPS , "movhps" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x00000F16, 0x00000F17), + INST(kX86InstMovLHPS , "movlhps" , G(MmuMov) , F(None) , O(Xmm) , O(Xmm) , 0, 0x00000F16, 0), + INST(kX86InstMovLPD , "movlpd" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x66000F12, 0x66000F13), + INST(kX86InstMovLPS , "movlps" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0x00000F12, 0x00000F13), + INST(kX86InstMovMskPD , "movmskpd" , G(MmuMov) , F(Mov) , O(Gqd)|O(NoRex) , O(Xmm) , 0, 0x66000F50, 0), + INST(kX86InstMovMskPS , "movmskps" , G(MmuMov) , F(Mov) , O(Gqd)|O(NoRex) , O(Xmm) , 0, 0x00000F50, 0), + INST(kX86InstMovNTDQ , "movntdq" , G(MmuMov) , F(None) , O(Mem) , O(Xmm) , 0, 0 , 0x66000FE7), + INST(kX86InstMovNTDQA , "movntdqa" , G(MmuMov) , F(Mov) , O(Xmm) , O(Mem) , 0, 0x660F382A, 0), + INST(kX86InstMovNTI , "movnti" , G(MmuMov) , F(Mov) , O(Mem) , O(Gqd) , 0, 0 , 0x00000FC3), + INST(kX86InstMovNTPD , "movntpd" , G(MmuMov) , F(None) , O(Mem) , O(Xmm) , 0, 0 , 0x66000F2B), + INST(kX86InstMovNTPS , "movntps" , G(MmuMov) , F(None) , O(Mem) , O(Xmm) , 0, 0 , 0x00000F2B), + INST(kX86InstMovNTQ , "movntq" , G(MmuMov) , F(None) , O(Mem) , O(Mm) , 0, 0 , 0x00000FE7), + INST(kX86InstMovQ , "movq" , G(MmuMovQ) , F(Mov) , O(Gq)|O(MmXmmMem) , O(Gq)|O(MmXmmMem) , 0, 0 , 0), + INST(kX86InstMovQ2DQ , "movq2dq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(Mm) , 0, 0xF3000FD6, 0), + INST(kX86InstMovSD , "movsd" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0xF2000F10, 0xF2000F11), + INST(kX86InstMovSHDup , "movshdup" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F16, 0), + INST(kX86InstMovSLDup , "movsldup" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F12, 0), + INST(kX86InstMovSS , "movss" , G(MmuMov) , F(None) , O(XmmMem) , O(XmmMem) , 0, 0xF3000F10, 0xF3000F11), + INST(kX86InstMovSX , "movsx" , G(MovSxMovZx) , F(None) , O(Gqdw) , O(GwbMem) , 0, 0x00000FBE, 0), + INST(kX86InstMovSXD , "movsxd" , G(MovSxD) , F(None) , O(Gq) , O(GdMem) , 0, 0 , 0), + INST(kX86InstMovUPD , "movupd" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x66000F10, 0x66000F11), + INST(kX86InstMovUPS , "movups" , G(MmuMov) , F(Mov) , O(XmmMem) , O(XmmMem) , 0, 0x00000F10, 0x00000F11), + INST(kX86InstMovZX , "movzx" , G(MovSxMovZx) , F(Mov) , O(Gqdw) , O(GwbMem) , 0, 0x00000FB6, 0), + INST(kX86InstMovPtr , "mov_ptr" , G(MovPtr) , F(Mov)|F(Special), O(Gqdwb) , O(Imm) , 0, 0 , 0), + INST(kX86InstMPSADBW , "mpsadbw" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A42, 0), + INST(kX86InstMul , "mul" , G(Rm) , F(Special) , 0 , 0 , 4, 0x000000F6, 0), + INST(kX86InstMulPD , "mulpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F59, 0), + INST(kX86InstMulPS , "mulps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F59, 0), + INST(kX86InstMulSD , "mulsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F59, 0), + INST(kX86InstMulSS , "mulss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F59, 0), + INST(kX86InstMWait , "mwait" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000F01C9, 0), + INST(kX86InstNeg , "neg" , G(Rm) , F(Lockable) , O(GqdwbMem) , 0 , 3, 0x000000F6, 0), + INST(kX86InstNop , "nop" , G(Emit) , F(None) , 0 , 0 , 0, 0x00000090, 0), + INST(kX86InstNot , "not" , G(Rm) , F(Lockable) , O(GqdwbMem) , 0 , 2, 0x000000F6, 0), + INST(kX86InstOr , "or" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 1, 0x00000008, 0x00000080), + INST(kX86InstOrPD , "orpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F56, 0), + INST(kX86InstOrPS , "orps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F56, 0), + INST(kX86InstPAbsB , "pabsb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F381C, 0), + INST(kX86InstPAbsD , "pabsd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F381E, 0), + INST(kX86InstPAbsW , "pabsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F381D, 0), + INST(kX86InstPackSSDW , "packssdw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F6B, 0), + INST(kX86InstPackSSWB , "packsswb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F63, 0), + INST(kX86InstPackUSDW , "packusdw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F382B, 0), + INST(kX86InstPackUSWB , "packuswb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F67, 0), + INST(kX86InstPAddB , "paddb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFC, 0), + INST(kX86InstPAddD , "paddd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFE, 0), + INST(kX86InstPAddQ , "paddq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD4, 0), + INST(kX86InstPAddSB , "paddsb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEC, 0), + INST(kX86InstPAddSW , "paddsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FED, 0), + INST(kX86InstPAddUSB , "paddusb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDC, 0), + INST(kX86InstPAddUSW , "paddusw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDD, 0), + INST(kX86InstPAddW , "paddw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFD, 0), + INST(kX86InstPAlignR , "palignr" , G(MmuRmImm8) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3A0F, 0), + INST(kX86InstPAnd , "pand" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDB, 0), + INST(kX86InstPAndN , "pandn" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDF, 0), + INST(kX86InstPause , "pause" , G(Emit) , F(None) , 0 , 0 , 0, 0xF3000090, 0), + INST(kX86InstPAvgB , "pavgb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE0, 0), + INST(kX86InstPAvgW , "pavgw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE3, 0), + INST(kX86InstPBlendVB , "pblendvb" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3810, 0), + INST(kX86InstPBlendW , "pblendw" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0E, 0), + INST(kX86InstPCmpEqB , "pcmpeqb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F74, 0), + INST(kX86InstPCmpEqD , "pcmpeqd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F76, 0), + INST(kX86InstPCmpEqQ , "pcmpeqq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3829, 0), + INST(kX86InstPCmpEqW , "pcmpeqw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F75, 0), + INST(kX86InstPCmpEStrI , "pcmpestri" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A61, 0), + INST(kX86InstPCmpEStrM , "pcmpestrm" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A60, 0), + INST(kX86InstPCmpGtB , "pcmpgtb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F64, 0), + INST(kX86InstPCmpGtD , "pcmpgtd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F66, 0), + INST(kX86InstPCmpGtQ , "pcmpgtq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3837, 0), + INST(kX86InstPCmpGtW , "pcmpgtw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F65, 0), + INST(kX86InstPCmpIStrI , "pcmpistri" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A63, 0), + INST(kX86InstPCmpIStrM , "pcmpistrm" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A62, 0), + INST(kX86InstPExtrB , "pextrb" , G(MmuExtract) , F(None) , O(Gd)|O(Gb)|O(Mem) , O(Xmm) , 0, 0x000F3A14, 0), + INST(kX86InstPExtrD , "pextrd" , G(MmuExtract) , F(None) , O(Gd) |O(Mem) , O(Xmm) , 0, 0x000F3A16, 0), + INST(kX86InstPExtrQ , "pextrq" , G(MmuExtract) , F(None) , O(Gqd) |O(Mem) , O(Xmm) , 1, 0x000F3A16, 0), + INST(kX86InstPExtrW , "pextrw" , G(MmuExtract) , F(None) , O(Gd) |O(Mem) , O(MmXmm) , 0, 0x000F3A15, 0), + INST(kX86InstPF2ID , "pf2id" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x1D), + INST(kX86InstPF2IW , "pf2iw" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x1C), + INST(kX86InstPFAcc , "pfacc" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xAE), + INST(kX86InstPFAdd , "pfadd" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x9E), + INST(kX86InstPFCmpEQ , "pfcmpeq" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xB0), + INST(kX86InstPFCmpGE , "pfcmpge" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x90), + INST(kX86InstPFCmpGT , "pfcmpgt" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA0), + INST(kX86InstPFMax , "pfmax" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA4), + INST(kX86InstPFMin , "pfmin" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x94), + INST(kX86InstPFMul , "pfmul" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xB4), + INST(kX86InstPFNAcc , "pfnacc" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x8A), + INST(kX86InstPFPNAcc , "pfpnacc" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x8E), + INST(kX86InstPFRcp , "pfrcp" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x96), + INST(kX86InstPFRcpIt1 , "pfrcpit1" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA6), + INST(kX86InstPFRcpIt2 , "pfrcpit2" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xB6), + INST(kX86InstPFRSqIt1 , "pfrsqit1" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xA7), + INST(kX86InstPFRSqrt , "pfrsqrt" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x97), + INST(kX86InstPFSub , "pfsub" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x9A), + INST(kX86InstPFSubR , "pfsubr" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xAA), + INST(kX86InstPHAddD , "phaddd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3802, 0), + INST(kX86InstPHAddSW , "phaddsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3803, 0), + INST(kX86InstPHAddW , "phaddw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3801, 0), + INST(kX86InstPHMinPOSUW , "phminposuw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3841, 0), + INST(kX86InstPHSubD , "phsubd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3806, 0), + INST(kX86InstPHSubSW , "phsubsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3807, 0), + INST(kX86InstPHSubW , "phsubw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3805, 0), + INST(kX86InstPI2FD , "pi2fd" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x0D), + INST(kX86InstPI2FW , "pi2fw" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0x0C), + INST(kX86InstPInsRB , "pinsrb" , G(MmuRmImm8) , F(None) , O(Xmm) , O(Gd) | O(Mem) , 0, 0x660F3A20, 0), + INST(kX86InstPInsRD , "pinsrd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(Gd) | O(Mem) , 0, 0x660F3A22, 0), + INST(kX86InstPInsRQ , "pinsrq" , G(MmuRmImm8) , F(None) , O(Xmm) , O(Gq) | O(Mem) , 0, 0x660F3A22, 0), + INST(kX86InstPInsRW , "pinsrw" , G(MmuRmImm8) , F(None) , O(MmXmm) , O(Gd) | O(Mem) , 0, 0x00000FC4, 0), + INST(kX86InstPMAddUBSW , "pmaddubsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3804, 0), + INST(kX86InstPMAddWD , "pmaddwd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF5, 0), + INST(kX86InstPMaxSB , "pmaxsb" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383C, 0), + INST(kX86InstPMaxSD , "pmaxsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383D, 0), + INST(kX86InstPMaxSW , "pmaxsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEE, 0), + INST(kX86InstPMaxUB , "pmaxub" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDE, 0), + INST(kX86InstPMaxUD , "pmaxud" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383F, 0), + INST(kX86InstPMaxUW , "pmaxuw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383E, 0), + INST(kX86InstPMinSB , "pminsb" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3838, 0), + INST(kX86InstPMinSD , "pminsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3839, 0), + INST(kX86InstPMinSW , "pminsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEA, 0), + INST(kX86InstPMinUB , "pminub" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FDA, 0), + INST(kX86InstPMinUD , "pminud" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383B, 0), + INST(kX86InstPMinUW , "pminuw" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F383A, 0), + INST(kX86InstPMovMskB , "pmovmskb" , G(MmuRmI) , F(Mov) , O(Gqd) , O(MmXmm) , 0, 0x00000FD7, 0), + INST(kX86InstPMovSXBD , "pmovsxbd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3821, 0), + INST(kX86InstPMovSXBQ , "pmovsxbq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3822, 0), + INST(kX86InstPMovSXBW , "pmovsxbw" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3820, 0), + INST(kX86InstPMovSXDQ , "pmovsxdq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3825, 0), + INST(kX86InstPMovSXWD , "pmovsxwd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3823, 0), + INST(kX86InstPMovSXWQ , "pmovsxwq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3824, 0), + INST(kX86InstPMovZXBD , "pmovzxbd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3831, 0), + INST(kX86InstPMovZXBQ , "pmovzxbq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3832, 0), + INST(kX86InstPMovZXBW , "pmovzxbw" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3830, 0), + INST(kX86InstPMovZXDQ , "pmovzxdq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3835, 0), + INST(kX86InstPMovZXWD , "pmovzxwd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3833, 0), + INST(kX86InstPMovZXWQ , "pmovzxwq" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3834, 0), + INST(kX86InstPMulDQ , "pmuldq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3828, 0), + INST(kX86InstPMulHRSW , "pmulhrsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F380B, 0), + INST(kX86InstPMulHUW , "pmulhuw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE4, 0), + INST(kX86InstPMulHW , "pmulhw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE5, 0), + INST(kX86InstPMulLD , "pmulld" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3840, 0), + INST(kX86InstPMulLW , "pmullw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD5, 0), + INST(kX86InstPMulUDQ , "pmuludq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF4, 0), + INST(kX86InstPop , "pop" , G(Pop) , F(Special) , 0 , 0 , 0, 0x00000058, 0x0000008F), + INST(kX86InstPopAD , "popad" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000061, 0), + INST(kX86InstPopCnt , "popcnt" , G(RegRm) , F(None) , O(Gqdw) , O(GqdwMem) , 0, 0xF3000FB8, 0), + INST(kX86InstPopFD , "popfd" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009D, 0), + INST(kX86InstPopFQ , "popfq" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009D, 0), + INST(kX86InstPOr , "por" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEB, 0), + INST(kX86InstPrefetch , "prefetch" , G(MmuPrefetch) , F(None) , O(Mem) , O(Imm) , 0, 0 , 0), + INST(kX86InstPSADBW , "psadbw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF6, 0), + INST(kX86InstPShufB , "pshufb" , G(MmuRmI) , F(Mov) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3800, 0), + INST(kX86InstPShufD , "pshufd" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F70, 0), + INST(kX86InstPShufW , "pshufw" , G(MmuRmImm8) , F(Mov) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F70, 0), + INST(kX86InstPShufHW , "pshufhw" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F70, 0), + INST(kX86InstPShufLW , "pshuflw" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF2000F70, 0), + INST(kX86InstPSignB , "psignb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3808, 0), + INST(kX86InstPSignD , "psignd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F380A, 0), + INST(kX86InstPSignW , "psignw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x000F3809, 0), + INST(kX86InstPSllD , "pslld" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 6, 0x00000FF2, 0x00000F72), + INST(kX86InstPSllDQ , "pslldq" , G(MmuRmI) , F(None) , O(Xmm) , O(Imm) , 7, 0 , 0x66000F73), + INST(kX86InstPSllQ , "psllq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 6, 0x00000FF3, 0x00000F73), + INST(kX86InstPSllW , "psllw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 6, 0x00000FF1, 0x00000F71), + INST(kX86InstPSraD , "psrad" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 4, 0x00000FE2, 0x00000F72), + INST(kX86InstPSraW , "psraw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 4, 0x00000FE1, 0x00000F71), + INST(kX86InstPSrlD , "psrld" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 2, 0x00000FD2, 0x00000F72), + INST(kX86InstPSrlDQ , "psrldq" , G(MmuRmI) , F(None) , O(Xmm) , O(Imm) , 3, 0 , 0x66000F73), + INST(kX86InstPSrlQ , "psrlq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 2, 0x00000FD3, 0x00000F73), + INST(kX86InstPSrlW , "psrlw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem)|O(Imm) , 2, 0x00000FD1, 0x00000F71), + INST(kX86InstPSubB , "psubb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF8, 0), + INST(kX86InstPSubD , "psubd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFA, 0), + INST(kX86InstPSubQ , "psubq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FFB, 0), + INST(kX86InstPSubSB , "psubsb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE8, 0), + INST(kX86InstPSubSW , "psubsw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FE9, 0), + INST(kX86InstPSubUSB , "psubusb" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD8, 0), + INST(kX86InstPSubUSW , "psubusw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FD9, 0), + INST(kX86InstPSubW , "psubw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FF9, 0), + INST(kX86InstPSwapD , "pswapd" , G(MmuRm3dNow) , F(None) , O(Mm) , O(MmMem) , 0, 0x00000F0F, 0xBB), + INST(kX86InstPTest , "ptest" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3817, 0), + INST(kX86InstPunpckHBW , "punpckhbw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F68, 0), + INST(kX86InstPunpckHDQ , "punpckhdq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F6A, 0), + INST(kX86InstPunpckHQDQ , "punpckhqdq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F6D, 0), + INST(kX86InstPunpckHWD , "punpckhwd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F69, 0), + INST(kX86InstPunpckLBW , "punpcklbw" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F60, 0), + INST(kX86InstPunpckLDQ , "punpckldq" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F62, 0), + INST(kX86InstPunpckLQDQ , "punpcklqdq" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F6C, 0), + INST(kX86InstPunpckLWD , "punpcklwd" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000F61, 0), + INST(kX86InstPush , "push" , G(Push) , F(Special) , 0 , 0 , 6, 0x00000050, 0x000000FF), + INST(kX86InstPushAD , "pushad" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000060, 0), + INST(kX86InstPushFD , "pushfd" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009C, 0), + INST(kX86InstPushFQ , "pushfq" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009C, 0), + INST(kX86InstPXor , "pxor" , G(MmuRmI) , F(None) , O(MmXmm) , O(MmXmmMem) , 0, 0x00000FEF, 0), + INST(kX86InstRcl , "rcl" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 2, 0 , 0), + INST(kX86InstRcpPS , "rcpps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F53, 0), + INST(kX86InstRcpSS , "rcpss" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0xF3000F53, 0), + INST(kX86InstRcr , "rcr" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 3, 0 , 0), + INST(kX86InstRdtsc , "rdtsc" , G(Emit) , F(Special) , 0 , 0 , 0, 0x00000F31, 0), + INST(kX86InstRdtscP , "rdtscp" , G(Emit) , F(Special) , 0 , 0 , 0, 0x000F01F9, 0), + INST(kX86InstRepLodSB , "rep lodsb" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 1 /* Size of mem */), + INST(kX86InstRepLodSD , "rep lodsd" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 4 /* Size of mem */), + INST(kX86InstRepLodSQ , "rep lodsq" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 8 /* Size of mem */), + INST(kX86InstRepLodSW , "rep lodsw" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AC, 2 /* Size of mem */), + INST(kX86InstRepMovSB , "rep movsb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 1 /* Size of mem */), + INST(kX86InstRepMovSD , "rep movsd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 4 /* Size of mem */), + INST(kX86InstRepMovSQ , "rep movsq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 8 /* Size of mem */), + INST(kX86InstRepMovSW , "rep movsw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A4, 2 /* Size of mem */), + INST(kX86InstRepStoSB , "rep stosb" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 1 /* Size of mem */), + INST(kX86InstRepStoSD , "rep stosd" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 4 /* Size of mem */), + INST(kX86InstRepStoSQ , "rep stosq" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 8 /* Size of mem */), + INST(kX86InstRepStoSW , "rep stosw" , G(Rep) , F(Special) , O(Mem) , 0 , 0, 0xF30000AA, 2 /* Size of mem */), + INST(kX86InstRepECmpSB , "repe cmpsb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 1 /* Size of mem */), + INST(kX86InstRepECmpSD , "repe cmpsd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 4 /* Size of mem */), + INST(kX86InstRepECmpSQ , "repe cmpsq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 8 /* Size of mem */), + INST(kX86InstRepECmpSW , "repe cmpsw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000A6, 2 /* Size of mem */), + INST(kX86InstRepEScaSB , "repe scasb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 1 /* Size of mem */), + INST(kX86InstRepEScaSD , "repe scasd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 4 /* Size of mem */), + INST(kX86InstRepEScaSQ , "repe scasq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 8 /* Size of mem */), + INST(kX86InstRepEScaSW , "repe scasw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF30000AE, 2 /* Size of mem */), + INST(kX86InstRepNECmpSB , "repne cmpsb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 1 /* Size of mem */), + INST(kX86InstRepNECmpSD , "repne cmpsd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 4 /* Size of mem */), + INST(kX86InstRepNECmpSQ , "repne cmpsq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 8 /* Size of mem */), + INST(kX86InstRepNECmpSW , "repne cmpsw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000A6, 2 /* Size of mem */), + INST(kX86InstRepNEScaSB , "repne scasb" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 1 /* Size of mem */), + INST(kX86InstRepNEScaSD , "repne scasd" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 4 /* Size of mem */), + INST(kX86InstRepNEScaSQ , "repne scasq" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 8 /* Size of mem */), + INST(kX86InstRepNEScaSW , "repne scasw" , G(Rep) , F(Special) , O(Mem) , O(Mem) , 0, 0xF20000AE, 2 /* Size of mem */), + INST(kX86InstRet , "ret" , G(Ret) , F(Special) , 0 , 0 , 0, 0 , 0), + INST(kX86InstRol , "rol" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 0, 0 , 0), + INST(kX86InstRor , "ror" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 1, 0 , 0), + INST(kX86InstRoundPD , "roundpd" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3A09, 0), + INST(kX86InstRoundPS , "roundps" , G(MmuRmImm8) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x660F3A08, 0), + INST(kX86InstRoundSD , "roundsd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0B, 0), + INST(kX86InstRoundSS , "roundss" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x660F3A0A, 0), + INST(kX86InstRSqrtPS , "rsqrtps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F52, 0), + INST(kX86InstRSqrtSS , "rsqrtss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F52, 0), + INST(kX86InstSahf , "sahf" , G(Emit) , F(Special) , 0 , 0 , 0, 0x0000009E, 0), + INST(kX86InstSal , "sal" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 4, 0 , 0), + INST(kX86InstSar , "sar" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 7, 0 , 0), + INST(kX86InstSbb , "sbb" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 3, 0x00000018, 0x00000080), + INST(kX86InstSetA , "seta" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F97, 0), + INST(kX86InstSetAE , "setae" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F93, 0), + INST(kX86InstSetB , "setb" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F92, 0), + INST(kX86InstSetBE , "setbe" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F96, 0), + INST(kX86InstSetC , "setc" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F92, 0), + INST(kX86InstSetE , "sete" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F94, 0), + INST(kX86InstSetG , "setg" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9F, 0), + INST(kX86InstSetGE , "setge" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9D, 0), + INST(kX86InstSetL , "setl" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9C, 0), + INST(kX86InstSetLE , "setle" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9E, 0), + INST(kX86InstSetNA , "setna" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F96, 0), + INST(kX86InstSetNAE , "setnae" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F92, 0), + INST(kX86InstSetNB , "setnb" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F93, 0), + INST(kX86InstSetNBE , "setnbe" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F97, 0), + INST(kX86InstSetNC , "setnc" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F93, 0), + INST(kX86InstSetNE , "setne" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F95, 0), + INST(kX86InstSetNG , "setng" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9E, 0), + INST(kX86InstSetNGE , "setnge" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9C, 0), + INST(kX86InstSetNL , "setnl" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9D, 0), + INST(kX86InstSetNLE , "setnle" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9F, 0), + INST(kX86InstSetNO , "setno" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F91, 0), + INST(kX86InstSetNP , "setnp" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9B, 0), + INST(kX86InstSetNS , "setns" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F99, 0), + INST(kX86InstSetNZ , "setnz" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F95, 0), + INST(kX86InstSetO , "seto" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F90, 0), + INST(kX86InstSetP , "setp" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9A, 0), + INST(kX86InstSetPE , "setpe" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9A, 0), + INST(kX86InstSetPO , "setpo" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F9B, 0), + INST(kX86InstSetS , "sets" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F98, 0), + INST(kX86InstSetZ , "setz" , G(RmByte) , F(None) , O(GbMem) , 0 , 0, 0x00000F94, 0), + INST(kX86InstSFence , "sfence" , G(Emit) , F(None) , 0 , 0 , 0, 0x000FAEF8, 0), + INST(kX86InstShl , "shl" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 4, 0 , 0), + INST(kX86InstShld , "shld" , G(ShldShrd) , F(Special) , O(GqdwbMem) , O(Gb) , 0, 0x00000FA4, 0), + INST(kX86InstShr , "shr" , G(Rot) , F(Special) , O(GqdwbMem) , O(Gb)|O(Imm) , 5, 0 , 0), + INST(kX86InstShrd , "shrd" , G(ShldShrd) , F(Special) , O(GqdwbMem) , O(Gqdwb) , 0, 0x00000FAC, 0), + INST(kX86InstShufPD , "shufpd" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000FC6, 0), + INST(kX86InstShufPS , "shufps" , G(MmuRmImm8) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000FC6, 0), + INST(kX86InstSqrtPD , "sqrtpd" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x66000F51, 0), + INST(kX86InstSqrtPS , "sqrtps" , G(MmuRmI) , F(Mov) , O(Xmm) , O(XmmMem) , 0, 0x00000F51, 0), + INST(kX86InstSqrtSD , "sqrtsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F51, 0), + INST(kX86InstSqrtSS , "sqrtss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F51, 0), + INST(kX86InstStc , "stc" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000F9, 0), + INST(kX86InstStd , "std" , G(Emit) , F(None) , 0 , 0 , 0, 0x000000FD, 0), + INST(kX86InstStMXCSR , "stmxcsr" , G(Mem) , F(None) , O(Mem) , 0 , 3, 0x00000FAE, 0), + INST(kX86InstSub , "sub" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 5, 0x00000028, 0x00000080), + INST(kX86InstSubPD , "subpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F5C, 0), + INST(kX86InstSubPS , "subps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F5C, 0), + INST(kX86InstSubSD , "subsd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF2000F5C, 0), + INST(kX86InstSubSS , "subss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0xF3000F5C, 0), + INST(kX86InstTest , "test" , G(Test) , F(None) , O(GqdwbMem) , O(Gqdwb)|O(Imm) , 0, 0 , 0), + INST(kX86InstUComISD , "ucomisd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F2E, 0), + INST(kX86InstUComISS , "ucomiss" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F2E, 0), + INST(kX86InstUd2 , "ud2" , G(Emit) , F(None) , 0 , 0 , 0, 0x00000F0B, 0), + INST(kX86InstUnpckHPD , "unpckhpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F15, 0), + INST(kX86InstUnpckHPS , "unpckhps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F15, 0), + INST(kX86InstUnpckLPD , "unpcklpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F14, 0), + INST(kX86InstUnpckLPS , "unpcklps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F14, 0), + INST(kX86InstXadd , "xadd" , G(RmReg) , F(Lockable) , O(GqdwbMem) , O(Gqdwb) , 0, 0x00000FC0, 0), + INST(kX86InstXchg , "xchg" , G(Xchg) , F(Lockable) , O(GqdwbMem) , O(Gqdwb) , 0, 0 , 0), + INST(kX86InstXor , "xor" , G(Arith) , F(Lockable) , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , 6, 0x00000030, 0x00000080), + INST(kX86InstXorPD , "xorpd" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x66000F57, 0), + INST(kX86InstXorPS , "xorps" , G(MmuRmI) , F(None) , O(Xmm) , O(XmmMem) , 0, 0x00000F57, 0) }; #undef G @@ -1795,17 +1795,17 @@ const X86VarInfo x86VarInfo[] = { - /* 0 */ { kX86RegTypeGpd , 4 , C(Gp) , 0 , "Gpd" }, - /* 1 */ { kX86RegTypeGpq , 8 , C(Gp) , 0 , "Gpq" }, - /* 2 */ { kX86RegTypeX87 , 4 , C(X87), F(SP) , "X87" }, - /* 3 */ { kX86RegTypeX87 , 4 , C(X87), F(SP) , "X87.SS" }, - /* 4 */ { kX86RegTypeX87 , 8 , C(X87), F(DP) , "X87.SD" }, - /* 5 */ { kX86RegTypeMm , 8 , C(Mm) , 0 , "Mm" }, - /* 6 */ { kX86RegTypeXmm , 16, C(Xmm), 0 , "Xmm" }, - /* 7 */ { kX86RegTypeXmm , 4 , C(Xmm), F(SP) , "Xmm.SS" }, - /* 8 */ { kX86RegTypeXmm , 8 , C(Xmm), F(DP) , "Xmm.SD" }, - /* 9 */ { kX86RegTypeXmm , 16, C(Xmm), F(SP) | F(Packed), "Xmm.PS" }, - /* 10 */ { kX86RegTypeXmm , 16, C(Xmm), F(DP) | F(Packed), "Xmm.PD" } + /* 0 */ { kX86RegTypeGpd , 4 , C(Gp) , 0 , "Gpd" }, + /* 1 */ { kX86RegTypeGpq , 8 , C(Gp) , 0 , "Gpq" }, + /* 2 */ { kX86RegTypeX87 , 4 , C(X87), F(SP) , "X87" }, + /* 3 */ { kX86RegTypeX87 , 4 , C(X87), F(SP) , "X87.SS" }, + /* 4 */ { kX86RegTypeX87 , 8 , C(X87), F(DP) , "X87.SD" }, + /* 5 */ { kX86RegTypeMm , 8 , C(Mm) , 0 , "Mm" }, + /* 6 */ { kX86RegTypeXmm , 16, C(Xmm), 0 , "Xmm" }, + /* 7 */ { kX86RegTypeXmm , 4 , C(Xmm), F(SP) , "Xmm.SS" }, + /* 8 */ { kX86RegTypeXmm , 8 , C(Xmm), F(DP) , "Xmm.SD" }, + /* 9 */ { kX86RegTypeXmm , 16, C(Xmm), F(SP) | F(Packed), "Xmm.PS" }, + /* 10 */ { kX86RegTypeXmm , 16, C(Xmm), F(DP) | F(Packed), "Xmm.PD" } }; #undef F
--- a/src/in_2sf/desmume/utils/AsmJit/x86/x86func.cpp +++ b/src/in_2sf/desmume/utils/AsmJit/x86/x86func.cpp @@ -18,7 +18,8 @@ // [Api-Begin] #include "../core/apibegin.h" -namespace AsmJit { +namespace AsmJit +{ // ============================================================================ // [AsmJit::X86FuncDecl - Accessors] @@ -26,335 +27,279 @@ uint32_t X86FuncDecl::findArgumentByRegCode(uint32_t regCode) const { - uint32_t type = regCode & kRegTypeMask; - uint32_t idx = regCode & kRegIndexMask; - - uint32_t clazz; - - switch (type) - { - case kX86RegTypeGpd: - case kX86RegTypeGpq: - clazz = kX86VarClassGp; - break; - - case kX86RegTypeX87: - clazz = kX86VarClassX87; - break; - - case kX86RegTypeMm: - clazz = kX86VarClassMm; - break; - - case kX86RegTypeXmm: - clazz = kX86VarClassXmm; - break; - - default: - return kInvalidValue; - } - - for (uint32_t i = 0; i < _argumentsCount; i++) - { - const FuncArg& arg = _arguments[i]; - - if (arg.getRegIndex() == idx && (X86Util::getVarClassFromVarType(arg.getVarType()) & clazz)) - return i; - } - - return kInvalidValue; + uint32_t type = regCode & kRegTypeMask; + uint32_t idx = regCode & kRegIndexMask; + + uint32_t clazz; + + switch (type) + { + case kX86RegTypeGpd: + case kX86RegTypeGpq: + clazz = kX86VarClassGp; + break; + + case kX86RegTypeX87: + clazz = kX86VarClassX87; + break; + + case kX86RegTypeMm: + clazz = kX86VarClassMm; + break; + + case kX86RegTypeXmm: + clazz = kX86VarClassXmm; + break; + + default: + return kInvalidValue; + } + + for (uint32_t i = 0; i < this->_argumentsCount; ++i) + { + const FuncArg &arg = this->_arguments[i]; + + if (arg.getRegIndex() == idx && (X86Util::getVarClassFromVarType(arg.getVarType()) & clazz)) + return i; + } + + return kInvalidValue; } // ============================================================================ // [AsmJit::X86FuncDecl - SetPrototype - InitCallingConvention] // ============================================================================ -static void X86FuncDecl_initCallingConvention(X86FuncDecl* self, uint32_t convention) +static void X86FuncDecl_initCallingConvention(X86FuncDecl *self, uint32_t convention) { - uint32_t i; - - // -------------------------------------------------------------------------- - // [Inir] - // -------------------------------------------------------------------------- - - self->_convention = convention; - self->_calleePopsStack = false; - self->_argumentsDirection = kFuncArgsRTL; - - for (i = 0; i < ASMJIT_ARRAY_SIZE(self->_gpList); i++) - self->_gpList[i] = kRegIndexInvalid; - - for (i = 0; i < ASMJIT_ARRAY_SIZE(self->_xmmList); i++) - self->_xmmList[i] = kRegIndexInvalid; - - self->_gpListMask = 0x0; - self->_mmListMask = 0x0; - self->_xmmListMask = 0x0; - - self->_gpPreservedMask = 0x0; - self->_mmPreservedMask = 0x0; - self->_xmmPreservedMask = 0x0; - - // -------------------------------------------------------------------------- - // [X86 Calling Conventions] - // -------------------------------------------------------------------------- - -#if defined(ASMJIT_X86) - self->_gpPreservedMask = static_cast<uint16_t>( - IntUtil::maskFromIndex(kX86RegIndexEbx) | - IntUtil::maskFromIndex(kX86RegIndexEsp) | - IntUtil::maskFromIndex(kX86RegIndexEbp) | - IntUtil::maskFromIndex(kX86RegIndexEsi) | - IntUtil::maskFromIndex(kX86RegIndexEdi)); - self->_xmmPreservedMask = 0; - - switch (convention) - { - // ------------------------------------------------------------------------ - // [CDecl] - // ------------------------------------------------------------------------ - - case kX86FuncConvCDecl: - break; - - // ------------------------------------------------------------------------ - // [StdCall] - // ------------------------------------------------------------------------ - - case kX86FuncConvStdCall: - self->_calleePopsStack = true; - break; - - // ------------------------------------------------------------------------ - // [MS-ThisCall] - // ------------------------------------------------------------------------ - - case kX86FuncConvMsThisCall: - self->_calleePopsStack = true; - - self->_gpList[0] = kX86RegIndexEcx; - - self->_gpListMask = static_cast<uint16_t>( - IntUtil::maskFromIndex(kX86RegIndexEcx)); - break; - - // ------------------------------------------------------------------------ - // [MS-FastCall] - // ------------------------------------------------------------------------ - - case kX86FuncConvMsFastCall: - self->_calleePopsStack = true; - - self->_gpList[0] = kX86RegIndexEcx; - self->_gpList[1] = kX86RegIndexEdx; - - self->_gpListMask = static_cast<uint16_t>( - IntUtil::maskFromIndex(kX86RegIndexEcx) | - IntUtil::maskFromIndex(kX86RegIndexEdx)); - break; - - // ------------------------------------------------------------------------ - // [Borland-FastCall] - // ------------------------------------------------------------------------ - - case kX86FuncConvBorlandFastCall: - self->_calleePopsStack = true; - self->_argumentsDirection = kFuncArgsLTR; - - self->_gpList[0] = kX86RegIndexEax; - self->_gpList[1] = kX86RegIndexEdx; - self->_gpList[2] = kX86RegIndexEcx; - - self->_gpListMask = static_cast<uint16_t>( - IntUtil::maskFromIndex(kX86RegIndexEax) | - IntUtil::maskFromIndex(kX86RegIndexEdx) | - IntUtil::maskFromIndex(kX86RegIndexEcx)); - break; - - // ------------------------------------------------------------------------ - // [Gcc-FastCall] - // ------------------------------------------------------------------------ - - case kX86FuncConvGccFastCall: - self->_calleePopsStack = true; - - self->_gpList[0] = kX86RegIndexEcx; - self->_gpList[1] = kX86RegIndexEdx; - - self->_gpListMask = static_cast<uint16_t>( - IntUtil::maskFromIndex(kX86RegIndexEcx) | - IntUtil::maskFromIndex(kX86RegIndexEdx)); - break; - - // ------------------------------------------------------------------------ - // [Gcc-Regparm(1)] - // ------------------------------------------------------------------------ - - case kX86FuncConvGccRegParm1: - self->_calleePopsStack = false; - - self->_gpList[0] = kX86RegIndexEax; - self->_gpListMask = static_cast<uint16_t>( - IntUtil::maskFromIndex(kX86RegIndexEax)); - break; - - // ------------------------------------------------------------------------ - // [Gcc-Regparm(2)] - // ------------------------------------------------------------------------ - - case kX86FuncConvGccRegParm2: - self->_calleePopsStack = false; - - self->_gpList[0] = kX86RegIndexEax; - self->_gpList[1] = kX86RegIndexEdx; - - self->_gpListMask = static_cast<uint16_t>( - IntUtil::maskFromIndex(kX86RegIndexEax) | - IntUtil::maskFromIndex(kX86RegIndexEdx)); - break; - - // ------------------------------------------------------------------------ - // [Gcc-Regparm(3)] - // ------------------------------------------------------------------------ - - case kX86FuncConvGccRegParm3: - self->_calleePopsStack = false; - - self->_gpList[0] = kX86RegIndexEax; - self->_gpList[1] = kX86RegIndexEdx; - self->_gpList[2] = kX86RegIndexEcx; - - self->_gpListMask = static_cast<uint16_t>( - IntUtil::maskFromIndex(kX86RegIndexEax) | - IntUtil::maskFromIndex(kX86RegIndexEdx) | - IntUtil::maskFromIndex(kX86RegIndexEcx)); - break; - - // ------------------------------------------------------------------------ - // [Illegal] - // ------------------------------------------------------------------------ - - default: - // Illegal calling convention. - ASMJIT_ASSERT(0); - } + uint32_t i; + + // -------------------------------------------------------------------------- + // [Inir] + // -------------------------------------------------------------------------- + + self->_convention = convention; + self->_calleePopsStack = false; + self->_argumentsDirection = kFuncArgsRTL; + + for (i = 0; i < ASMJIT_ARRAY_SIZE(self->_gpList); ++i) + self->_gpList[i] = kRegIndexInvalid; + + for (i = 0; i < ASMJIT_ARRAY_SIZE(self->_xmmList); ++i) + self->_xmmList[i] = kRegIndexInvalid; + + self->_gpListMask = 0x0; + self->_mmListMask = 0x0; + self->_xmmListMask = 0x0; + + self->_gpPreservedMask = 0x0; + self->_mmPreservedMask = 0x0; + self->_xmmPreservedMask = 0x0; + + // -------------------------------------------------------------------------- + // [X86 Calling Conventions] + // -------------------------------------------------------------------------- + +#ifdef ASMJIT_X86 + self->_gpPreservedMask = static_cast<uint16_t>(IntUtil::maskFromIndex(kX86RegIndexEbx) | IntUtil::maskFromIndex(kX86RegIndexEsp) | IntUtil::maskFromIndex(kX86RegIndexEbp) | + IntUtil::maskFromIndex(kX86RegIndexEsi) | IntUtil::maskFromIndex(kX86RegIndexEdi)); + self->_xmmPreservedMask = 0; + + switch (convention) + { + // ------------------------------------------------------------------------ + // [CDecl] + // ------------------------------------------------------------------------ + + case kX86FuncConvCDecl: + break; + + // ------------------------------------------------------------------------ + // [StdCall] + // ------------------------------------------------------------------------ + + case kX86FuncConvStdCall: + self->_calleePopsStack = true; + break; + + // ------------------------------------------------------------------------ + // [MS-ThisCall] + // ------------------------------------------------------------------------ + + case kX86FuncConvMsThisCall: + self->_calleePopsStack = true; + + self->_gpList[0] = kX86RegIndexEcx; + + self->_gpListMask = static_cast<uint16_t>(IntUtil::maskFromIndex(kX86RegIndexEcx)); + break; + + // ------------------------------------------------------------------------ + // [MS-FastCall] + // ------------------------------------------------------------------------ + + case kX86FuncConvMsFastCall: + self->_calleePopsStack = true; + + self->_gpList[0] = kX86RegIndexEcx; + self->_gpList[1] = kX86RegIndexEdx; + + self->_gpListMask = static_cast<uint16_t>(IntUtil::maskFromIndex(kX86RegIndexEcx) | IntUtil::maskFromIndex(kX86RegIndexEdx)); + break; + + // ------------------------------------------------------------------------ + // [Borland-FastCall] + // ------------------------------------------------------------------------ + + case kX86FuncConvBorlandFastCall: + self->_calleePopsStack = true; + self->_argumentsDirection = kFuncArgsLTR; + + self->_gpList[0] = kX86RegIndexEax; + self->_gpList[1] = kX86RegIndexEdx; + self->_gpList[2] = kX86RegIndexEcx; + + self->_gpListMask = static_cast<uint16_t>(IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEdx) | IntUtil::maskFromIndex(kX86RegIndexEcx)); + break; + + // ------------------------------------------------------------------------ + // [Gcc-FastCall] + // ------------------------------------------------------------------------ + + case kX86FuncConvGccFastCall: + self->_calleePopsStack = true; + + self->_gpList[0] = kX86RegIndexEcx; + self->_gpList[1] = kX86RegIndexEdx; + + self->_gpListMask = static_cast<uint16_t>(IntUtil::maskFromIndex(kX86RegIndexEcx) | IntUtil::maskFromIndex(kX86RegIndexEdx)); + break; + + // ------------------------------------------------------------------------ + // [Gcc-Regparm(1)] + // ------------------------------------------------------------------------ + + case kX86FuncConvGccRegParm1: + self->_calleePopsStack = false; + + self->_gpList[0] = kX86RegIndexEax; + self->_gpListMask = static_cast<uint16_t>(IntUtil::maskFromIndex(kX86RegIndexEax)); + break; + + // ------------------------------------------------------------------------ + // [Gcc-Regparm(2)] + // ------------------------------------------------------------------------ + + case kX86FuncConvGccRegParm2: + self->_calleePopsStack = false; + + self->_gpList[0] = kX86RegIndexEax; + self->_gpList[1] = kX86RegIndexEdx; + + self->_gpListMask = static_cast<uint16_t>(IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEdx)); + break; + + // ------------------------------------------------------------------------ + // [Gcc-Regparm(3)] + // ------------------------------------------------------------------------ + + case kX86FuncConvGccRegParm3: + self->_calleePopsStack = false; + + self->_gpList[0] = kX86RegIndexEax; + self->_gpList[1] = kX86RegIndexEdx; + self->_gpList[2] = kX86RegIndexEcx; + + self->_gpListMask = static_cast<uint16_t>(IntUtil::maskFromIndex(kX86RegIndexEax) | IntUtil::maskFromIndex(kX86RegIndexEdx) | IntUtil::maskFromIndex(kX86RegIndexEcx)); + break; + + // ------------------------------------------------------------------------ + // [Illegal] + // ------------------------------------------------------------------------ + + default: + // Illegal calling convention. + ASMJIT_ASSERT(0); + } #endif // ASMJIT_X86 - // -------------------------------------------------------------------------- - // [X64 Calling Conventions] - // -------------------------------------------------------------------------- - -#if defined(ASMJIT_X64) - switch (convention) - { - // ------------------------------------------------------------------------ - // [X64-Windows] - // ------------------------------------------------------------------------ - - case kX86FuncConvX64W: - self->_gpList[0] = kX86RegIndexRcx; - self->_gpList[1] = kX86RegIndexRdx; - self->_gpList[2] = kX86RegIndexR8; - self->_gpList[3] = kX86RegIndexR9; - - self->_xmmList[0] = kX86RegIndexXmm0; - self->_xmmList[1] = kX86RegIndexXmm1; - self->_xmmList[2] = kX86RegIndexXmm2; - self->_xmmList[3] = kX86RegIndexXmm3; - - self->_gpListMask = static_cast<uint16_t>( - IntUtil::maskFromIndex(kX86RegIndexRcx ) | - IntUtil::maskFromIndex(kX86RegIndexRdx ) | - IntUtil::maskFromIndex(kX86RegIndexR8 ) | - IntUtil::maskFromIndex(kX86RegIndexR9 )); - - self->_xmmListMask = static_cast<uint16_t>( - IntUtil::maskFromIndex(kX86RegIndexXmm0 ) | - IntUtil::maskFromIndex(kX86RegIndexXmm1 ) | - IntUtil::maskFromIndex(kX86RegIndexXmm2 ) | - IntUtil::maskFromIndex(kX86RegIndexXmm3 )); - - self->_gpPreservedMask = static_cast<uint16_t>( - IntUtil::maskFromIndex(kX86RegIndexRbx ) | - IntUtil::maskFromIndex(kX86RegIndexRsp ) | - IntUtil::maskFromIndex(kX86RegIndexRbp ) | - IntUtil::maskFromIndex(kX86RegIndexRsi ) | - IntUtil::maskFromIndex(kX86RegIndexRdi ) | - IntUtil::maskFromIndex(kX86RegIndexR12 ) | - IntUtil::maskFromIndex(kX86RegIndexR13 ) | - IntUtil::maskFromIndex(kX86RegIndexR14 ) | - IntUtil::maskFromIndex(kX86RegIndexR15 )); - - self->_xmmPreservedMask = static_cast<uint16_t>( - IntUtil::maskFromIndex(kX86RegIndexXmm6 ) | - IntUtil::maskFromIndex(kX86RegIndexXmm7 ) | - IntUtil::maskFromIndex(kX86RegIndexXmm8 ) | - IntUtil::maskFromIndex(kX86RegIndexXmm9 ) | - IntUtil::maskFromIndex(kX86RegIndexXmm10) | - IntUtil::maskFromIndex(kX86RegIndexXmm11) | - IntUtil::maskFromIndex(kX86RegIndexXmm12) | - IntUtil::maskFromIndex(kX86RegIndexXmm13) | - IntUtil::maskFromIndex(kX86RegIndexXmm14) | - IntUtil::maskFromIndex(kX86RegIndexXmm15)); - break; - - // ------------------------------------------------------------------------ - // [X64-Unix] - // ------------------------------------------------------------------------ - - case kX86FuncConvX64U: - self->_gpList[0] = kX86RegIndexRdi; - self->_gpList[1] = kX86RegIndexRsi; - self->_gpList[2] = kX86RegIndexRdx; - self->_gpList[3] = kX86RegIndexRcx; - self->_gpList[4] = kX86RegIndexR8; - self->_gpList[5] = kX86RegIndexR9; - - self->_xmmList[0] = kX86RegIndexXmm0; - self->_xmmList[1] = kX86RegIndexXmm1; - self->_xmmList[2] = kX86RegIndexXmm2; - self->_xmmList[3] = kX86RegIndexXmm3; - self->_xmmList[4] = kX86RegIndexXmm4; - self->_xmmList[5] = kX86RegIndexXmm5; - self->_xmmList[6] = kX86RegIndexXmm6; - self->_xmmList[7] = kX86RegIndexXmm7; - - self->_gpListMask = static_cast<uint16_t>( - IntUtil::maskFromIndex(kX86RegIndexRdi ) | - IntUtil::maskFromIndex(kX86RegIndexRsi ) | - IntUtil::maskFromIndex(kX86RegIndexRdx ) | - IntUtil::maskFromIndex(kX86RegIndexRcx ) | - IntUtil::maskFromIndex(kX86RegIndexR8 ) | - IntUtil::maskFromIndex(kX86RegIndexR9 )); - - self->_xmmListMask = static_cast<uint16_t>( - IntUtil::maskFromIndex(kX86RegIndexXmm0 ) | - IntUtil::maskFromIndex(kX86RegIndexXmm1 ) | - IntUtil::maskFromIndex(kX86RegIndexXmm2 ) | - IntUtil::maskFromIndex(kX86RegIndexXmm3 ) | - IntUtil::maskFromIndex(kX86RegIndexXmm4 ) | - IntUtil::maskFromIndex(kX86RegIndexXmm5 ) | - IntUtil::maskFromIndex(kX86RegIndexXmm6 ) | - IntUtil::maskFromIndex(kX86RegIndexXmm7 )); - - self->_gpPreservedMask = static_cast<uint16_t>( - IntUtil::maskFromIndex(kX86RegIndexRbx ) | - IntUtil::maskFromIndex(kX86RegIndexRsp ) | - IntUtil::maskFromIndex(kX86RegIndexRbp ) | - IntUtil::maskFromIndex(kX86RegIndexR12 ) | - IntUtil::maskFromIndex(kX86RegIndexR13 ) | - IntUtil::maskFromIndex(kX86RegIndexR14 ) | - IntUtil::maskFromIndex(kX86RegIndexR15 )); - break; - - // ------------------------------------------------------------------------ - // [Illegal] - // ------------------------------------------------------------------------ - - default: - // Illegal calling convention. - ASMJIT_ASSERT(0); - } + // -------------------------------------------------------------------------- + // [X64 Calling Conventions] + // -------------------------------------------------------------------------- + +#ifdef ASMJIT_X64 + switch (convention) + { + // ------------------------------------------------------------------------ + // [X64-Windows] + // ------------------------------------------------------------------------ + + case kX86FuncConvX64W: + self->_gpList[0] = kX86RegIndexRcx; + self->_gpList[1] = kX86RegIndexRdx; + self->_gpList[2] = kX86RegIndexR8; + self->_gpList[3] = kX86RegIndexR9; + + self->_xmmList[0] = kX86RegIndexXmm0; + self->_xmmList[1] = kX86RegIndexXmm1; + self->_xmmList[2] = kX86RegIndexXmm2; + self->_xmmList[3] = kX86RegIndexXmm3; + + self->_gpListMask = static_cast<uint16_t>(IntUtil::maskFromIndex(kX86RegIndexRcx) | IntUtil::maskFromIndex(kX86RegIndexRdx) | IntUtil::maskFromIndex(kX86RegIndexR8) | + IntUtil::maskFromIndex(kX86RegIndexR9)); + + self->_xmmListMask = static_cast<uint16_t>(IntUtil::maskFromIndex(kX86RegIndexXmm0) | IntUtil::maskFromIndex(kX86RegIndexXmm1) | IntUtil::maskFromIndex(kX86RegIndexXmm2) | + IntUtil::maskFromIndex(kX86RegIndexXmm3)); + + self->_gpPreservedMask = static_cast<uint16_t>(IntUtil::maskFromIndex(kX86RegIndexRbx) | IntUtil::maskFromIndex(kX86RegIndexRsp) | IntUtil::maskFromIndex(kX86RegIndexRbp) | + IntUtil::maskFromIndex(kX86RegIndexRsi) | IntUtil::maskFromIndex(kX86RegIndexRdi) | IntUtil::maskFromIndex(kX86RegIndexR12) | IntUtil::maskFromIndex(kX86RegIndexR13) | + IntUtil::maskFromIndex(kX86RegIndexR14) | IntUtil::maskFromIndex(kX86RegIndexR15)); + + self->_xmmPreservedMask = static_cast<uint16_t>(IntUtil::maskFromIndex(kX86RegIndexXmm6) | IntUtil::maskFromIndex(kX86RegIndexXmm7) | IntUtil::maskFromIndex(kX86RegIndexXmm8) | + IntUtil::maskFromIndex(kX86RegIndexXmm9) | IntUtil::maskFromIndex(kX86RegIndexXmm10) | IntUtil::maskFromIndex(kX86RegIndexXmm11) | IntUtil::maskFromIndex(kX86RegIndexXmm12) | + IntUtil::maskFromIndex(kX86RegIndexXmm13) | IntUtil::maskFromIndex(kX86RegIndexXmm14) | IntUtil::maskFromIndex(kX86RegIndexXmm15)); + break; + + // ------------------------------------------------------------------------ + // [X64-Unix] + // ------------------------------------------------------------------------ + + case kX86FuncConvX64U: + self->_gpList[0] = kX86RegIndexRdi; + self->_gpList[1] = kX86RegIndexRsi; + self->_gpList[2] = kX86RegIndexRdx; + self->_gpList[3] = kX86RegIndexRcx; + self->_gpList[4] = kX86RegIndexR8; + self->_gpList[5] = kX86RegIndexR9; + + self->_xmmList[0] = kX86RegIndexXmm0; + self->_xmmList[1] = kX86RegIndexXmm1; + self->_xmmList[2] = kX86RegIndexXmm2; + self->_xmmList[3] = kX86RegIndexXmm3; + self->_xmmList[4] = kX86RegIndexXmm4; + self->_xmmList[5] = kX86RegIndexXmm5; + self->_xmmList[6] = kX86RegIndexXmm6; + self->_xmmList[7] = kX86RegIndexXmm7; + + self->_gpListMask = static_cast<uint16_t>(IntUtil::maskFromIndex(kX86RegIndexRdi) | IntUtil::maskFromIndex(kX86RegIndexRsi) | IntUtil::maskFromIndex(kX86RegIndexRdx) | + IntUtil::maskFromIndex(kX86RegIndexRcx) | IntUtil::maskFromIndex(kX86RegIndexR8) | IntUtil::maskFromIndex(kX86RegIndexR9)); + + self->_xmmListMask = static_cast<uint16_t>(IntUtil::maskFromIndex(kX86RegIndexXmm0) | IntUtil::maskFromIndex(kX86RegIndexXmm1) | IntUtil::maskFromIndex(kX86RegIndexXmm2) | + IntUtil::maskFromIndex(kX86RegIndexXmm3) | IntUtil::maskFromIndex(kX86RegIndexXmm4) | IntUtil::maskFromIndex(kX86RegIndexXmm5) | IntUtil::maskFromIndex(kX86RegIndexXmm6) | + IntUtil::maskFromIndex(kX86RegIndexXmm7)); + + self->_gpPreservedMask = static_cast<uint16_t>(IntUtil::maskFromIndex(kX86RegIndexRbx) | IntUtil::maskFromIndex(kX86RegIndexRsp) | IntUtil::maskFromIndex(kX86RegIndexRbp) | + IntUtil::maskFromIndex(kX86RegIndexR12) | IntUtil::maskFromIndex(kX86RegIndexR13) | IntUtil::maskFromIndex(kX86RegIndexR14) | IntUtil::maskFromIndex(kX86RegIndexR15)); + break; + + // ------------------------------------------------------------------------ + // [Illegal] + // ------------------------------------------------------------------------ + + default: + // Illegal calling convention. + ASMJIT_ASSERT(0); + } #endif // ASMJIT_X64 } @@ -362,230 +307,227 @@ // [AsmJit::X86FuncDecl - SetPrototype - InitDefinition] // ============================================================================ -static void X86FuncDecl_initDefinition(X86FuncDecl* self, - uint32_t returnType, const uint32_t* argumentsData, uint32_t argumentsCount) +static void X86FuncDecl_initDefinition(X86FuncDecl *self, uint32_t returnType, const uint32_t *argumentsData, uint32_t argumentsCount) { - ASMJIT_ASSERT(argumentsCount <= kFuncArgsMax); - - // -------------------------------------------------------------------------- - // [Init] - // -------------------------------------------------------------------------- - - int32_t i = 0; - int32_t gpPos = 0; - int32_t stackOffset = 0; - - self->_returnType = returnType; - self->_argumentsCount = static_cast<uint8_t>(argumentsCount); - - while (i < static_cast<int32_t>(argumentsCount)) - { - FuncArg& arg = self->_arguments[i]; - - arg._varType = static_cast<uint8_t>(argumentsData[i]); - arg._regIndex = kRegIndexInvalid; - arg._stackOffset = kFuncStackInvalid; - - i++; - } - - while (i < kFuncArgsMax) - { - FuncArg& arg = self->_arguments[i]; - arg.reset(); - - i++; - } - - self->_argumentsStackSize = 0; - self->_gpArgumentsMask = 0x0; - self->_mmArgumentsMask = 0x0; - self->_xmmArgumentsMask = 0x0; - - if (!self->_argumentsCount) - return; - - // -------------------------------------------------------------------------- - // [X86 Calling Conventions (32-bit)] - // -------------------------------------------------------------------------- - -#if defined(ASMJIT_X86) - // Register arguments (Integer), always left-to-right. - for (i = 0; i != static_cast<int32_t>(argumentsCount); i++) - { - FuncArg& arg = self->_arguments[i]; - uint32_t varType = arg.getVarType(); - - if (X86Util::isVarTypeInt(varType) && gpPos < 16 && self->_gpList[gpPos] != kRegIndexInvalid) - { - arg._regIndex = self->_gpList[gpPos++]; - self->_gpArgumentsMask |= static_cast<uint16_t>(IntUtil::maskFromIndex(arg.getRegIndex())); - } - } - - // Stack arguments. - int32_t iStart = static_cast<int32_t>(argumentsCount - 1); - int32_t iEnd = -1; - int32_t iStep = -1; - - if (self->_argumentsDirection == kFuncArgsLTR) - { - iStart = 0; - iEnd = static_cast<int32_t>(argumentsCount); - iStep = 1; - } - - for (i = iStart; i != iEnd; i += iStep) - { - FuncArg& arg = self->_arguments[i]; - uint32_t varType = arg.getVarType(); - - if (arg.hasRegIndex()) - continue; - - if (X86Util::isVarTypeInt(varType)) - { - stackOffset -= 4; - arg._stackOffset = static_cast<int16_t>(stackOffset); - } - else if (X86Util::isVarTypeFloat(varType)) - { - int32_t size = static_cast<int32_t>(x86VarInfo[varType].getSize()); - stackOffset -= size; - arg._stackOffset = static_cast<int16_t>(stackOffset); - } - } + ASMJIT_ASSERT(argumentsCount <= kFuncArgsMax); + + // -------------------------------------------------------------------------- + // [Init] + // -------------------------------------------------------------------------- + + int32_t i = 0; + int32_t gpPos = 0; + int32_t stackOffset = 0; + + self->_returnType = returnType; + self->_argumentsCount = static_cast<uint8_t>(argumentsCount); + + while (i < static_cast<int32_t>(argumentsCount)) + { + FuncArg &arg = self->_arguments[i]; + + arg._varType = static_cast<uint8_t>(argumentsData[i]); + arg._regIndex = kRegIndexInvalid; + arg._stackOffset = kFuncStackInvalid; + + ++i; + } + + while (i < kFuncArgsMax) + { + FuncArg &arg = self->_arguments[i]; + arg.reset(); + + ++i; + } + + self->_argumentsStackSize = 0; + self->_gpArgumentsMask = 0x0; + self->_mmArgumentsMask = 0x0; + self->_xmmArgumentsMask = 0x0; + + if (!self->_argumentsCount) + return; + + // -------------------------------------------------------------------------- + // [X86 Calling Conventions (32-bit)] + // -------------------------------------------------------------------------- + +#ifdef ASMJIT_X86 + // Register arguments (Integer), always left-to-right. + for (i = 0; i != static_cast<int32_t>(argumentsCount); ++i) + { + FuncArg &arg = self->_arguments[i]; + uint32_t varType = arg.getVarType(); + + if (X86Util::isVarTypeInt(varType) && gpPos < 16 && self->_gpList[gpPos] != kRegIndexInvalid) + { + arg._regIndex = self->_gpList[gpPos++]; + self->_gpArgumentsMask |= static_cast<uint16_t>(IntUtil::maskFromIndex(arg.getRegIndex())); + } + } + + // Stack arguments. + int32_t iStart = static_cast<int32_t>(argumentsCount - 1); + int32_t iEnd = -1; + int32_t iStep = -1; + + if (self->_argumentsDirection == kFuncArgsLTR) + { + iStart = 0; + iEnd = static_cast<int32_t>(argumentsCount); + iStep = 1; + } + + for (i = iStart; i != iEnd; i += iStep) + { + FuncArg &arg = self->_arguments[i]; + uint32_t varType = arg.getVarType(); + + if (arg.hasRegIndex()) + continue; + + if (X86Util::isVarTypeInt(varType)) + { + stackOffset -= 4; + arg._stackOffset = static_cast<int16_t>(stackOffset); + } + else if (X86Util::isVarTypeFloat(varType)) + { + int32_t size = static_cast<int32_t>(x86VarInfo[varType].getSize()); + stackOffset -= size; + arg._stackOffset = static_cast<int16_t>(stackOffset); + } + } #endif // ASMJIT_X86 - // -------------------------------------------------------------------------- - // [X64 Calling Conventions (64-bit)] - // -------------------------------------------------------------------------- - -#if defined(ASMJIT_X64) - // Windows 64-bit specific. - if (self->_convention == kX86FuncConvX64W) - { - int32_t max = argumentsCount < 4 ? argumentsCount : 4; - - // Register arguments (Integer / FP), always left-to-right. - for (i = 0; i != max; i++) - { - FuncArg& arg = self->_arguments[i]; - uint32_t varType = arg.getVarType(); - - if (X86Util::isVarTypeInt(varType)) - { - arg._regIndex = self->_gpList[i]; - self->_gpArgumentsMask |= static_cast<uint16_t>(IntUtil::maskFromIndex(arg.getRegIndex())); - } - else if (X86Util::isVarTypeFloat(varType)) - { - arg._regIndex = self->_xmmList[i]; - self->_xmmArgumentsMask |= static_cast<uint16_t>(IntUtil::maskFromIndex(arg.getRegIndex())); - } - } - - // Stack arguments (always right-to-left). - for (i = argumentsCount - 1; i != -1; i--) - { - FuncArg& arg = self->_arguments[i]; - uint32_t varType = arg.getVarType(); - - if (arg.isAssigned()) - continue; - - if (X86Util::isVarTypeInt(varType)) - { - stackOffset -= 8; // Always 8 bytes. - arg._stackOffset = stackOffset; - } - else if (X86Util::isVarTypeFloat(varType)) - { - int32_t size = static_cast<int32_t>(x86VarInfo[varType].getSize()); - stackOffset -= size; - arg._stackOffset = stackOffset; - } - } - - // 32 bytes shadow space (X64W calling convention specific). - stackOffset -= 4 * 8; - } - // Linux/Unix 64-bit (AMD64 calling convention). - else - { - // Register arguments (Integer), always left-to-right. - for (i = 0; i != static_cast<int32_t>(argumentsCount); i++) - { - FuncArg& arg = self->_arguments[i]; - uint32_t varType = arg.getVarType(); - - if (X86Util::isVarTypeInt(varType) && gpPos < 32 && self->_gpList[gpPos] != kRegIndexInvalid) - { - arg._regIndex = self->_gpList[gpPos++]; - self->_gpArgumentsMask |= static_cast<uint16_t>(IntUtil::maskFromIndex(arg.getRegIndex())); - } - } - - // Register arguments (FP), always left-to-right. - for (i = 0; i != static_cast<int32_t>(argumentsCount); i++) - { - FuncArg& arg = self->_arguments[i]; - uint32_t varType = arg.getVarType(); - - if (X86Util::isVarTypeFloat(varType)) - { - arg._regIndex = self->_xmmList[xmmPos++]; - self->_xmmArgumentsMask |= static_cast<uint16_t>(IntUtil::maskFromIndex(arg.getRegIndex())); - } - } - - // Stack arguments. - for (i = argumentsCount - 1; i != -1; i--) - { - FuncArg& arg = self->_arguments[i]; - uint32_t varType = arg.getVarType(); - - if (arg.isAssigned()) - continue; - - if (X86Util::isVarTypeInt(varType)) - { - stackOffset -= 8; - arg._stackOffset = static_cast<int16_t>(stackOffset); - } - else if (X86Util::isVarTypeFloat(varType)) - { - int32_t size = (int32_t)x86VarInfo[varType].getSize(); - - stackOffset -= size; - arg._stackOffset = static_cast<int16_t>(stackOffset); - } - } - } + // -------------------------------------------------------------------------- + // [X64 Calling Conventions (64-bit)] + // -------------------------------------------------------------------------- + +#ifdef ASMJIT_X64 + // Windows 64-bit specific. + if (self->_convention == kX86FuncConvX64W) + { + int32_t max = argumentsCount < 4 ? argumentsCount : 4; + + // Register arguments (Integer / FP), always left-to-right. + for (i = 0; i != max; ++i) + { + FuncArg &arg = self->_arguments[i]; + uint32_t varType = arg.getVarType(); + + if (X86Util::isVarTypeInt(varType)) + { + arg._regIndex = self->_gpList[i]; + self->_gpArgumentsMask |= static_cast<uint16_t>(IntUtil::maskFromIndex(arg.getRegIndex())); + } + else if (X86Util::isVarTypeFloat(varType)) + { + arg._regIndex = self->_xmmList[i]; + self->_xmmArgumentsMask |= static_cast<uint16_t>(IntUtil::maskFromIndex(arg.getRegIndex())); + } + } + + // Stack arguments (always right-to-left). + for (i = argumentsCount - 1; i != -1; --i) + { + FuncArg &arg = self->_arguments[i]; + uint32_t varType = arg.getVarType(); + + if (arg.isAssigned()) + continue; + + if (X86Util::isVarTypeInt(varType)) + { + stackOffset -= 8; // Always 8 bytes. + arg._stackOffset = stackOffset; + } + else if (X86Util::isVarTypeFloat(varType)) + { + int32_t size = static_cast<int32_t>(x86VarInfo[varType].getSize()); + stackOffset -= size; + arg._stackOffset = stackOffset; + } + } + + // 32 bytes shadow space (X64W calling convention specific). + stackOffset -= 4 * 8; + } + // Linux/Unix 64-bit (AMD64 calling convention). + else + { + // Register arguments (Integer), always left-to-right. + for (i = 0; i != static_cast<int32_t>(argumentsCount); ++i) + { + FuncArg &arg = self->_arguments[i]; + uint32_t varType = arg.getVarType(); + + if (X86Util::isVarTypeInt(varType) && gpPos < 32 && self->_gpList[gpPos] != kRegIndexInvalid) + { + arg._regIndex = self->_gpList[gpPos++]; + self->_gpArgumentsMask |= static_cast<uint16_t>(IntUtil::maskFromIndex(arg.getRegIndex())); + } + } + + // Register arguments (FP), always left-to-right. + for (i = 0; i != static_cast<int32_t>(argumentsCount); ++i) + { + FuncArg &arg = self->_arguments[i]; + uint32_t varType = arg.getVarType(); + + if (X86Util::isVarTypeFloat(varType)) + { + arg._regIndex = self->_xmmList[xmmPos++]; + self->_xmmArgumentsMask |= static_cast<uint16_t>(IntUtil::maskFromIndex(arg.getRegIndex())); + } + } + + // Stack arguments. + for (i = argumentsCount - 1; i != -1; --i) + { + FuncArg &arg = self->_arguments[i]; + uint32_t varType = arg.getVarType(); + + if (arg.isAssigned()) + continue; + + if (X86Util::isVarTypeInt(varType)) + { + stackOffset -= 8; + arg._stackOffset = static_cast<int16_t>(stackOffset); + } + else if (X86Util::isVarTypeFloat(varType)) + { + int32_t size = static_cast<int32_t>(x86VarInfo[varType].getSize()); + + stackOffset -= size; + arg._stackOffset = static_cast<int16_t>(stackOffset); + } + } + } #endif // ASMJIT_X64 - // Modify stack offset (all function parameters will be in positive stack - // offset that is never zero). - for (i = 0; i < (int32_t)argumentsCount; i++) - { - FuncArg& arg = self->_arguments[i]; - if (!arg.hasRegIndex()) - { - arg._stackOffset += static_cast<uint16_t>(static_cast<int32_t>(sizeof(uintptr_t)) - stackOffset); - } - } - - self->_argumentsStackSize = (uint32_t)(-stackOffset); + // Modify stack offset (all function parameters will be in positive stack + // offset that is never zero). + for (i = 0; i < (int32_t)argumentsCount; ++i) + { + FuncArg &arg = self->_arguments[i]; + if (!arg.hasRegIndex()) + arg._stackOffset += static_cast<uint16_t>(static_cast<int32_t>(sizeof(uintptr_t)) - stackOffset); + } + + self->_argumentsStackSize = static_cast<uint32_t>(-stackOffset); } -void X86FuncDecl::setPrototype(uint32_t convention, uint32_t returnType, const uint32_t* arguments, uint32_t argumentsCount) +void X86FuncDecl::setPrototype(uint32_t convention, uint32_t returnType, const uint32_t *arguments, uint32_t argumentsCount) { - // Limit maximum function arguments to kFuncArgsMax. - if (argumentsCount > kFuncArgsMax) - argumentsCount = kFuncArgsMax; - - X86FuncDecl_initCallingConvention(this, convention); - X86FuncDecl_initDefinition(this, returnType, arguments, argumentsCount); + // Limit maximum function arguments to kFuncArgsMax. + if (argumentsCount > kFuncArgsMax) + argumentsCount = kFuncArgsMax; + + X86FuncDecl_initCallingConvention(this, convention); + X86FuncDecl_initDefinition(this, returnType, arguments, argumentsCount); } // ============================================================================ @@ -594,48 +536,48 @@ void X86FuncDecl::reset() { - uint32_t i; - - // -------------------------------------------------------------------------- - // [Core] - // -------------------------------------------------------------------------- - - _returnType = kVarTypeInvalid; - _argumentsCount = 0; - - _reserved0[0] = 0; - _reserved0[1] = 0; - - for (i = 0; i < ASMJIT_ARRAY_SIZE(_arguments); i++) - _arguments[i].reset(); - - _argumentsStackSize = 0; - _gpArgumentsMask = 0x0; - _mmArgumentsMask = 0x0; - _xmmArgumentsMask = 0x0; - - // -------------------------------------------------------------------------- - // [Convention] - // -------------------------------------------------------------------------- - - _convention = kFuncConvNone; - _calleePopsStack = false; - _argumentsDirection = kFuncArgsRTL; - _reserved1 = 0; - - for (i = 0; i < ASMJIT_ARRAY_SIZE(_gpList); i++) - _gpList[i] = kRegIndexInvalid; - - for (i = 0; i < ASMJIT_ARRAY_SIZE(_xmmList); i++) - _xmmList[i] = kRegIndexInvalid; - - _gpListMask = 0x0; - _mmListMask = 0x0; - _xmmListMask = 0x0; - - _gpPreservedMask = 0x0; - _mmPreservedMask = 0x0; - _xmmPreservedMask = 0x0; + uint32_t i; + + // -------------------------------------------------------------------------- + // [Core] + // -------------------------------------------------------------------------- + + this->_returnType = kVarTypeInvalid; + this->_argumentsCount = 0; + + this->_reserved0[0] = 0; + this->_reserved0[1] = 0; + + for (i = 0; i < ASMJIT_ARRAY_SIZE(this->_arguments); ++i) + this->_arguments[i].reset(); + + this->_argumentsStackSize = 0; + this->_gpArgumentsMask = 0x0; + this->_mmArgumentsMask = 0x0; + this->_xmmArgumentsMask = 0x0; + + // -------------------------------------------------------------------------- + // [Convention] + // -------------------------------------------------------------------------- + + this->_convention = kFuncConvNone; + this->_calleePopsStack = false; + this->_argumentsDirection = kFuncArgsRTL; + this->_reserved1 = 0; + + for (i = 0; i < ASMJIT_ARRAY_SIZE(this->_gpList); ++i) + this->_gpList[i] = kRegIndexInvalid; + + for (i = 0; i < ASMJIT_ARRAY_SIZE(this->_xmmList); ++i) + this->_xmmList[i] = kRegIndexInvalid; + + this->_gpListMask = 0x0; + this->_mmListMask = 0x0; + this->_xmmListMask = 0x0; + + this->_gpPreservedMask = 0x0; + this->_mmPreservedMask = 0x0; + this->_xmmPreservedMask = 0x0; } } // AsmJit namespace
--- a/src/in_2sf/desmume/utils/AsmJit/x86/x86operand.cpp +++ b/src/in_2sf/desmume/utils/AsmJit/x86/x86operand.cpp @@ -13,7 +13,8 @@ // [Api-Begin] #include "../core/apibegin.h" -namespace AsmJit { +namespace AsmJit +{ // ============================================================================ // [AsmJit::Registers - no_reg] @@ -30,7 +31,7 @@ const GpReg dl(_Initialize(), kX86RegDl); const GpReg bl(_Initialize(), kX86RegBl); -#if defined(ASMJIT_X64) +#ifdef ASMJIT_X64 const GpReg spl(_Initialize(), kX86RegSpl); const GpReg bpl(_Initialize(), kX86RegBpl); const GpReg sil(_Initialize(), kX86RegSil); @@ -64,7 +65,7 @@ const GpReg si(_Initialize(), kX86RegSi); const GpReg di(_Initialize(), kX86RegDi); -#if defined(ASMJIT_X64) +#ifdef ASMJIT_X64 const GpReg r8w(_Initialize(), kX86RegR8w); const GpReg r9w(_Initialize(), kX86RegR9w); const GpReg r10w(_Initialize(), kX86RegR10w); @@ -88,7 +89,7 @@ const GpReg esi(_Initialize(), kX86RegEsi); const GpReg edi(_Initialize(), kX86RegEdi); -#if defined(ASMJIT_X64) +#ifdef ASMJIT_X64 const GpReg r8d(_Initialize(), kX86RegR8d); const GpReg r9d(_Initialize(), kX86RegR9d); const GpReg r10d(_Initialize(), kX86RegR10d); @@ -103,7 +104,7 @@ // [AsmJit::Registers - 64-bit] // ============================================================================ -#if defined(ASMJIT_X64) +#ifdef ASMJIT_X64 const GpReg rax(_Initialize(), kX86RegRax); const GpReg rcx(_Initialize(), kX86RegRcx); const GpReg rdx(_Initialize(), kX86RegRdx); @@ -162,7 +163,7 @@ const XmmReg xmm6(_Initialize(), kX86RegXmm6); const XmmReg xmm7(_Initialize(), kX86RegXmm7); -#if defined(ASMJIT_X64) +#ifdef ASMJIT_X64 const XmmReg xmm8(_Initialize(), kX86RegXmm8); const XmmReg xmm9(_Initialize(), kX86RegXmm9); const XmmReg xmm10(_Initialize(), kX86RegXmm10); @@ -188,195 +189,173 @@ // [AsmJit::Var] // ============================================================================ -Mem _BaseVarMem(const Var& var, uint32_t size) -{ - Mem m; //(_DontInitialize()); - - m._mem.op = kOperandMem; - m._mem.size = static_cast<uint8_t>(size == kInvalidValue ? var.getSize() : size); - m._mem.type = kOperandMemNative; - m._mem.segment = kX86SegNone; - m._mem.sizePrefix = 0; - m._mem.shift = 0; - - m._mem.id = var.getId(); - m._mem.base = kInvalidValue; - m._mem.index = kInvalidValue; - - m._mem.target = nullptr; - m._mem.displacement = 0; - - return m; -} - - -Mem _BaseVarMem(const Var& var, uint32_t size, sysint_t disp) -{ - Mem m; //(_DontInitialize()); - - m._mem.op = kOperandMem; - m._mem.size = static_cast<uint8_t>(size == kInvalidValue ? var.getSize() : size); - m._mem.type = kOperandMemNative; - m._mem.segment = kX86SegNone; - m._mem.sizePrefix = 0; - m._mem.shift = 0; - - m._mem.id = var.getId(); - - m._mem.base = kInvalidValue; - m._mem.index = kInvalidValue; - - m._mem.target = nullptr; - m._mem.displacement = disp; - - return m; -} - -Mem _BaseVarMem(const Var& var, uint32_t size, const GpVar& index, uint32_t shift, sysint_t disp) -{ - Mem m; //(_DontInitialize()); - - m._mem.op = kOperandMem; - m._mem.size = static_cast<uint8_t>(size == kInvalidValue ? var.getSize() : size); - m._mem.type = kOperandMemNative; - m._mem.segment = kX86SegNone; - m._mem.sizePrefix = 0; - m._mem.shift = shift; - - m._mem.id = var.getId(); - - m._mem.base = kInvalidValue; - m._mem.index = index.getId(); - - m._mem.target = nullptr; - m._mem.displacement = disp; - - return m; +Mem _BaseVarMem(const Var &var, uint32_t size, sysint_t disp) +{ + Mem m; //(_DontInitialize()); + + m._mem.op = kOperandMem; + m._mem.size = static_cast<uint8_t>(size == kInvalidValue ? var.getSize() : size); + m._mem.type = kOperandMemNative; + m._mem.segment = kX86SegNone; + m._mem.sizePrefix = 0; + m._mem.shift = 0; + + m._mem.id = var.getId(); + + m._mem.base = kInvalidValue; + m._mem.index = kInvalidValue; + + m._mem.target = nullptr; + m._mem.displacement = disp; + + return m; +} + +Mem _BaseVarMem(const Var &var, uint32_t size, const GpVar &index, uint32_t shift, sysint_t disp) +{ + Mem m; //(_DontInitialize()); + + m._mem.op = kOperandMem; + m._mem.size = static_cast<uint8_t>(size == kInvalidValue ? var.getSize() : size); + m._mem.type = kOperandMemNative; + m._mem.segment = kX86SegNone; + m._mem.sizePrefix = 0; + m._mem.shift = shift; + + m._mem.id = var.getId(); + + m._mem.base = kInvalidValue; + m._mem.index = index.getId(); + + m._mem.target = nullptr; + m._mem.displacement = disp; + + return m; } // ============================================================================ // [AsmJit::Mem - ptr[]] // ============================================================================ -Mem ptr(const Label& label, sysint_t disp, uint32_t size) -{ - return Mem(label, disp, size); -} - -Mem ptr(const Label& label, const GpReg& index, uint32_t shift, sysint_t disp, uint32_t size) -{ - Mem m(label, disp, size); - - m._mem.index = index.getRegIndex(); - m._mem.shift = shift; - - return m; -} - -Mem ptr(const Label& label, const GpVar& index, uint32_t shift, sysint_t disp, uint32_t size) -{ - Mem m(label, disp, size); - - m._mem.index = index.getId(); - m._mem.shift = shift; - - return m; +Mem ptr(const Label &label, sysint_t disp, uint32_t size) +{ + return Mem(label, disp, size); +} + +Mem ptr(const Label &label, const GpReg &index, uint32_t shift, sysint_t disp, uint32_t size) +{ + Mem m(label, disp, size); + + m._mem.index = index.getRegIndex(); + m._mem.shift = shift; + + return m; +} + +Mem ptr(const Label &label, const GpVar &index, uint32_t shift, sysint_t disp, uint32_t size) +{ + Mem m(label, disp, size); + + m._mem.index = index.getId(); + m._mem.shift = shift; + + return m; } // ============================================================================ // [AsmJit::Mem - ptr[] - Absolute Addressing] // ============================================================================ -ASMJIT_API Mem ptr_abs(void* target, sysint_t disp, uint32_t size) -{ - Mem m; - - m._mem.size = size; - m._mem.type = kOperandMemAbsolute; - m._mem.segment = kX86SegNone; - - m._mem.target = target; - m._mem.displacement = disp; - - return m; -} - -ASMJIT_API Mem ptr_abs(void* target, const GpReg& index, uint32_t shift, sysint_t disp, uint32_t size) -{ - Mem m;// (_DontInitialize()); - - m._mem.op = kOperandMem; - m._mem.size = size; - m._mem.type = kOperandMemAbsolute; - m._mem.segment = kX86SegNone; - -#if defined(ASMJIT_X86) - m._mem.sizePrefix = index.getSize() != 4; +ASMJIT_API Mem ptr_abs(void *target, sysint_t disp, uint32_t size) +{ + Mem m; + + m._mem.size = size; + m._mem.type = kOperandMemAbsolute; + m._mem.segment = kX86SegNone; + + m._mem.target = target; + m._mem.displacement = disp; + + return m; +} + +ASMJIT_API Mem ptr_abs(void *target, const GpReg &index, uint32_t shift, sysint_t disp, uint32_t size) +{ + Mem m;// (_DontInitialize()); + + m._mem.op = kOperandMem; + m._mem.size = size; + m._mem.type = kOperandMemAbsolute; + m._mem.segment = kX86SegNone; + +#ifdef ASMJIT_X86 + m._mem.sizePrefix = index.getSize() != 4; #else - m._mem.sizePrefix = index.getSize() != 8; + m._mem.sizePrefix = index.getSize() != 8; #endif - m._mem.shift = shift; - - m._mem.id = kInvalidValue; - m._mem.base = kInvalidValue; - m._mem.index = index.getRegIndex(); - - m._mem.target = target; - m._mem.displacement = disp; - - return m; -} - -ASMJIT_API Mem ptr_abs(void* target, const GpVar& index, uint32_t shift, sysint_t disp, uint32_t size) -{ - Mem m;// (_DontInitialize()); - - m._mem.op = kOperandMem; - m._mem.size = size; - m._mem.type = kOperandMemAbsolute; - m._mem.segment = kX86SegNone; - -#if defined(ASMJIT_X86) - m._mem.sizePrefix = index.getSize() != 4; + m._mem.shift = shift; + + m._mem.id = kInvalidValue; + m._mem.base = kInvalidValue; + m._mem.index = index.getRegIndex(); + + m._mem.target = target; + m._mem.displacement = disp; + + return m; +} + +ASMJIT_API Mem ptr_abs(void *target, const GpVar &index, uint32_t shift, sysint_t disp, uint32_t size) +{ + Mem m;// (_DontInitialize()); + + m._mem.op = kOperandMem; + m._mem.size = size; + m._mem.type = kOperandMemAbsolute; + m._mem.segment = kX86SegNone; + +#ifdef ASMJIT_X86 + m._mem.sizePrefix = index.getSize() != 4; #else - m._mem.sizePrefix = index.getSize() != 8; + m._mem.sizePrefix = index.getSize() != 8; #endif - m._mem.shift = shift; - - m._mem.id = kInvalidValue; - m._mem.base = kInvalidValue; - m._mem.index = index.getId(); - - m._mem.target = target; - m._mem.displacement = disp; - - return m; + m._mem.shift = shift; + + m._mem.id = kInvalidValue; + m._mem.base = kInvalidValue; + m._mem.index = index.getId(); + + m._mem.target = target; + m._mem.displacement = disp; + + return m; } // ============================================================================ // [AsmJit::Mem - ptr[base + displacement]] // ============================================================================ -Mem ptr(const GpReg& base, sysint_t disp, uint32_t size) -{ - return Mem(base, disp, size); -} - -Mem ptr(const GpReg& base, const GpReg& index, uint32_t shift, sysint_t disp, uint32_t size) -{ - return Mem(base, index, shift, disp, size); -} - -Mem ptr(const GpVar& base, sysint_t disp, uint32_t size) -{ - return Mem(base, disp, size); -} - -Mem ptr(const GpVar& base, const GpVar& index, uint32_t shift, sysint_t disp, uint32_t size) -{ - return Mem(base, index, shift, disp, size); +Mem ptr(const GpReg &base, sysint_t disp, uint32_t size) +{ + return Mem(base, disp, size); +} + +Mem ptr(const GpReg &base, const GpReg &index, uint32_t shift, sysint_t disp, uint32_t size) +{ + return Mem(base, index, shift, disp, size); +} + +Mem ptr(const GpVar &base, sysint_t disp, uint32_t size) +{ + return Mem(base, disp, size); +} + +Mem ptr(const GpVar &base, const GpVar &index, uint32_t shift, sysint_t disp, uint32_t size) +{ + return Mem(base, index, shift, disp, size); } } // AsmJit namespace
--- a/src/in_2sf/desmume/utils/AsmJit/x86/x86operand.h +++ b/src/in_2sf/desmume/utils/AsmJit/x86/x86operand.h @@ -1169,8 +1169,7 @@ // [AsmJit::Var] // ============================================================================ -ASMJIT_API Mem _BaseVarMem(const Var &var, uint32_t size); -ASMJIT_API Mem _BaseVarMem(const Var &var, uint32_t size, sysint_t disp); +ASMJIT_API Mem _BaseVarMem(const Var &var, uint32_t size, sysint_t disp = 0); ASMJIT_API Mem _BaseVarMem(const Var &var, uint32_t size, const GpVar &index, uint32_t shift, sysint_t disp); //! @brief Base class for all variables.
--- a/src/in_2sf/desmume/utils/AsmJit/x86/x86util.cpp +++ b/src/in_2sf/desmume/utils/AsmJit/x86/x86util.cpp @@ -12,125 +12,126 @@ // [Api-Begin] #include "../core/apibegin.h" -namespace AsmJit { +namespace AsmJit +{ // ============================================================================ // [AsmJit::_x86UtilJccFromCond] // ============================================================================ -const uint32_t _x86UtilJccFromCond[20] = +const uint32_t _x86UtilJccFromCond[] = { - kX86InstJO, - kX86InstJNO, - kX86InstJB, - kX86InstJAE, - kX86InstJE, - kX86InstJNE, - kX86InstJBE, - kX86InstJA, - kX86InstJS, - kX86InstJNS, - kX86InstJPE, - kX86InstJPO, - kX86InstJL, - kX86InstJGE, - kX86InstJLE, - kX86InstJG, + kX86InstJO, + kX86InstJNO, + kX86InstJB, + kX86InstJAE, + kX86InstJE, + kX86InstJNE, + kX86InstJBE, + kX86InstJA, + kX86InstJS, + kX86InstJNS, + kX86InstJPE, + kX86InstJPO, + kX86InstJL, + kX86InstJGE, + kX86InstJLE, + kX86InstJG, - kInstNone, - kInstNone, - kInstNone, - kInstNone + kInstNone, + kInstNone, + kInstNone, + kInstNone }; // ============================================================================ // [AsmJit::_x86UtilMovccFromCond] // ============================================================================ -const uint32_t _x86UtilMovccFromCond[20] = +const uint32_t _x86UtilMovccFromCond[] = { - kX86InstCMovO, - kX86InstCMovNO, - kX86InstCMovB, - kX86InstCMovAE, - kX86InstCMovE, - kX86InstCMovNE, - kX86InstCMovBE, - kX86InstCMovA, - kX86InstCMovS, - kX86InstCMovNS, - kX86InstCMovPE, - kX86InstCMovPO, - kX86InstCMovL, - kX86InstCMovGE, - kX86InstCMovLE, - kX86InstCMovG, + kX86InstCMovO, + kX86InstCMovNO, + kX86InstCMovB, + kX86InstCMovAE, + kX86InstCMovE, + kX86InstCMovNE, + kX86InstCMovBE, + kX86InstCMovA, + kX86InstCMovS, + kX86InstCMovNS, + kX86InstCMovPE, + kX86InstCMovPO, + kX86InstCMovL, + kX86InstCMovGE, + kX86InstCMovLE, + kX86InstCMovG, - kInstNone, - kInstNone, - kInstNone, - kInstNone + kInstNone, + kInstNone, + kInstNone, + kInstNone }; // ============================================================================ // [AsmJit::_x86UtilSetccFromCond] // ============================================================================ -const uint32_t _x86UtilSetccFromCond[20] = +const uint32_t _x86UtilSetccFromCond[] = { - kX86InstSetO, - kX86InstSetNO, - kX86InstSetB, - kX86InstSetAE, - kX86InstSetE, - kX86InstSetNE, - kX86InstSetBE, - kX86InstSetA, - kX86InstSetS, - kX86InstSetNS, - kX86InstSetPE, - kX86InstSetPO, - kX86InstSetL, - kX86InstSetGE, - kX86InstSetLE, - kX86InstSetG, + kX86InstSetO, + kX86InstSetNO, + kX86InstSetB, + kX86InstSetAE, + kX86InstSetE, + kX86InstSetNE, + kX86InstSetBE, + kX86InstSetA, + kX86InstSetS, + kX86InstSetNS, + kX86InstSetPE, + kX86InstSetPO, + kX86InstSetL, + kX86InstSetGE, + kX86InstSetLE, + kX86InstSetG, - kInstNone, - kInstNone, - kInstNone, - kInstNone + kInstNone, + kInstNone, + kInstNone, + kInstNone }; // ============================================================================ // [AsmJit::_x86UtilReversedCond] // ============================================================================ -const uint32_t _x86UtilReversedCond[20] = +const uint32_t _x86UtilReversedCond[] = { - /* x86CondO -> */ kX86CondO, - /* x86CondNO -> */ kX86CondNO, - /* x86CondB -> */ kX86CondA, - /* x86CondAE -> */ kX86CondBE, - /* x86CondE -> */ kX86CondE, - /* x86CondNE -> */ kX86CondNE, - /* x86CondBE -> */ kX86CondAE, - /* x86CondA -> */ kX86CondB, - /* x86CondS -> */ kX86CondS, - /* x86CondNS -> */ kX86CondNS, - /* x86CondPE -> */ kX86CondPE, - /* x86CondPO -> */ kX86CondPO, + /* x86CondO -> */ kX86CondO, + /* x86CondNO -> */ kX86CondNO, + /* x86CondB -> */ kX86CondA, + /* x86CondAE -> */ kX86CondBE, + /* x86CondE -> */ kX86CondE, + /* x86CondNE -> */ kX86CondNE, + /* x86CondBE -> */ kX86CondAE, + /* x86CondA -> */ kX86CondB, + /* x86CondS -> */ kX86CondS, + /* x86CondNS -> */ kX86CondNS, + /* x86CondPE -> */ kX86CondPE, + /* x86CondPO -> */ kX86CondPO, - /* x86CondL -> */ kX86CondG, - /* x86CondGE -> */ kX86CondLE, + /* x86CondL -> */ kX86CondG, + /* x86CondGE -> */ kX86CondLE, - /* x86CondLE -> */ kX86CondGE, - /* x86CondG -> */ kX86CondL, + /* x86CondLE -> */ kX86CondGE, + /* x86CondG -> */ kX86CondL, - /* kX86CondFpuUnordered -> */ kX86CondFpuUnordered, - /* kX86CondFpuNotUnordered -> */ kX86CondFpuNotUnordered, + /* kX86CondFpuUnordered -> */ kX86CondFpuUnordered, + /* kX86CondFpuNotUnordered -> */ kX86CondFpuNotUnordered, - 0x12, - 0x13 + 0x12, + 0x13 }; } // AsmJit namespace
--- a/src/in_2sf/desmume/version.cpp +++ b/src/in_2sf/desmume/version.cpp @@ -40,8 +40,10 @@ # define DESMUME_PLATFORM_STRING " ARM" #elif defined(__thumb__) # define DESMUME_PLATFORM_STRING " ARM-Thumb" +#elif defined(__ppc64__) +# define DESMUME_PLATFORM_STRING " PPC64" #elif defined(__ppc__) || defined(_M_PPC) -# define DESMUME_PLATFORM_STRING " PowerPC" +# define DESMUME_PLATFORM_STRING " PPC" #else # define DESMUME_PLATFORM_STRING "" #endif @@ -56,7 +58,7 @@ # define DESMUME_CPUEXT_STRING "" #endif -#define DESMUME_SUBVERSION_STRING " svn 4598" +#define DESMUME_SUBVERSION_STRING " svn 4605" #ifdef __INTEL_COMPILER # define DESMUME_COMPILER " (Intel)"