mirror of
https://github.com/asmjit/asmjit.git
synced 2025-12-17 04:24:37 +03:00
Minor changes.
Added possibility to get x86/x64 instruction id by name.
This commit is contained in:
@@ -29,7 +29,7 @@ static const Zone::Block Zone_zeroBlock = {
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
Zone::Zone(size_t blockSize) {
|
Zone::Zone(size_t blockSize) {
|
||||||
_blocks = const_cast<Zone::Block*>(&Zone_zeroBlock);
|
_block = const_cast<Zone::Block*>(&Zone_zeroBlock);
|
||||||
_blockSize = blockSize;
|
_blockSize = blockSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ Zone::~Zone() {
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
void Zone::clear() {
|
void Zone::clear() {
|
||||||
Block* cur = _blocks;
|
Block* cur = _block;
|
||||||
|
|
||||||
// Can't be altered.
|
// Can't be altered.
|
||||||
if (cur == &Zone_zeroBlock)
|
if (cur == &Zone_zeroBlock)
|
||||||
@@ -52,11 +52,11 @@ void Zone::clear() {
|
|||||||
cur = cur->prev;
|
cur = cur->prev;
|
||||||
|
|
||||||
cur->pos = cur->data;
|
cur->pos = cur->data;
|
||||||
_blocks = cur;
|
_block = cur;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Zone::reset() {
|
void Zone::reset() {
|
||||||
Block* cur = _blocks;
|
Block* cur = _block;
|
||||||
|
|
||||||
// Can't be altered.
|
// Can't be altered.
|
||||||
if (cur == &Zone_zeroBlock)
|
if (cur == &Zone_zeroBlock)
|
||||||
@@ -68,7 +68,7 @@ void Zone::reset() {
|
|||||||
cur = prev;
|
cur = prev;
|
||||||
} while (cur != NULL);
|
} while (cur != NULL);
|
||||||
|
|
||||||
_blocks = const_cast<Zone::Block*>(&Zone_zeroBlock);
|
_block = const_cast<Zone::Block*>(&Zone_zeroBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@@ -76,7 +76,7 @@ void Zone::reset() {
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
void* Zone::_alloc(size_t size) {
|
void* Zone::_alloc(size_t size) {
|
||||||
Block* curBlock = _blocks;
|
Block* curBlock = _block;
|
||||||
size_t blockSize = IntUtil::iMax<size_t>(_blockSize, size);
|
size_t blockSize = IntUtil::iMax<size_t>(_blockSize, size);
|
||||||
|
|
||||||
// The `_alloc()` method can only be called if there is not enough space
|
// The `_alloc()` method can only be called if there is not enough space
|
||||||
@@ -90,7 +90,7 @@ void* Zone::_alloc(size_t size) {
|
|||||||
Block* next = curBlock->next;
|
Block* next = curBlock->next;
|
||||||
if (next != NULL && next->getBlockSize() >= size) {
|
if (next != NULL && next->getBlockSize() >= size) {
|
||||||
next->pos = next->data + size;
|
next->pos = next->data + size;
|
||||||
_blocks = next;
|
_block = next;
|
||||||
return static_cast<void*>(next->data);
|
return static_cast<void*>(next->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,7 +120,7 @@ void* Zone::_alloc(size_t size) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_blocks = newBlock;
|
_block = newBlock;
|
||||||
return static_cast<void*>(newBlock->data);
|
return static_cast<void*>(newBlock->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ struct Zone {
|
|||||||
//! zone.reset();
|
//! zone.reset();
|
||||||
//! ~~~
|
//! ~~~
|
||||||
ASMJIT_INLINE void* alloc(size_t size) {
|
ASMJIT_INLINE void* alloc(size_t size) {
|
||||||
Block* cur = _blocks;
|
Block* cur = _block;
|
||||||
|
|
||||||
uint8_t* ptr = cur->pos;
|
uint8_t* ptr = cur->pos;
|
||||||
size_t remainingBytes = (size_t)(cur->end - ptr);
|
size_t remainingBytes = (size_t)(cur->end - ptr);
|
||||||
@@ -206,7 +206,7 @@ struct Zone {
|
|||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
//! The current block.
|
//! The current block.
|
||||||
Block* _blocks;
|
Block* _block;
|
||||||
//! Default block size.
|
//! Default block size.
|
||||||
size_t _blockSize;
|
size_t _blockSize;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -869,7 +869,7 @@ struct X86X64Assembler : public BaseAssembler {
|
|||||||
ASMJIT_ASSERT(dst.getRegIndex() == 0);
|
ASMJIT_ASSERT(dst.getRegIndex() == 0);
|
||||||
|
|
||||||
Imm imm(static_cast<int64_t>((intptr_t)src));
|
Imm imm(static_cast<int64_t>((intptr_t)src));
|
||||||
return emit(kInstMovptr, dst, imm);
|
return emit(kInstMovPtr, dst, imm);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Move (absolute address in immediate <- AL|AX|EAX|RAX).
|
//! Move (absolute address in immediate <- AL|AX|EAX|RAX).
|
||||||
@@ -877,7 +877,7 @@ struct X86X64Assembler : public BaseAssembler {
|
|||||||
ASMJIT_ASSERT(src.getRegIndex() == 0);
|
ASMJIT_ASSERT(src.getRegIndex() == 0);
|
||||||
|
|
||||||
Imm imm(static_cast<int64_t>((intptr_t)dst));
|
Imm imm(static_cast<int64_t>((intptr_t)dst));
|
||||||
return emit(kInstMovptr, imm, src);
|
return emit(kInstMovPtr, imm, src);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Move data after dwapping bytes (SSE3 - Atom).
|
//! Move data after dwapping bytes (SSE3 - Atom).
|
||||||
|
|||||||
@@ -1873,12 +1873,12 @@ struct X86X64Compiler : public BaseCompiler {
|
|||||||
//! Move (AL|AX|EAX|RAX <- absolute address in immediate).
|
//! Move (AL|AX|EAX|RAX <- absolute address in immediate).
|
||||||
ASMJIT_INLINE InstNode* mov_ptr(const GpVar& dst, void* src) {
|
ASMJIT_INLINE InstNode* mov_ptr(const GpVar& dst, void* src) {
|
||||||
Imm imm(static_cast<int64_t>((intptr_t)src));
|
Imm imm(static_cast<int64_t>((intptr_t)src));
|
||||||
return emit(kInstMovptr, dst, imm);
|
return emit(kInstMovPtr, dst, imm);
|
||||||
}
|
}
|
||||||
//! Move (absolute address in immediate <- AL|AX|EAX|RAX).
|
//! Move (absolute address in immediate <- AL|AX|EAX|RAX).
|
||||||
ASMJIT_INLINE InstNode* mov_ptr(void* dst, const GpVar& src) {
|
ASMJIT_INLINE InstNode* mov_ptr(void* dst, const GpVar& src) {
|
||||||
Imm imm(static_cast<int64_t>((intptr_t)dst));
|
Imm imm(static_cast<int64_t>((intptr_t)dst));
|
||||||
return emit(kInstMovptr, imm, src);
|
return emit(kInstMovPtr, imm, src);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Move data after swapping bytes (SSE3 - Atom).
|
//! Move data after swapping bytes (SSE3 - Atom).
|
||||||
|
|||||||
@@ -260,7 +260,7 @@ static ASMJIT_INLINE const X86X64SpecialInst* X86X64SpecialInst_get(uint32_t cod
|
|||||||
case kInstMul:
|
case kInstMul:
|
||||||
return x86SpecialInstMul;
|
return x86SpecialInstMul;
|
||||||
|
|
||||||
case kInstMovptr:
|
case kInstMovPtr:
|
||||||
return x86SpecialInstMovPtr;
|
return x86SpecialInstMovPtr;
|
||||||
|
|
||||||
case kInstLahf:
|
case kInstLahf:
|
||||||
@@ -5450,7 +5450,7 @@ static ASMJIT_INLINE Error X86X64Context_serialize(X86X64Context* self, X86X64As
|
|||||||
o0 = &opList[2];
|
o0 = &opList[2];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kInstMovptr:
|
case kInstMovPtr:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kInstLahf:
|
case kInstLahf:
|
||||||
|
|||||||
@@ -309,6 +309,7 @@ const char _instName[] =
|
|||||||
"minsd\0"
|
"minsd\0"
|
||||||
"minss\0"
|
"minss\0"
|
||||||
"monitor\0"
|
"monitor\0"
|
||||||
|
"mov_ptr\0"
|
||||||
"mov\0"
|
"mov\0"
|
||||||
"movapd\0"
|
"movapd\0"
|
||||||
"movaps\0"
|
"movaps\0"
|
||||||
@@ -332,7 +333,6 @@ const char _instName[] =
|
|||||||
"movntpd\0"
|
"movntpd\0"
|
||||||
"movntps\0"
|
"movntps\0"
|
||||||
"movntq\0"
|
"movntq\0"
|
||||||
"mov_ptr\0"
|
|
||||||
"movq\0"
|
"movq\0"
|
||||||
"movq2dq\0"
|
"movq2dq\0"
|
||||||
"movsd\0"
|
"movsd\0"
|
||||||
@@ -700,14 +700,14 @@ const char _instName[] =
|
|||||||
"vfmaddps\0"
|
"vfmaddps\0"
|
||||||
"vfmaddsd\0"
|
"vfmaddsd\0"
|
||||||
"vfmaddss\0"
|
"vfmaddss\0"
|
||||||
"vfmaddsubpd\0"
|
|
||||||
"vfmaddsubps\0"
|
|
||||||
"vfmaddsub132pd\0"
|
"vfmaddsub132pd\0"
|
||||||
"vfmaddsub132ps\0"
|
"vfmaddsub132ps\0"
|
||||||
"vfmaddsub213pd\0"
|
"vfmaddsub213pd\0"
|
||||||
"vfmaddsub213ps\0"
|
"vfmaddsub213ps\0"
|
||||||
"vfmaddsub231pd\0"
|
"vfmaddsub231pd\0"
|
||||||
"vfmaddsub231ps\0"
|
"vfmaddsub231ps\0"
|
||||||
|
"vfmaddsubpd\0"
|
||||||
|
"vfmaddsubps\0"
|
||||||
"vfmsub132pd\0"
|
"vfmsub132pd\0"
|
||||||
"vfmsub132ps\0"
|
"vfmsub132ps\0"
|
||||||
"vfmsub132sd\0"
|
"vfmsub132sd\0"
|
||||||
@@ -908,8 +908,8 @@ const char _instName[] =
|
|||||||
"vphaddwq\0"
|
"vphaddwq\0"
|
||||||
"vphminposuw\0"
|
"vphminposuw\0"
|
||||||
"vphsubbw\0"
|
"vphsubbw\0"
|
||||||
"vphsubdq\0"
|
|
||||||
"vphsubd\0"
|
"vphsubd\0"
|
||||||
|
"vphsubdq\0"
|
||||||
"vphsubsw\0"
|
"vphsubsw\0"
|
||||||
"vphsubw\0"
|
"vphsubw\0"
|
||||||
"vphsubwd\0"
|
"vphsubwd\0"
|
||||||
@@ -1059,6 +1059,41 @@ const char _instName[] =
|
|||||||
"xorpd\0"
|
"xorpd\0"
|
||||||
"xorps\0";
|
"xorps\0";
|
||||||
|
|
||||||
|
enum kInstAlphaIndex {
|
||||||
|
kInstAlphaIndexFirst = 'a',
|
||||||
|
kInstAlphaIndexLast = 'z',
|
||||||
|
kInstAlphaIndexInvalid = 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint16_t _instAlphaIndex[26] = {
|
||||||
|
kInstAdc,
|
||||||
|
kInstBextr,
|
||||||
|
kInstCall,
|
||||||
|
kInstDaa,
|
||||||
|
kInstEmms,
|
||||||
|
kInstF2xm1,
|
||||||
|
0xFFFF,
|
||||||
|
kInstHaddpd,
|
||||||
|
kInstIdiv,
|
||||||
|
kInstJa,
|
||||||
|
0xFFFF,
|
||||||
|
kInstLahf,
|
||||||
|
kInstMaskmovdqu,
|
||||||
|
kInstNeg,
|
||||||
|
kInstOr,
|
||||||
|
kInstPabsb,
|
||||||
|
0xFFFF,
|
||||||
|
kInstRcl,
|
||||||
|
kInstSahf,
|
||||||
|
kInstTest,
|
||||||
|
kInstUcomisd,
|
||||||
|
kInstVaddpd,
|
||||||
|
kInstWrfsbase,
|
||||||
|
kInstXadd,
|
||||||
|
0xFFFF,
|
||||||
|
0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
enum kInstData_NameIndex {
|
enum kInstData_NameIndex {
|
||||||
kInstNone_NameIndex = 0,
|
kInstNone_NameIndex = 0,
|
||||||
kInstAdc_NameIndex = 1,
|
kInstAdc_NameIndex = 1,
|
||||||
@@ -1341,30 +1376,30 @@ enum kInstData_NameIndex {
|
|||||||
kInstMinsd_NameIndex = 1746,
|
kInstMinsd_NameIndex = 1746,
|
||||||
kInstMinss_NameIndex = 1752,
|
kInstMinss_NameIndex = 1752,
|
||||||
kInstMonitor_NameIndex = 1758,
|
kInstMonitor_NameIndex = 1758,
|
||||||
kInstMov_NameIndex = 1766,
|
kInstMovPtr_NameIndex = 1766,
|
||||||
kInstMovapd_NameIndex = 1770,
|
kInstMov_NameIndex = 1774,
|
||||||
kInstMovaps_NameIndex = 1777,
|
kInstMovapd_NameIndex = 1778,
|
||||||
kInstMovbe_NameIndex = 1784,
|
kInstMovaps_NameIndex = 1785,
|
||||||
kInstMovd_NameIndex = 1790,
|
kInstMovbe_NameIndex = 1792,
|
||||||
kInstMovddup_NameIndex = 1795,
|
kInstMovd_NameIndex = 1798,
|
||||||
kInstMovdq2q_NameIndex = 1803,
|
kInstMovddup_NameIndex = 1803,
|
||||||
kInstMovdqa_NameIndex = 1811,
|
kInstMovdq2q_NameIndex = 1811,
|
||||||
kInstMovdqu_NameIndex = 1818,
|
kInstMovdqa_NameIndex = 1819,
|
||||||
kInstMovhlps_NameIndex = 1825,
|
kInstMovdqu_NameIndex = 1826,
|
||||||
kInstMovhpd_NameIndex = 1833,
|
kInstMovhlps_NameIndex = 1833,
|
||||||
kInstMovhps_NameIndex = 1840,
|
kInstMovhpd_NameIndex = 1841,
|
||||||
kInstMovlhps_NameIndex = 1847,
|
kInstMovhps_NameIndex = 1848,
|
||||||
kInstMovlpd_NameIndex = 1855,
|
kInstMovlhps_NameIndex = 1855,
|
||||||
kInstMovlps_NameIndex = 1862,
|
kInstMovlpd_NameIndex = 1863,
|
||||||
kInstMovmskpd_NameIndex = 1869,
|
kInstMovlps_NameIndex = 1870,
|
||||||
kInstMovmskps_NameIndex = 1878,
|
kInstMovmskpd_NameIndex = 1877,
|
||||||
kInstMovntdq_NameIndex = 1887,
|
kInstMovmskps_NameIndex = 1886,
|
||||||
kInstMovntdqa_NameIndex = 1895,
|
kInstMovntdq_NameIndex = 1895,
|
||||||
kInstMovnti_NameIndex = 1904,
|
kInstMovntdqa_NameIndex = 1903,
|
||||||
kInstMovntpd_NameIndex = 1911,
|
kInstMovnti_NameIndex = 1912,
|
||||||
kInstMovntps_NameIndex = 1919,
|
kInstMovntpd_NameIndex = 1919,
|
||||||
kInstMovntq_NameIndex = 1927,
|
kInstMovntps_NameIndex = 1927,
|
||||||
kInstMovptr_NameIndex = 1934,
|
kInstMovntq_NameIndex = 1935,
|
||||||
kInstMovq_NameIndex = 1942,
|
kInstMovq_NameIndex = 1942,
|
||||||
kInstMovq2dq_NameIndex = 1947,
|
kInstMovq2dq_NameIndex = 1947,
|
||||||
kInstMovsd_NameIndex = 1955,
|
kInstMovsd_NameIndex = 1955,
|
||||||
@@ -1732,14 +1767,14 @@ enum kInstData_NameIndex {
|
|||||||
kInstVfmaddps_NameIndex = 4775,
|
kInstVfmaddps_NameIndex = 4775,
|
||||||
kInstVfmaddsd_NameIndex = 4784,
|
kInstVfmaddsd_NameIndex = 4784,
|
||||||
kInstVfmaddss_NameIndex = 4793,
|
kInstVfmaddss_NameIndex = 4793,
|
||||||
kInstVfmaddsubpd_NameIndex = 4802,
|
kInstVfmaddsub132pd_NameIndex = 4802,
|
||||||
kInstVfmaddsubps_NameIndex = 4814,
|
kInstVfmaddsub132ps_NameIndex = 4817,
|
||||||
kInstVfmaddsub132pd_NameIndex = 4826,
|
kInstVfmaddsub213pd_NameIndex = 4832,
|
||||||
kInstVfmaddsub132ps_NameIndex = 4841,
|
kInstVfmaddsub213ps_NameIndex = 4847,
|
||||||
kInstVfmaddsub213pd_NameIndex = 4856,
|
kInstVfmaddsub231pd_NameIndex = 4862,
|
||||||
kInstVfmaddsub213ps_NameIndex = 4871,
|
kInstVfmaddsub231ps_NameIndex = 4877,
|
||||||
kInstVfmaddsub231pd_NameIndex = 4886,
|
kInstVfmaddsubpd_NameIndex = 4892,
|
||||||
kInstVfmaddsub231ps_NameIndex = 4901,
|
kInstVfmaddsubps_NameIndex = 4904,
|
||||||
kInstVfmsub132pd_NameIndex = 4916,
|
kInstVfmsub132pd_NameIndex = 4916,
|
||||||
kInstVfmsub132ps_NameIndex = 4928,
|
kInstVfmsub132ps_NameIndex = 4928,
|
||||||
kInstVfmsub132sd_NameIndex = 4940,
|
kInstVfmsub132sd_NameIndex = 4940,
|
||||||
@@ -1940,8 +1975,8 @@ enum kInstData_NameIndex {
|
|||||||
kInstVphaddwq_NameIndex = 6842,
|
kInstVphaddwq_NameIndex = 6842,
|
||||||
kInstVphminposuw_NameIndex = 6851,
|
kInstVphminposuw_NameIndex = 6851,
|
||||||
kInstVphsubbw_NameIndex = 6863,
|
kInstVphsubbw_NameIndex = 6863,
|
||||||
kInstVphsubdq_NameIndex = 6872,
|
kInstVphsubd_NameIndex = 6872,
|
||||||
kInstVphsubd_NameIndex = 6881,
|
kInstVphsubdq_NameIndex = 6880,
|
||||||
kInstVphsubsw_NameIndex = 6889,
|
kInstVphsubsw_NameIndex = 6889,
|
||||||
kInstVphsubw_NameIndex = 6898,
|
kInstVphsubw_NameIndex = 6898,
|
||||||
kInstVphsubwd_NameIndex = 6906,
|
kInstVphsubwd_NameIndex = 6906,
|
||||||
@@ -2417,6 +2452,7 @@ const InstInfo _instInfo[] = {
|
|||||||
INST(kInstMinsd , "minsd" , G(ExtRm) , F(None) , 0 , O(Xmm) , O(XmmMem) , U , U , O_F20F00(5D,U) , U ),
|
INST(kInstMinsd , "minsd" , G(ExtRm) , F(None) , 0 , O(Xmm) , O(XmmMem) , U , U , O_F20F00(5D,U) , U ),
|
||||||
INST(kInstMinss , "minss" , G(ExtRm) , F(None) , 0 , O(Xmm) , O(XmmMem) , U , U , O_F30F00(5D,U) , U ),
|
INST(kInstMinss , "minss" , G(ExtRm) , F(None) , 0 , O(Xmm) , O(XmmMem) , U , U , O_F30F00(5D,U) , U ),
|
||||||
INST(kInstMonitor , "monitor" , G(X86Op) , F(None)|F(Special) , 0 , U , U , U , U , O_000F01(C8,U) , U ),
|
INST(kInstMonitor , "monitor" , G(X86Op) , F(None)|F(Special) , 0 , U , U , U , U , O_000F01(C8,U) , U ),
|
||||||
|
INST(kInstMovPtr , "mov_ptr" , G(X86MovPtr) , F(Move)|F(Special) , 0 , O(Gqdwb) , O(Imm) , U , U , O_000000(A0,U) , O_000000(A2,U) ),
|
||||||
INST(kInstMov , "mov" , G(X86Mov) , F(Move) , 0 , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , U , U , U , U ),
|
INST(kInstMov , "mov" , G(X86Mov) , F(Move) , 0 , O(GqdwbMem) , O(GqdwbMem)|O(Imm) , U , U , U , U ),
|
||||||
INST(kInstMovapd , "movapd" , G(ExtMov) , F(Move) , 16, O(XmmMem) , O(XmmMem) , U , U , O_660F00(28,U) , O_660F00(29,U) ),
|
INST(kInstMovapd , "movapd" , G(ExtMov) , F(Move) , 16, O(XmmMem) , O(XmmMem) , U , U , O_660F00(28,U) , O_660F00(29,U) ),
|
||||||
INST(kInstMovaps , "movaps" , G(ExtMov) , F(Move) , 16, O(XmmMem) , O(XmmMem) , U , U , O_000F00(28,U) , O_000F00(29,U) ),
|
INST(kInstMovaps , "movaps" , G(ExtMov) , F(Move) , 16, O(XmmMem) , O(XmmMem) , U , U , O_000F00(28,U) , O_000F00(29,U) ),
|
||||||
@@ -2440,7 +2476,6 @@ const InstInfo _instInfo[] = {
|
|||||||
INST(kInstMovntpd , "movntpd" , G(ExtMov) , F(Move) , 16, O(Mem) , O(Xmm) , U , U , U , O_660F00(2B,U) ),
|
INST(kInstMovntpd , "movntpd" , G(ExtMov) , F(Move) , 16, O(Mem) , O(Xmm) , U , U , U , O_660F00(2B,U) ),
|
||||||
INST(kInstMovntps , "movntps" , G(ExtMov) , F(Move) , 16, O(Mem) , O(Xmm) , U , U , U , O_000F00(2B,U) ),
|
INST(kInstMovntps , "movntps" , G(ExtMov) , F(Move) , 16, O(Mem) , O(Xmm) , U , U , U , O_000F00(2B,U) ),
|
||||||
INST(kInstMovntq , "movntq" , G(ExtMov) , F(Move) , 8 , O(Mem) , O(Mm) , U , U , U , O_000F00(E7,U) ),
|
INST(kInstMovntq , "movntq" , G(ExtMov) , F(Move) , 8 , O(Mem) , O(Mm) , U , U , U , O_000F00(E7,U) ),
|
||||||
INST(kInstMovptr , "mov_ptr" , G(X86MovPtr) , F(Move)|F(Special) , 0 , O(Gqdwb) , O(Imm) , U , U , O_000000(A0,U) , O_000000(A2,U) ),
|
|
||||||
INST(kInstMovq , "movq" , G(ExtMovQ) , F(Move) , 16, O(Gq)|O(MmXmmMem) , O(Gq)|O(MmXmmMem) , U , U , U , U ),
|
INST(kInstMovq , "movq" , G(ExtMovQ) , F(Move) , 16, O(Gq)|O(MmXmmMem) , O(Gq)|O(MmXmmMem) , U , U , U , U ),
|
||||||
INST(kInstMovq2dq , "movq2dq" , G(ExtRm) , F(Move) , 16, O(Xmm) , O(Mm) , U , U , O_F30F00(D6,U) , U ),
|
INST(kInstMovq2dq , "movq2dq" , G(ExtRm) , F(Move) , 16, O(Xmm) , O(Mm) , U , U , O_F30F00(D6,U) , U ),
|
||||||
INST(kInstMovsd , "movsd" , G(ExtMov) , F(Move)|F(ZeroIfMem) , 8 , O(XmmMem) , O(XmmMem) , U , U , O_F20F00(10,U) , O_F20F00(11,U) ),
|
INST(kInstMovsd , "movsd" , G(ExtMov) , F(Move)|F(ZeroIfMem) , 8 , O(XmmMem) , O(XmmMem) , U , U , O_F20F00(10,U) , O_F20F00(11,U) ),
|
||||||
@@ -2808,14 +2843,14 @@ const InstInfo _instInfo[] = {
|
|||||||
INST(kInstVfmaddps , "vfmaddps" , G(Fma4_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , O(XmmYmmMem) , O_660F3A(68,U) , U ),
|
INST(kInstVfmaddps , "vfmaddps" , G(Fma4_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , O(XmmYmmMem) , O_660F3A(68,U) , U ),
|
||||||
INST(kInstVfmaddsd , "vfmaddsd" , G(Fma4) , F(None) , 0 , O(Xmm) , O(Xmm) , O(XmmMem) , O(XmmMem) , O_660F3A(6B,U) , U ),
|
INST(kInstVfmaddsd , "vfmaddsd" , G(Fma4) , F(None) , 0 , O(Xmm) , O(Xmm) , O(XmmMem) , O(XmmMem) , O_660F3A(6B,U) , U ),
|
||||||
INST(kInstVfmaddss , "vfmaddss" , G(Fma4) , F(None) , 0 , O(Xmm) , O(Xmm) , O(XmmMem) , O(XmmMem) , O_660F3A(6A,U) , U ),
|
INST(kInstVfmaddss , "vfmaddss" , G(Fma4) , F(None) , 0 , O(Xmm) , O(Xmm) , O(XmmMem) , O(XmmMem) , O_660F3A(6A,U) , U ),
|
||||||
INST(kInstVfmaddsubpd , "vfmaddsubpd" , G(Fma4_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , O(XmmYmmMem) , O_660F3A(5D,U) , U ),
|
|
||||||
INST(kInstVfmaddsubps , "vfmaddsubps" , G(Fma4_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , O(XmmYmmMem) , O_660F3A(5C,U) , U ),
|
|
||||||
INST(kInstVfmaddsub132pd , "vfmaddsub132pd" , G(AvxRvm_P) , F(None) |F(W), 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(96,U) , U ),
|
INST(kInstVfmaddsub132pd , "vfmaddsub132pd" , G(AvxRvm_P) , F(None) |F(W), 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(96,U) , U ),
|
||||||
INST(kInstVfmaddsub132ps , "vfmaddsub132ps" , G(AvxRvm_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(96,U) , U ),
|
INST(kInstVfmaddsub132ps , "vfmaddsub132ps" , G(AvxRvm_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(96,U) , U ),
|
||||||
INST(kInstVfmaddsub213pd , "vfmaddsub213pd" , G(AvxRvm_P) , F(None) |F(W), 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(A6,U) , U ),
|
INST(kInstVfmaddsub213pd , "vfmaddsub213pd" , G(AvxRvm_P) , F(None) |F(W), 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(A6,U) , U ),
|
||||||
INST(kInstVfmaddsub213ps , "vfmaddsub213ps" , G(AvxRvm_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(A6,U) , U ),
|
INST(kInstVfmaddsub213ps , "vfmaddsub213ps" , G(AvxRvm_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(A6,U) , U ),
|
||||||
INST(kInstVfmaddsub231pd , "vfmaddsub231pd" , G(AvxRvm_P) , F(None) |F(W), 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(B6,U) , U ),
|
INST(kInstVfmaddsub231pd , "vfmaddsub231pd" , G(AvxRvm_P) , F(None) |F(W), 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(B6,U) , U ),
|
||||||
INST(kInstVfmaddsub231ps , "vfmaddsub231ps" , G(AvxRvm_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(B6,U) , U ),
|
INST(kInstVfmaddsub231ps , "vfmaddsub231ps" , G(AvxRvm_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(B6,U) , U ),
|
||||||
|
INST(kInstVfmaddsubpd , "vfmaddsubpd" , G(Fma4_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , O(XmmYmmMem) , O_660F3A(5D,U) , U ),
|
||||||
|
INST(kInstVfmaddsubps , "vfmaddsubps" , G(Fma4_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , O(XmmYmmMem) , O_660F3A(5C,U) , U ),
|
||||||
INST(kInstVfmsub132pd , "vfmsub132pd" , G(AvxRvm_P) , F(None) |F(W), 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(9A,U) , U ),
|
INST(kInstVfmsub132pd , "vfmsub132pd" , G(AvxRvm_P) , F(None) |F(W), 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(9A,U) , U ),
|
||||||
INST(kInstVfmsub132ps , "vfmsub132ps" , G(AvxRvm_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(9A,U) , U ),
|
INST(kInstVfmsub132ps , "vfmsub132ps" , G(AvxRvm_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(9A,U) , U ),
|
||||||
INST(kInstVfmsub132sd , "vfmsub132sd" , G(AvxRvm) , F(None) |F(W), 0 , O(Xmm) , O(Xmm) , O(XmmMem) , U , O_660F38(9B,U) , U ),
|
INST(kInstVfmsub132sd , "vfmsub132sd" , G(AvxRvm) , F(None) |F(W), 0 , O(Xmm) , O(Xmm) , O(XmmMem) , U , O_660F38(9B,U) , U ),
|
||||||
@@ -3016,8 +3051,8 @@ const InstInfo _instInfo[] = {
|
|||||||
INST(kInstVphaddwq , "vphaddwq" , G(XopRm) , F(None) , 0 , O(Xmm) , O(XmmMem) , U , U , O_00_M09(C7,U) , U ),
|
INST(kInstVphaddwq , "vphaddwq" , G(XopRm) , F(None) , 0 , O(Xmm) , O(XmmMem) , U , U , O_00_M09(C7,U) , U ),
|
||||||
INST(kInstVphminposuw , "vphminposuw" , G(AvxRm) , F(None) , 0 , O(Xmm) , O(XmmMem) , U , U , O_660F38(41,U) , U ),
|
INST(kInstVphminposuw , "vphminposuw" , G(AvxRm) , F(None) , 0 , O(Xmm) , O(XmmMem) , U , U , O_660F38(41,U) , U ),
|
||||||
INST(kInstVphsubbw , "vphsubbw" , G(XopRm) , F(None) , 0 , O(Xmm) , O(XmmMem) , U , U , O_00_M09(E1,U) , U ),
|
INST(kInstVphsubbw , "vphsubbw" , G(XopRm) , F(None) , 0 , O(Xmm) , O(XmmMem) , U , U , O_00_M09(E1,U) , U ),
|
||||||
INST(kInstVphsubdq , "vphsubdq" , G(XopRm) , F(None) , 0 , O(Xmm) , O(XmmMem) , U , U , O_00_M09(E3,U) , U ),
|
|
||||||
INST(kInstVphsubd , "vphsubd" , G(AvxRvm_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(06,U) , U ),
|
INST(kInstVphsubd , "vphsubd" , G(AvxRvm_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(06,U) , U ),
|
||||||
|
INST(kInstVphsubdq , "vphsubdq" , G(XopRm) , F(None) , 0 , O(Xmm) , O(XmmMem) , U , U , O_00_M09(E3,U) , U ),
|
||||||
INST(kInstVphsubsw , "vphsubsw" , G(AvxRvm_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(07,U) , U ),
|
INST(kInstVphsubsw , "vphsubsw" , G(AvxRvm_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(07,U) , U ),
|
||||||
INST(kInstVphsubw , "vphsubw" , G(AvxRvm_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(05,U) , U ),
|
INST(kInstVphsubw , "vphsubw" , G(AvxRvm_P) , F(None) , 0 , O(XmmYmm) , O(XmmYmm) , O(XmmYmmMem) , U , O_660F38(05,U) , U ),
|
||||||
INST(kInstVphsubwd , "vphsubwd" , G(XopRm) , F(None) , 0 , O(Xmm) , O(XmmMem) , U , U , O_00_M09(E2,U) , U ),
|
INST(kInstVphsubwd , "vphsubwd" , G(XopRm) , F(None) , 0 , O(Xmm) , O(XmmMem) , U , U , O_00_M09(E2,U) , U ),
|
||||||
@@ -3208,6 +3243,87 @@ const InstInfo _instInfo[] = {
|
|||||||
|
|
||||||
#undef INST
|
#undef INST
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// [asmjit::x86x64::X86Util]
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// Compare two instruction names.
|
||||||
|
//
|
||||||
|
// `a` is null terminated instruction name from `_instName[]` table.
|
||||||
|
// `b` is non-null terminated instruction name passed to `getInstIdByName()`.
|
||||||
|
static ASMJIT_INLINE int X86InstUtil_cmpName(const char* a, const char* b, size_t len) {
|
||||||
|
for (size_t i = 0; i < len; i++) {
|
||||||
|
int c = static_cast<int>(static_cast<uint8_t>(a[i])) -
|
||||||
|
static_cast<int>(static_cast<uint8_t>(b[i])) ;
|
||||||
|
if (c != 0)
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
return static_cast<int>(a[len]);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t X86InstUtil::getInstIdByName(const char* name, size_t len) {
|
||||||
|
if (name == NULL)
|
||||||
|
return kInstNone;
|
||||||
|
|
||||||
|
if (len == kInvalidIndex)
|
||||||
|
len = ::strlen(name);
|
||||||
|
|
||||||
|
if (len == 0)
|
||||||
|
return kInstNone;
|
||||||
|
|
||||||
|
uint32_t prefix = name[0] - kInstAlphaIndexFirst;
|
||||||
|
if (prefix > kInstAlphaIndexLast - kInstAlphaIndexFirst)
|
||||||
|
return kInstNone;
|
||||||
|
|
||||||
|
uint32_t index = _instAlphaIndex[prefix];
|
||||||
|
if (index == kInstAlphaIndexInvalid)
|
||||||
|
return kInstNone;
|
||||||
|
|
||||||
|
const InstInfo* base = _instInfo + index;
|
||||||
|
const InstInfo* end = _instInfo + _kInstCount;
|
||||||
|
|
||||||
|
// Handle instructions starting with 'j' specially. `jcc` instruction breaks
|
||||||
|
// the sorting, because of the suffixes (it's considered as one instruction),
|
||||||
|
// so basically `jecxz` and `jmp` are stored after all `jcc` instructions.
|
||||||
|
bool linearSearch = prefix == ('j' - kInstAlphaIndexFirst);
|
||||||
|
|
||||||
|
while (++prefix <= kInstAlphaIndexLast - kInstAlphaIndexFirst) {
|
||||||
|
index = _instAlphaIndex[prefix];
|
||||||
|
if (index == kInstAlphaIndexInvalid)
|
||||||
|
continue;
|
||||||
|
end = _instInfo + index;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (linearSearch) {
|
||||||
|
while (base != end) {
|
||||||
|
if (X86InstUtil_cmpName(base->getName(), name, len) == 0)
|
||||||
|
return static_cast<uint32_t>((size_t)(base - _instInfo));
|
||||||
|
base++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (size_t lim = (size_t)(end - base); lim != 0; lim >>= 1) {
|
||||||
|
const InstInfo* cur = base + (lim >> 1);
|
||||||
|
int result = X86InstUtil_cmpName(cur->getName(), name, len);
|
||||||
|
|
||||||
|
if (result < 0) {
|
||||||
|
base = cur + 1;
|
||||||
|
lim--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result > 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return static_cast<uint32_t>((size_t)(cur - _instInfo));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return kInstNone;
|
||||||
|
}
|
||||||
|
|
||||||
} // x86x64 namespace
|
} // x86x64 namespace
|
||||||
} // asmjit namespace
|
} // asmjit namespace
|
||||||
|
|
||||||
|
|||||||
@@ -334,6 +334,7 @@ ASMJIT_ENUM(kInstCode) {
|
|||||||
kInstMinsd, // SSE2
|
kInstMinsd, // SSE2
|
||||||
kInstMinss, // SSE
|
kInstMinss, // SSE
|
||||||
kInstMonitor, // SSE3
|
kInstMonitor, // SSE3
|
||||||
|
kInstMovPtr, // X86/X64
|
||||||
kInstMov, // X86/X64
|
kInstMov, // X86/X64
|
||||||
kInstMovapd, // SSE2
|
kInstMovapd, // SSE2
|
||||||
kInstMovaps, // SSE
|
kInstMovaps, // SSE
|
||||||
@@ -357,7 +358,6 @@ ASMJIT_ENUM(kInstCode) {
|
|||||||
kInstMovntpd, // SSE2
|
kInstMovntpd, // SSE2
|
||||||
kInstMovntps, // SSE
|
kInstMovntps, // SSE
|
||||||
kInstMovntq, // MMX-Ext
|
kInstMovntq, // MMX-Ext
|
||||||
kInstMovptr, // X86/X64
|
|
||||||
kInstMovq, // MMX/SSE/SSE2
|
kInstMovq, // MMX/SSE/SSE2
|
||||||
kInstMovq2dq, // SSE2
|
kInstMovq2dq, // SSE2
|
||||||
kInstMovsd, // SSE2
|
kInstMovsd, // SSE2
|
||||||
@@ -745,14 +745,14 @@ ASMJIT_ENUM(kInstCode) {
|
|||||||
kInstVfmsub231ps, // FMA3
|
kInstVfmsub231ps, // FMA3
|
||||||
kInstVfmsub231sd, // FMA3
|
kInstVfmsub231sd, // FMA3
|
||||||
kInstVfmsub231ss, // FMA3
|
kInstVfmsub231ss, // FMA3
|
||||||
|
kInstVfmsubaddpd, // FMA4
|
||||||
|
kInstVfmsubaddps, // FMA4
|
||||||
kInstVfmsubadd132pd, // FMA3
|
kInstVfmsubadd132pd, // FMA3
|
||||||
kInstVfmsubadd132ps, // FMA3
|
kInstVfmsubadd132ps, // FMA3
|
||||||
kInstVfmsubadd213pd, // FMA3
|
kInstVfmsubadd213pd, // FMA3
|
||||||
kInstVfmsubadd213ps, // FMA3
|
kInstVfmsubadd213ps, // FMA3
|
||||||
kInstVfmsubadd231pd, // FMA3
|
kInstVfmsubadd231pd, // FMA3
|
||||||
kInstVfmsubadd231ps, // FMA3
|
kInstVfmsubadd231ps, // FMA3
|
||||||
kInstVfmsubaddpd, // FMA4
|
|
||||||
kInstVfmsubaddps, // FMA4
|
|
||||||
kInstVfmsubpd, // FMA4
|
kInstVfmsubpd, // FMA4
|
||||||
kInstVfmsubps, // FMA4
|
kInstVfmsubps, // FMA4
|
||||||
kInstVfmsubsd, // FMA4
|
kInstVfmsubsd, // FMA4
|
||||||
@@ -933,8 +933,8 @@ ASMJIT_ENUM(kInstCode) {
|
|||||||
kInstVphaddwq, // XOP
|
kInstVphaddwq, // XOP
|
||||||
kInstVphminposuw, // AVX
|
kInstVphminposuw, // AVX
|
||||||
kInstVphsubbw, // XOP
|
kInstVphsubbw, // XOP
|
||||||
kInstVphsubdq, // XOP
|
|
||||||
kInstVphsubd, // AVX2
|
kInstVphsubd, // AVX2
|
||||||
|
kInstVphsubdq, // XOP
|
||||||
kInstVphsubsw, // AVX2
|
kInstVphsubsw, // AVX2
|
||||||
kInstVphsubw, // AVX2
|
kInstVphsubw, // AVX2
|
||||||
kInstVphsubwd, // XOP
|
kInstVphsubwd, // XOP
|
||||||
@@ -1823,6 +1823,15 @@ struct InstInfo {
|
|||||||
uint32_t _opCode[2];
|
uint32_t _opCode[2];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// [asmjit::x86x64::X86InstUtil]
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
struct X86InstUtil {
|
||||||
|
ASMJIT_API static uint32_t getInstIdByName(
|
||||||
|
const char* name, size_t len = kInvalidIndex);
|
||||||
|
};
|
||||||
|
|
||||||
//! \}
|
//! \}
|
||||||
|
|
||||||
} // x64 namespace
|
} // x64 namespace
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ namespace asmjit {
|
|||||||
namespace x86x64 {
|
namespace x86x64 {
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// [asmjit::x86x64::Cond]
|
// [asmjit::x86x64::Condition Codes]
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
#define CC_TO_INST(_Inst_) { \
|
#define CC_TO_INST(_Inst_) { \
|
||||||
|
|||||||
@@ -302,6 +302,10 @@ struct RegMask {
|
|||||||
|
|
||||||
//! X86/X64 utilities.
|
//! X86/X64 utilities.
|
||||||
struct X86Util {
|
struct X86Util {
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// [Condition Codes]
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
//! Corresponds to transposing the operands of a comparison.
|
//! Corresponds to transposing the operands of a comparison.
|
||||||
static ASMJIT_INLINE uint32_t reverseCond(uint32_t cond) {
|
static ASMJIT_INLINE uint32_t reverseCond(uint32_t cond) {
|
||||||
ASMJIT_ASSERT(cond < ASMJIT_ARRAY_SIZE(_reverseCond));
|
ASMJIT_ASSERT(cond < ASMJIT_ARRAY_SIZE(_reverseCond));
|
||||||
@@ -335,12 +339,20 @@ struct X86Util {
|
|||||||
return _condToSetcc[cond];
|
return _condToSetcc[cond];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// [Registers]
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
//! Get whether the `op` operand is Gpb-Lo or Gpb-Hi register.
|
//! Get whether the `op` operand is Gpb-Lo or Gpb-Hi register.
|
||||||
static ASMJIT_INLINE bool isGpbRegOp(const Operand& op) {
|
static ASMJIT_INLINE bool isGpbRegOp(const Operand& op) {
|
||||||
const uint32_t mask = IntUtil::pack32_2x8_1x16(0xFF, 0xFF, ~(kRegTypePatchedGpbHi << 8) & 0xFF00);
|
const uint32_t mask = IntUtil::pack32_2x8_1x16(0xFF, 0xFF, ~(kRegTypePatchedGpbHi << 8) & 0xFF00);
|
||||||
return (op._packed[0].u32[0] & mask) == IntUtil::pack32_2x8_1x16(kOperandTypeReg, 1, 0x0000);
|
return (op._packed[0].u32[0] & mask) == IntUtil::pack32_2x8_1x16(kOperandTypeReg, 1, 0x0000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
// [Immediates]
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
//! Pack a shuffle constant to be used with multimedia instrutions (2 values).
|
//! Pack a shuffle constant to be used with multimedia instrutions (2 values).
|
||||||
//!
|
//!
|
||||||
//! \param x First component position, number at interval [0, 1] inclusive.
|
//! \param x First component position, number at interval [0, 1] inclusive.
|
||||||
|
|||||||
@@ -47,25 +47,6 @@ var inject = function(s, start, end, code) {
|
|||||||
// SuffixIndex - Index to a suffix string.
|
// SuffixIndex - Index to a suffix string.
|
||||||
|
|
||||||
var Database = (function() {
|
var Database = (function() {
|
||||||
function bestSuffix(s, suffixes) {
|
|
||||||
var best = -1;
|
|
||||||
|
|
||||||
for (var i = 0; i < suffixes.length; i++) {
|
|
||||||
var suffix = suffixes[i];
|
|
||||||
var si = s.lastIndexOf(suffix);
|
|
||||||
|
|
||||||
if (si === -1 || si + suffix.length != s.length)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (best !== -1 && suffix.length < suffixes[best].length)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
best = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
return best;
|
|
||||||
}
|
|
||||||
|
|
||||||
var IndexedString = function() {
|
var IndexedString = function() {
|
||||||
this.array = [];
|
this.array = [];
|
||||||
this.index = 0;
|
this.index = 0;
|
||||||
@@ -106,13 +87,10 @@ var Database = (function() {
|
|||||||
return this.index;
|
return this.index;
|
||||||
};
|
};
|
||||||
|
|
||||||
var Database = function(suffixes) {
|
var Database = function() {
|
||||||
this.map = {};
|
this.map = {};
|
||||||
this.suffixes = suffixes;
|
this.alphabetical = new Array(26);
|
||||||
|
|
||||||
this.fullString = new IndexedString();
|
this.fullString = new IndexedString();
|
||||||
this.prefixString = new IndexedString();
|
|
||||||
this.suffixString = new IndexedString();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Database.prototype.add = function(name, id) {
|
Database.prototype.add = function(name, id) {
|
||||||
@@ -120,41 +98,29 @@ var Database = (function() {
|
|||||||
id: id,
|
id: id,
|
||||||
fullIndex: 0,
|
fullIndex: 0,
|
||||||
prefixIndex: 0,
|
prefixIndex: 0,
|
||||||
suffixIndex: 0,
|
|
||||||
hasV: 0
|
hasV: 0
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
Database.prototype.index = function() {
|
Database.prototype.index = function() {
|
||||||
var map = this.map;
|
var map = this.map;
|
||||||
var suffixes = this.suffixes;
|
var alphabetical = this.alphabetical;
|
||||||
|
|
||||||
for (var i = 0; i < suffixes.length; i++) {
|
|
||||||
this.suffixString.add(suffixes[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var name in map) {
|
for (var name in map) {
|
||||||
var inst = map[name];
|
var inst = map[name];
|
||||||
var si = bestSuffix(name, suffixes);
|
|
||||||
|
|
||||||
inst.fullIndex = this.fullString.add(name);
|
inst.fullIndex = this.fullString.add(name);
|
||||||
|
|
||||||
|
var aIndex = name.charCodeAt(0) - 'a'.charCodeAt(0);
|
||||||
|
if (aIndex < 0 || aIndex >= 26)
|
||||||
|
throw new Error("Alphabetical index error");
|
||||||
|
|
||||||
|
if (alphabetical[aIndex] === undefined)
|
||||||
|
alphabetical[aIndex] = inst.id;
|
||||||
|
|
||||||
if (name.indexOf("v") === 0) {
|
if (name.indexOf("v") === 0) {
|
||||||
inst.hasV = 1;
|
inst.hasV = 1;
|
||||||
name = name.substr(1);
|
name = name.substr(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (si !== -1) {
|
|
||||||
var suffix = suffixes[si];
|
|
||||||
var prefix = name.substr(0, name.length - suffix.length);
|
|
||||||
|
|
||||||
inst.prefixIndex = this.prefixString.add(prefix);
|
|
||||||
inst.suffixIndex = this.suffixString.add(suffix);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
inst.prefixIndex = this.prefixString.add(name);
|
|
||||||
inst.suffixIndex = this.suffixString.add("");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -165,7 +131,7 @@ var Database = (function() {
|
|||||||
// [Generate]
|
// [Generate]
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
var generate = function(fileName, arch, suffixes) {
|
var generate = function(fileName, arch) {
|
||||||
var oldData = fs.readFileSync(fileName, "utf8").replace(/\r\n/g, "\n");
|
var oldData = fs.readFileSync(fileName, "utf8").replace(/\r\n/g, "\n");
|
||||||
|
|
||||||
var data = oldData;
|
var data = oldData;
|
||||||
@@ -174,7 +140,7 @@ var generate = function(fileName, arch, suffixes) {
|
|||||||
var Arch = uppercaseFirst(arch);
|
var Arch = uppercaseFirst(arch);
|
||||||
|
|
||||||
// Create database.
|
// Create database.
|
||||||
var db = new Database(suffixes);
|
var db = new Database();
|
||||||
var re = new RegExp("INST\\(([A-Za-z0-9_]+)\\s*,\\s*\\\"([A-Za-z0-9_ ]*)\\\"", "g");
|
var re = new RegExp("INST\\(([A-Za-z0-9_]+)\\s*,\\s*\\\"([A-Za-z0-9_ ]*)\\\"", "g");
|
||||||
|
|
||||||
while (m = re.exec(data)) {
|
while (m = re.exec(data)) {
|
||||||
@@ -186,8 +152,6 @@ var generate = function(fileName, arch, suffixes) {
|
|||||||
db.index();
|
db.index();
|
||||||
|
|
||||||
console.log("Full size: " + db.fullString.getSize());
|
console.log("Full size: " + db.fullString.getSize());
|
||||||
console.log("Prefix size: " + db.prefixString.getSize());
|
|
||||||
console.log("Suffix size: " + db.suffixString.getSize());
|
|
||||||
|
|
||||||
// Generate InstName[] string.
|
// Generate InstName[] string.
|
||||||
code += "const char _instName[] =\n";
|
code += "const char _instName[] =\n";
|
||||||
@@ -197,7 +161,25 @@ var generate = function(fileName, arch, suffixes) {
|
|||||||
}
|
}
|
||||||
code = code.substr(code, code.length - 1) + ";\n\n";
|
code = code.substr(code, code.length - 1) + ";\n\n";
|
||||||
|
|
||||||
|
// Generate AlphaIndex.
|
||||||
|
code += "enum kInstAlphaIndex {\n";
|
||||||
|
code += " kInstAlphaIndexFirst = 'a',\n";
|
||||||
|
code += " kInstAlphaIndexLast = 'z',\n";
|
||||||
|
code += " kInstAlphaIndexInvalid = 0xFFFF\n";
|
||||||
|
code += "};\n";
|
||||||
|
code += "\n";
|
||||||
|
|
||||||
// Generate NameIndex.
|
// Generate NameIndex.
|
||||||
|
code += "static const uint16_t _instAlphaIndex[26] = {\n";
|
||||||
|
for (var i = 0; i < db.alphabetical.length; i++) {
|
||||||
|
var id = db.alphabetical[i];
|
||||||
|
code += " " + (id === undefined ? "0xFFFF" : id);
|
||||||
|
if (i !== db.alphabetical.length - 1)
|
||||||
|
code += ",";
|
||||||
|
code += "\n";
|
||||||
|
}
|
||||||
|
code += "};\n\n";
|
||||||
|
|
||||||
code += "enum kInstData_NameIndex {\n";
|
code += "enum kInstData_NameIndex {\n";
|
||||||
for (var k in db.map) {
|
for (var k in db.map) {
|
||||||
var inst = db.map[k];
|
var inst = db.map[k];
|
||||||
@@ -219,35 +201,13 @@ var generate = function(fileName, arch, suffixes) {
|
|||||||
|
|
||||||
var main = function(files) {
|
var main = function(files) {
|
||||||
files.forEach(function(file) {
|
files.forEach(function(file) {
|
||||||
generate(file.name, file.arch, file.suffixes);
|
generate(file.name, file.arch);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
main([
|
main([
|
||||||
{
|
{
|
||||||
name: "../src/asmjit/x86/x86inst.cpp",
|
name: "../src/asmjit/x86/x86inst.cpp",
|
||||||
arch: "x86",
|
arch: "x86"
|
||||||
suffixes: [
|
|
||||||
"a", "ae",
|
|
||||||
"b", "bd", "be", "bq", "bw",
|
|
||||||
"c",
|
|
||||||
"d", "dq", "dqa", "dqu", "dw",
|
|
||||||
"e",
|
|
||||||
"f128",
|
|
||||||
"g", "ge",
|
|
||||||
"hpd", "hps",
|
|
||||||
"i", "i128", "ip",
|
|
||||||
"l", "last", "ld", "le", "lpd", "lps", "lw",
|
|
||||||
"na", "nae", "nb", "nbe", "nc", "ne", "ng", "nge", "nl", "nle", "no", "np", "ns", "nz",
|
|
||||||
"o",
|
|
||||||
"p", "pd", "pe", "ph", "pi", "po", "pp", "ps",
|
|
||||||
"q",
|
|
||||||
"r",
|
|
||||||
"s", "sb", "sd", "si", "sq", "ss", "sw",
|
|
||||||
"usb", "usw",
|
|
||||||
"vpd", "vps",
|
|
||||||
"w", "wb", "wd", "wq",
|
|
||||||
"z"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
|||||||
Reference in New Issue
Block a user