Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
tsoc
openmm
Commits
97ce448c
Commit
97ce448c
authored
Feb 12, 2015
by
peastman
Browse files
Merge pull request #806 from peastman/jit32
Updated to latest asmjit, which supports 32 bit mode
parents
fabb38d1
01da1b51
Changes
45
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
1635 additions
and
840 deletions
+1635
-840
libraries/asmjit/x86/x86inst.h
libraries/asmjit/x86/x86inst.h
+580
-381
libraries/asmjit/x86/x86operand.h
libraries/asmjit/x86/x86operand.h
+800
-301
libraries/asmjit/x86/x86operand_regs.cpp
libraries/asmjit/x86/x86operand_regs.cpp
+253
-156
libraries/asmjit/x86/x86scheduler.cpp
libraries/asmjit/x86/x86scheduler.cpp
+1
-1
serialization/src/XmlSerializer.cpp
serialization/src/XmlSerializer.cpp
+1
-1
No files found.
libraries/asmjit/x86/x86inst.h
View file @
97ce448c
...
...
@@ -73,14 +73,19 @@ ASMJIT_VAR const uint32_t _x86CondToJcc[20];
ASMJIT_VAR
const
uint32_t
_x86CondToSetcc
[
20
];
// ============================================================================
// [asmjit::
k
X86InstId]
// [asmjit::X86InstId]
// ============================================================================
//! X86/X64 instruction
code
s.
//! X86/X64 instruction
ID
s.
//!
//! Note that these instruction codes are AsmJit specific. Each instruction has
//! a unique ID that is used as an index to AsmJit instruction table.
ASMJIT_ENUM
(
kX86InstId
)
{
//! a unique ID that is used as an index to AsmJit instruction table. The list
//! is sorted alphabetically except instructions starting with `j`, because the
//! `jcc` instruction is composition of an opcode and condition code. It means
//! that these instructions are sorted as `jcc`, `jecxz` and `jmp`. Please use
//! \ref X86Util::getInstIdByName() if you need instruction name to ID mapping
//! and are not aware on how to handle such case.
ASMJIT_ENUM
(
X86InstId
)
{
kX86InstIdAdc
=
1
,
// X86/X64
kX86InstIdAdd
,
// X86/X64
kX86InstIdAddpd
,
// SSE2
...
...
@@ -111,7 +116,7 @@ ASMJIT_ENUM(kX86InstId) {
kX86InstIdBlsr
,
// BMI
kX86InstIdBsf
,
// X86/X64
kX86InstIdBsr
,
// X86/X64
kX86InstIdBswap
,
// X86/X64 (i486)
kX86InstIdBswap
,
// X86/X64 (i486
+
)
kX86InstIdBt
,
// X86/X64
kX86InstIdBtc
,
// X86/X64
kX86InstIdBtr
,
// X86/X64
...
...
@@ -125,36 +130,36 @@ ASMJIT_ENUM(kX86InstId) {
kX86InstIdCld
,
// X86/X64
kX86InstIdClflush
,
// SSE2
kX86InstIdCmc
,
// X86/X64
kX86InstIdCmova
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovae
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovb
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovbe
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovc
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmove
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovg
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovge
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovl
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovle
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovna
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovnae
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovnb
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovnbe
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovnc
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovne
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovng
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovnge
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovnl
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovnle
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovno
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovnp
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovns
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovnz
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovo
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovp
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovpe
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovpo
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovs
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmovz
,
// X86/X64 (cmovcc) (i586)
kX86InstIdCmova
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovae
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovb
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovbe
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovc
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmove
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovg
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovge
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovl
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovle
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovna
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovnae
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovnb
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovnbe
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovnc
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovne
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovng
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovnge
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovnl
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovnle
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovno
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovnp
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovns
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovnz
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovo
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovp
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovpe
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovpo
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovs
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmovz
,
// X86/X64 (cmovcc) (i586
+
)
kX86InstIdCmp
,
// X86/X64
kX86InstIdCmppd
,
// SSE2
kX86InstIdCmpps
,
// SSE
...
...
@@ -164,12 +169,12 @@ ASMJIT_ENUM(kX86InstId) {
kX86InstIdCmpsW
,
// CMPS - X86/X64
kX86InstIdCmpsd
,
// SSE2
kX86InstIdCmpss
,
// SSE
kX86InstIdCmpxchg
,
// X86/X64 (i486)
kX86InstIdCmpxchg
,
// X86/X64 (i486
+
)
kX86InstIdCmpxchg16b
,
// X64 only
kX86InstIdCmpxchg8b
,
// X86/X64 (i586)
kX86InstIdCmpxchg8b
,
// X86/X64 (i586
+
)
kX86InstIdComisd
,
// SSE2
kX86InstIdComiss
,
// SSE
kX86InstIdCpuid
,
// X86/X64 (i486)
kX86InstIdCpuid
,
// X86/X64 (i486
/i586+
)
kX86InstIdCqo
,
// X64 only
kX86InstIdCrc32
,
// SSE4.2
kX86InstIdCvtdq2pd
,
// SSE2
...
...
@@ -209,6 +214,7 @@ ASMJIT_ENUM(kX86InstId) {
kX86InstIdEmms
,
// MMX
kX86InstIdEnter
,
// X86/X64
kX86InstIdExtractps
,
// SSE4.1
kX86InstIdExtrq
,
// SSE4a
kX86InstIdF2xm1
,
// FPU
kX86InstIdFabs
,
// FPU
kX86InstIdFadd
,
// FPU
...
...
@@ -313,6 +319,7 @@ ASMJIT_ENUM(kX86InstId) {
kX86InstIdImul
,
// X86/X64
kX86InstIdInc
,
// X86/X64
kX86InstIdInsertps
,
// SSE4.1
kX86InstIdInsertq
,
// SSE4a
kX86InstIdInt
,
// X86/X64
kX86InstIdJa
,
// X86/X64 (jcc)
kX86InstIdJae
,
// X86/X64 (jcc)
...
...
@@ -393,6 +400,8 @@ ASMJIT_ENUM(kX86InstId) {
kX86InstIdMovntpd
,
// SSE2
kX86InstIdMovntps
,
// SSE
kX86InstIdMovntq
,
// MMX-Ext
kX86InstIdMovntsd
,
// SSE4a
kX86InstIdMovntss
,
// SSE4a
kX86InstIdMovq
,
// MMX/SSE/SSE2
kX86InstIdMovq2dq
,
// SSE2
kX86InstIdMovsB
,
// MOVS - X86/X64
...
...
@@ -1125,11 +1134,19 @@ ASMJIT_ENUM(kX86InstId) {
kX86InstIdVzeroupper
,
// AVX
kX86InstIdWrfsbase
,
// FSGSBASE (x64)
kX86InstIdWrgsbase
,
// FSGSBASE (x64)
kX86InstIdXadd
,
// X86/X64 (i486)
kX86InstIdXchg
,
// X86/X64 (i386)
kX86InstIdXadd
,
// X86/X64 (i486+)
kX86InstIdXchg
,
// X86/X64
kX86InstIdXgetbv
,
// XSAVE
kX86InstIdXor
,
// X86/X64
kX86InstIdXorpd
,
// SSE2
kX86InstIdXorps
,
// SSE
kX86InstIdXrstor
,
// XSAVE
kX86InstIdXrstor64
,
// XSAVE
kX86InstIdXsave
,
// XSAVE
kX86InstIdXsave64
,
// XSAVE
kX86InstIdXsaveopt
,
// XSAVE
kX86InstIdXsaveopt64
,
// XSAVE
kX86InstIdXsetbv
,
// XSAVE
_kX86InstIdCount
,
...
...
@@ -1142,34 +1159,59 @@ ASMJIT_ENUM(kX86InstId) {
};
// ============================================================================
// [asmjit::
k
X86InstOptions]
// [asmjit::X86InstOptions]
// ============================================================================
//! X86/X64 instruction emit options, mainly for internal purposes.
ASMJIT_ENUM
(
k
X86InstOptions
)
{
ASMJIT_ENUM
(
X86InstOptions
)
{
//! Emit instruction with LOCK prefix.
//!
//! If this option is used and instruction doesn't support LOCK prefix an
//! invalid instruction error is generated.
kX86InstOptionLock
=
0x10
,
kX86InstOptionLock
=
0x
000000
10
,
//! Force REX prefix
to be emitted
.
//! Force REX prefix
(X64)
.
//!
//! This option should be used carefully, because there are unencodable
//! combinations. If you want to access ah, bh, ch or dh registers the REX
//! prefix can't be emitted, otherwise illegal instruction error will be
//! returned.
kX86InstOptionRex
=
0x40
,
//! Force three-byte VEX prefix to be emitted (instead of more compact
//! two-byte VEX prefix).
//! This option should be used carefully as there are combinations of
//! instructions and their operands that are not encodable. The REX prefix
//! can't be used together with AH, BH, CH, and DH registers. AsmJit reports
//! \ref kErrorIllegalInstruction in such case.
kX86InstOptionRex
=
0x00000040
,
//! \internal
//!
//! Ignored if the instruction doesn't use VEX prefix.
kX86InstOptionVex3
=
0x80
//! Reserved by `X86Assembler`, do not use!
_kX86InstOptionNoRex
=
0x00000080
,
//! Force 3-byte VEX prefix even if the instruction is encodable by 2-byte
//! VEX prefix (AVX).
//!
//! Ignored if the instruction is not AVX or `kX86InstOptionEVEX` is used.
kX86InstOptionVex3
=
0x00000100
,
//! Force 4-byte EVEX prefix even if the instruction is encodable by using
//! VEX prefix. Please note that all higher bits from `kX86InstOptionEvex`
//! are reserved for EVEX and forces EVEX encoding to be used implicitly.
kX86InstOptionEvex
=
0x00010000
,
//! Use zeroing instead of merging (AVX512+).
kX86InstOptionEvexZero
=
0x00020000
,
//! Broadcast one element to all other elements (AVX512+).
kX86InstOptionEvexOneN
=
0x00040000
,
//! Suppress all exceptions (AVX512+).
kX86InstOptionEvexSae
=
0x00080000
,
//! Static rounding mode `round-to-nearest` (even) and `SAE` (AVX512+).
kX86InstOptionEvexRnSae
=
0x00100000
,
//! Static rounding mode `round-down` (toward -inf) and `SAE` (AVX512+).
kX86InstOptionEvexRdSae
=
0x00200000
,
//! Static rounding mode `round-up` (toward +inf) and `SAE` (AVX512+).
kX86InstOptionEvexRuSae
=
0x00400000
,
//! Static rounding mode `round-toward-zero` (truncate) and `SAE` (AVX512+).
kX86InstOptionEvexRzSae
=
0x00800000
};
// ============================================================================
// [asmjit::
k
X86Inst
Group
]
// [asmjit::X86Inst
EncodingId
]
// ============================================================================
//! \internal
...
...
@@ -1177,294 +1219,373 @@ ASMJIT_ENUM(kX86InstOptions) {
//! X86/X64 instruction groups.
//!
//! This group is specific to AsmJit and only used by `X86Assembler`.
ASMJIT_ENUM
(
k
X86Inst
Group
)
{
ASMJIT_ENUM
(
X86Inst
EncodingId
)
{
//! Never used.
kX86Inst
GroupNone
,
kX86Inst
Group
X86Op
,
kX86Inst
Group
X86Op_66H
,
kX86Inst
Group
X86Rm
,
kX86Inst
Group
X86Rm_B
,
kX86Inst
Group
X86RmReg
,
kX86Inst
Group
X86RegRm
,
kX86Inst
Group
X86M
,
kX86Inst
EncodingIdNone
=
0
,
kX86Inst
EncodingId
X86Op
,
kX86Inst
EncodingId
X86Op_66H
,
kX86Inst
EncodingId
X86Rm
,
kX86Inst
EncodingId
X86Rm_B
,
kX86Inst
EncodingId
X86RmReg
,
kX86Inst
EncodingId
X86RegRm
,
kX86Inst
EncodingId
X86M
,
//! Adc/Add/And/Cmp/Or/Sbb/Sub/Xor.
kX86Inst
Group
X86Arith
,
kX86Inst
EncodingId
X86Arith
,
//! Bswap.
kX86Inst
Group
X86BSwap
,
kX86Inst
EncodingId
X86BSwap
,
//! Bt/Btc/Btr/Bts.
kX86Inst
Group
X86BTest
,
kX86Inst
EncodingId
X86BTest
,
//! Call.
kX86Inst
Group
X86Call
,
kX86Inst
EncodingId
X86Call
,
//! Enter.
kX86Inst
Group
X86Enter
,
kX86Inst
EncodingId
X86Enter
,
//! Imul.
kX86Inst
Group
X86Imul
,
kX86Inst
EncodingId
X86Imul
,
//! Inc/Dec.
kX86Inst
Group
X86IncDec
,
kX86Inst
EncodingId
X86IncDec
,
//! Int.
kX86Inst
Group
X86Int
,
kX86Inst
EncodingId
X86Int
,
//! Jcc.
kX86Inst
Group
X86Jcc
,
kX86Inst
EncodingId
X86Jcc
,
//! Jcxz/Jecxz/Jrcxz.
kX86Inst
Group
X86Jecxz
,
kX86Inst
EncodingId
X86Jecxz
,
//! Jmp.
kX86Inst
Group
X86Jmp
,
kX86Inst
EncodingId
X86Jmp
,
//! Lea.
kX86Inst
Group
X86Lea
,
kX86Inst
EncodingId
X86Lea
,
//! Mov.
kX86Inst
Group
X86Mov
,
kX86Inst
EncodingId
X86Mov
,
//! Movsx/Movzx.
kX86Inst
Group
X86MovSxZx
,
kX86Inst
EncodingId
X86MovSxZx
,
//! Movsxd.
kX86Inst
Group
X86MovSxd
,
kX86Inst
EncodingId
X86MovSxd
,
//! Mov having absolute memory operand (x86/x64).
kX86Inst
Group
X86MovPtr
,
kX86Inst
EncodingId
X86MovPtr
,
//! Push.
kX86Inst
Group
X86Push
,
kX86Inst
EncodingId
X86Push
,
//! Pop.
kX86Inst
Group
X86Pop
,
kX86Inst
EncodingId
X86Pop
,
//! Rep/Repe/Repne LodsX/MovsX/StosX/CmpsX/ScasX.
kX86Inst
Group
X86Rep
,
kX86Inst
EncodingId
X86Rep
,
//! Ret.
kX86Inst
Group
X86Ret
,
kX86Inst
EncodingId
X86Ret
,
//! Rcl/Rcr/Rol/Ror/Sal/Sar/Shl/Shr.
kX86Inst
Group
X86Rot
,
kX86Inst
EncodingId
X86Rot
,
//! Setcc.
kX86Inst
Group
X86Set
,
kX86Inst
EncodingId
X86Set
,
//! Shld/Rhrd.
kX86Inst
Group
X86Shlrd
,
kX86Inst
EncodingId
X86Shlrd
,
//! Test.
kX86Inst
Group
X86Test
,
kX86Inst
EncodingId
X86Test
,
//! Xadd.
kX86Inst
Group
X86Xadd
,
kX86Inst
EncodingId
X86Xadd
,
//! Xchg.
kX86Inst
Group
X86Xchg
,
kX86Inst
EncodingId
X86Xchg
,
//! Fincstp/Finit/FldX/Fnclex/Fninit/Fnop/Fpatan/Fprem/Fprem1/Fptan/Frndint/Fscale/Fsin/Fsincos/Fsqrt/Ftst/Fucompp/Fxam/Fxtract/Fyl2x/Fyl2xp1.
kX86Inst
Group
FpuOp
,
kX86Inst
EncodingId
FpuOp
,
//! Fadd/Fdiv/Fdivr/Fmul/Fsub/Fsubr.
kX86Inst
Group
FpuArith
,
kX86Inst
EncodingId
FpuArith
,
//! Fcom/Fcomp.
kX86Inst
Group
FpuCom
,
kX86Inst
EncodingId
FpuCom
,
//! Fld/Fst/Fstp.
kX86Inst
Group
FpuFldFst
,
kX86Inst
EncodingId
FpuFldFst
,
//! Fiadd/Ficom/Ficomp/Fidiv/Fidivr/Fild/Fimul/Fist/Fistp/Fisttp/Fisub/Fisubr.
kX86Inst
Group
FpuM
,
kX86Inst
EncodingId
FpuM
,
//! Fcmov/Fcomi/Fcomip/Ffree/Fucom/Fucomi/Fucomip/Fucomp/Fxch.
kX86Inst
Group
FpuR
,
kX86Inst
EncodingId
FpuR
,
//! Faddp/Fdivp/Fdivrp/Fmulp/Fsubp/Fsubrp.
kX86Inst
Group
FpuRDef
,
kX86Inst
EncodingId
FpuRDef
,
//! Fnstsw/Fstsw.
kX86Inst
Group
FpuStsw
,
kX86Inst
EncodingId
FpuStsw
,
//! Mm/Xmm instruction.
kX86Inst
Group
ExtRm
,
kX86Inst
EncodingId
ExtRm
,
//! Mm/Xmm instruction (propagates 66H if the instruction uses Xmm register).
kX86Inst
Group
ExtRm_P
,
kX86Inst
EncodingId
ExtRm_P
,
//! Mm/Xmm instruction (propagates REX.W if GPQ is used).
kX86Inst
Group
ExtRm_Q
,
kX86Inst
EncodingId
ExtRm_Q
,
//! Mm/Xmm instruction (propagates 66H and REX.W).
kX86Inst
Group
ExtRm_PQ
,
kX86Inst
EncodingId
ExtRm_PQ
,
//! Mm/Xmm instruction having Rm/Ri encodings.
kX86Inst
Group
ExtRmRi
,
kX86Inst
EncodingId
ExtRmRi
,
//! Mm/Xmm instruction having Rm/Ri encodings (propagates 66H if the instruction uses Xmm register).
kX86Inst
Group
ExtRmRi_P
,
kX86Inst
EncodingId
ExtRmRi_P
,
//! Mm/Xmm instruction having Rmi encoding.
kX86Inst
Group
ExtRmi
,
kX86Inst
EncodingId
ExtRmi
,
//! Mm/Xmm instruction having Rmi encoding (propagates 66H if the instruction uses Xmm register).
kX86Inst
Group
ExtRmi_P
,
kX86Inst
EncodingId
ExtRmi_P
,
//! Crc32.
kX86Inst
Group
ExtCrc
,
kX86Inst
EncodingId
ExtCrc
,
//! Pextrb/Pextrw/Pextrd/Pextrq/Extractps.
kX86Inst
Group
ExtExtract
,
kX86Inst
EncodingId
ExtExtract
,
//! Lfence/Mfence/Sfence.
kX86Inst
Group
ExtFence
,
kX86Inst
EncodingId
ExtFence
,
//! Mov Mm/Xmm.
//!
//! 0x66 prefix must be set manually in opcodes.
//!
//! - Primary opcode is used for instructions in (X)Mm <- (X)Mm/X86Mem format,
//! - Secondary opcode is used for instructions in (X)Mm/X86Mem <- (X)Mm format.
kX86Inst
Group
ExtMov
,
kX86Inst
EncodingId
ExtMov
,
//! Mov Mm/Xmm.
kX86Inst
Group
ExtMovNoRexW
,
kX86Inst
EncodingId
ExtMovNoRexW
,
//! Movbe.
kX86Inst
Group
ExtMovBe
,
kX86Inst
EncodingId
ExtMovBe
,
//! Movd.
kX86Inst
Group
ExtMovD
,
kX86Inst
EncodingId
ExtMovD
,
//! Movq.
kX86Inst
Group
ExtMovQ
,
kX86Inst
EncodingId
ExtMovQ
,
//! Prefetch.
kX86InstGroupExtPrefetch
,
kX86InstEncodingIdExtPrefetch
,
//! Extrq (SSE4a).
kX86InstEncodingIdExtExtrq
,
//! Insrq (SSE4a).
kX86InstEncodingIdExtInsertq
,
//! 3dNow instruction.
kX86Inst
Group
3dNow
,
kX86Inst
EncodingId
3dNow
,
//! AVX instruction without operands.
kX86Inst
Group
AvxOp
,
kX86Inst
EncodingId
AvxOp
,
//! AVX instruction encoded as 'M'.
kX86Inst
Group
AvxM
,
kX86Inst
EncodingId
AvxM
,
//! AVX instruction encoded as 'MR'.
kX86Inst
Group
AvxMr
,
kX86Inst
EncodingId
AvxMr
,
//! AVX instruction encoded as 'MR' (Propagates AVX.L if Ymm used).
kX86Inst
Group
AvxMr_P
,
kX86Inst
EncodingId
AvxMr_P
,
//! AVX instruction encoded as 'MRI'.
kX86Inst
Group
AvxMri
,
kX86Inst
EncodingId
AvxMri
,
//! AVX instruction encoded as 'MRI' (Propagates AVX.L if Ymm used).
kX86Inst
Group
AvxMri_P
,
kX86Inst
EncodingId
AvxMri_P
,
//! AVX instruction encoded as 'RM'.
kX86Inst
Group
AvxRm
,
kX86Inst
EncodingId
AvxRm
,
//! AVX instruction encoded as 'RM' (Propagates AVX.L if Ymm used).
kX86Inst
Group
AvxRm_P
,
kX86Inst
EncodingId
AvxRm_P
,
//! AVX instruction encoded as 'RMI'.
kX86Inst
Group
AvxRmi
,
kX86Inst
EncodingId
AvxRmi
,
//! AVX instruction encoded as 'RMI' (Propagates AVX.L if Ymm used).
kX86Inst
Group
AvxRmi_P
,
kX86Inst
EncodingId
AvxRmi_P
,
//! AVX instruction encoded as 'RVM'.
kX86Inst
Group
AvxRvm
,
kX86Inst
EncodingId
AvxRvm
,
//! AVX instruction encoded as 'RVM' (Propagates AVX.L if Ymm used).
kX86Inst
Group
AvxRvm_P
,
kX86Inst
EncodingId
AvxRvm_P
,
//! AVX instruction encoded as 'RVMR'.
kX86Inst
Group
AvxRvmr
,
kX86Inst
EncodingId
AvxRvmr
,
//! AVX instruction encoded as 'RVMR' (Propagates AVX.L if Ymm used).
kX86Inst
Group
AvxRvmr_P
,
kX86Inst
EncodingId
AvxRvmr_P
,
//! AVX instruction encoded as 'RVMI'.
kX86Inst
Group
AvxRvmi
,
kX86Inst
EncodingId
AvxRvmi
,
//! AVX instruction encoded as 'RVMI' (Propagates AVX.L if Ymm used).
kX86Inst
Group
AvxRvmi_P
,
kX86Inst
EncodingId
AvxRvmi_P
,
//! AVX instruction encoded as 'RMV'.
kX86Inst
Group
AvxRmv
,
kX86Inst
EncodingId
AvxRmv
,
//! AVX instruction encoded as 'RMVI'.
kX86Inst
Group
AvxRmvi
,
kX86Inst
EncodingId
AvxRmvi
,
//! AVX instruction encoded as 'RM' or 'MR'.
kX86Inst
Group
AvxRmMr
,
kX86Inst
EncodingId
AvxRmMr
,
//! AVX instruction encoded as 'RM' or 'MR' (Propagates AVX.L if Ymm used).
kX86Inst
Group
AvxRmMr_P
,
kX86Inst
EncodingId
AvxRmMr_P
,
//! AVX instruction encoded as 'RVM' or 'RMI'.
kX86Inst
Group
AvxRvmRmi
,
kX86Inst
EncodingId
AvxRvmRmi
,
//! AVX instruction encoded as 'RVM' or 'RMI' (Propagates AVX.L if Ymm used).
kX86Inst
Group
AvxRvmRmi_P
,
kX86Inst
EncodingId
AvxRvmRmi_P
,
//! AVX instruction encoded as 'RVM' or 'MR'.
kX86Inst
Group
AvxRvmMr
,
kX86Inst
EncodingId
AvxRvmMr
,
//! AVX instruction encoded as 'RVM' or 'MVR'.
kX86Inst
Group
AvxRvmMvr
,
kX86Inst
EncodingId
AvxRvmMvr
,
//! AVX instruction encoded as 'RVM' or 'MVR' (Propagates AVX.L if Ymm used).
kX86Inst
Group
AvxRvmMvr_P
,
kX86Inst
EncodingId
AvxRvmMvr_P
,
//! AVX instruction encoded as 'RVM' or 'VMI'.
kX86Inst
Group
AvxRvmVmi
,
kX86Inst
EncodingId
AvxRvmVmi
,
//! AVX instruction encoded as 'RVM' or 'VMI' (Propagates AVX.L if Ymm used).
kX86Inst
Group
AvxRvmVmi_P
,
kX86Inst
EncodingId
AvxRvmVmi_P
,
//! AVX instruction encoded as 'VM'.
kX86Inst
Group
AvxVm
,
kX86Inst
EncodingId
AvxVm
,
//! AVX instruction encoded as 'VMI'.
kX86Inst
Group
AvxVmi
,
kX86Inst
EncodingId
AvxVmi
,
//! AVX instruction encoded as 'VMI' (Propagates AVX.L if Ymm used).
kX86Inst
Group
AvxVmi_P
,
kX86Inst
EncodingId
AvxVmi_P
,
//! AVX instruction encoded as 'RVRM' or 'RVMR'.
kX86Inst
Group
AvxRvrmRvmr
,
kX86Inst
EncodingId
AvxRvrmRvmr
,
//! AVX instruction encoded as 'RVRM' or 'RVMR' (Propagates AVX.L if Ymm used).
kX86Inst
Group
AvxRvrmRvmr_P
,
kX86Inst
EncodingId
AvxRvrmRvmr_P
,
//! Vmovss/Vmovsd.
kX86Inst
Group
AvxMovSsSd
,
kX86Inst
EncodingId
AvxMovSsSd
,
//! AVX2 gather family instructions (VSIB).
kX86Inst
Group
AvxGather
,
kX86Inst
EncodingId
AvxGather
,
//! AVX2 gather family instructions (VSIB), differs only in mem operand.
kX86Inst
Group
AvxGatherEx
,
kX86Inst
EncodingId
AvxGatherEx
,
//! FMA4 instruction in form [R, R, R/M, R/M].
kX86Inst
Group
Fma4
,
kX86Inst
EncodingId
Fma4
,
//! FMA4 instruction in form [R, R, R/M, R/M] (Propagates AVX.L if Ymm used).
kX86Inst
Group
Fma4_P
,
kX86Inst
EncodingId
Fma4_P
,
//! XOP instruction encoded as 'RM'.
kX86Inst
Group
XopRm
,
kX86Inst
EncodingId
XopRm
,
//! XOP instruction encoded as 'RM' (Propagates AVX.L if Ymm used).
kX86Inst
Group
XopRm_P
,
kX86Inst
EncodingId
XopRm_P
,
//! XOP instruction encoded as 'RVM' or 'RMV'.
kX86Inst
Group
XopRvmRmv
,
kX86Inst
EncodingId
XopRvmRmv
,
//! XOP instruction encoded as 'RVM' or 'RMI'.
kX86Inst
Group
XopRvmRmi
,
kX86Inst
EncodingId
XopRvmRmi
,
//! XOP instruction encoded as 'RVMR'.
kX86Inst
Group
XopRvmr
,
kX86Inst
EncodingId
XopRvmr
,
//! XOP instruction encoded as 'RVMR' (Propagates AVX.L if Ymm used).
kX86Inst
Group
XopRvmr_P
,
kX86Inst
EncodingId
XopRvmr_P
,
//! XOP instruction encoded as 'RVMI'.
kX86Inst
Group
XopRvmi
,
kX86Inst
EncodingId
XopRvmi
,
//! XOP instruction encoded as 'RVMI' (Propagates AVX.L if Ymm used).
kX86Inst
Group
XopRvmi_P
,
kX86Inst
EncodingId
XopRvmi_P
,
//! XOP instruction encoded as 'RVRM' or 'RVMR'.
kX86Inst
Group
XopRvrmRvmr
,
kX86Inst
EncodingId
XopRvrmRvmr
,
//! XOP instruction encoded as 'RVRM' or 'RVMR' (Propagates AVX.L if Ymm used).
kX86Inst
Group
XopRvrmRvmr_P
,
kX86Inst
EncodingId
XopRvrmRvmr_P
,
//! Count of X86 instruction groups.
_kX86Inst
Group
Count
_kX86Inst
EncodingId
Count
};
// ============================================================================
// [asmjit::
k
X86InstOpCode]
// [asmjit::X86InstOpCode
Flags
]
// ============================================================================
//! \internal
//!
//! Instruction OpCode encoding used by asmjit 'X86InstInfo' table.
//! X86/X64 Instruction opcode encoding used by asmjit 'X86InstInfo' table.
//!
//! This schema is AsmJit specific and has been designed to allow encoding of
//! all X86 instructions available. X86, MMX, and SSE+ instructions always use
//! `MMMMM` and `PP` fields, which are encoded to corresponding prefixes needed
//! by X86 or SIMD instructions. AVX+ instructions embed `MMMMM` and `PP` fields
//! in a VEX prefix.
//!
//! The instruction opcode definition uses 1 or 2 bytes as an opcode value. 1
//! byte is needed by most of the instructions, 2 bytes are only used by legacy
//! X87-FPU instructions. This means that a second byte is free to by used by
//! AVX and AVX-512 instructions.
//!
//! The fields description:
//!
//! - `MMMMM` field is used to encode prefixes needed by the instruction or as
//! a part of VEX/EVEX prefix.
//!
//! The schema was inspired by AVX/AVX2 features.
ASMJIT_ENUM
(
kX86InstOpCode
)
{
// 'MMMMM' field in AVX/XOP instruction.
// 'OpCode' leading bytes in legacy encoding.
kX86InstOpCode_MM_Shift
=
16
,
kX86InstOpCode_MM_Mask
=
0x0FU
<<
kX86InstOpCode_MM_Shift
,
kX86InstOpCode_MM_00
=
0x00U
<<
kX86InstOpCode_MM_Shift
,
kX86InstOpCode_MM_0F
=
0x01U
<<
kX86InstOpCode_MM_Shift
,
kX86InstOpCode_MM_0F38
=
0x02U
<<
kX86InstOpCode_MM_Shift
,
kX86InstOpCode_MM_0F3A
=
0x03U
<<
kX86InstOpCode_MM_Shift
,
kX86InstOpCode_MM_0F01
=
0x0FU
<<
kX86InstOpCode_MM_Shift
,
// Ext/Not part of AVX.
kX86InstOpCode_MM_00011
=
0x03U
<<
kX86InstOpCode_MM_Shift
,
kX86InstOpCode_MM_01000
=
0x08U
<<
kX86InstOpCode_MM_Shift
,
kX86InstOpCode_MM_01001
=
0x09U
<<
kX86InstOpCode_MM_Shift
,
// 'PP' field in AVX/XOP instruction.
// 'Mandatory Prefix' in legacy encoding.
kX86InstOpCode_PP_Shift
=
21
,
kX86InstOpCode_PP_Mask
=
0x07U
<<
kX86InstOpCode_PP_Shift
,
kX86InstOpCode_PP_00
=
0x00U
<<
kX86InstOpCode_PP_Shift
,
kX86InstOpCode_PP_66
=
0x01U
<<
kX86InstOpCode_PP_Shift
,
kX86InstOpCode_PP_F3
=
0x02U
<<
kX86InstOpCode_PP_Shift
,
kX86InstOpCode_PP_F2
=
0x03U
<<
kX86InstOpCode_PP_Shift
,
kX86InstOpCode_PP_9B
=
0x07U
<<
kX86InstOpCode_PP_Shift
,
// Ext/Not part of AVX.
// 'L' field in AVX/XOP instruction.
kX86InstOpCode_L_Shift
=
24
,
kX86InstOpCode_L_Mask
=
0x01U
<<
kX86InstOpCode_L_Shift
,
kX86InstOpCode_L_False
=
0x00U
<<
kX86InstOpCode_L_Shift
,
kX86InstOpCode_L_True
=
0x01U
<<
kX86InstOpCode_L_Shift
,
// 'O' field.
kX86InstOpCode_O_Shift
=
29
,
kX86InstOpCode_O_Mask
=
0x07U
<<
kX86InstOpCode_O_Shift
//! - `PP` field is used to encode prefixes needed by the instruction or as a
//! part of VEX/EVEX prefix.
//!
//! - `L` field is used exclusively by AVX+ and AVX512+ instruction sets. It
//! describes vector size, which is 128-bit for Xmm register `L_128`, 256
//! for Ymm register `L_256` and 512-bit for Zmm register `L_512`. The `L`
//! field is omitted in case that instruction supports multiple vector lengths,
//! however, if the instruction requires specific `L` value it's specified as
//! a part of the opcode.
//!
//! - `W` field is the most complicated. It was added by 64-bit architecture
//! to promote default operation width (instructions that perform 32-bit
//! operation by default require to override the width to 64-bit explicitly).
//! There is nothing wrong on this, however, some instructions introduced
//! implicit `W` override, for example a `cdqe` instruction is basically a
//! `cwde` instructiontion with overridden `W` (set to 1). There are some
//! others in the base X86 instruction set. More recent instruction sets
//! started using `W` field more often:
//!
//! - AVX instructions started using `W` field as an extended opcode for FMA,
//! GATHER, PERM, and other instructions. It also uses `W` field to override
//! the default operation width in instructions like `vmovq`. AVX `W` field
//! is
//!
//! - AVX-512 instructions started using `W` field as an extended opcode for
//! all new instructions. This wouldn't have been an issue if the `W` field
//! of AVX-512 have matched AVX, but this is not the case.
//!
//! - `O` field is an extended opcode field (3) bytes used by ModR/M BYTE.
ASMJIT_ENUM
(
X86InstOpCodeFlags
)
{
// `MMMMM` field in AVX/XOP/AVX-512 instruction (5 bits).
//
// `OpCode` leading bytes in legacy encoding.
//
// AVX reserves 5 bits for `MMMMM` field, however AVX instructions only use
// 2 bits and XOP 4 bits. AVX-512 shrinks `MMMMM` field into `MM` so it's
// safe to assume that `MM` field won't grow in the future as EVEX doesn't
// use more than 2 bits. There is always a way how a fifth bit can be stored
// if needed.
kX86InstOpCode_MM_Shift
=
16
,
kX86InstOpCode_MM_Mask
=
0x0FU
<<
kX86InstOpCode_MM_Shift
,
kX86InstOpCode_MM_00
=
0x00U
<<
kX86InstOpCode_MM_Shift
,
kX86InstOpCode_MM_0F
=
0x01U
<<
kX86InstOpCode_MM_Shift
,
kX86InstOpCode_MM_0F38
=
0x02U
<<
kX86InstOpCode_MM_Shift
,
kX86InstOpCode_MM_0F3A
=
0x03U
<<
kX86InstOpCode_MM_Shift
,
kX86InstOpCode_MM_00011
=
0x03U
<<
kX86InstOpCode_MM_Shift
,
// XOP.
kX86InstOpCode_MM_01000
=
0x08U
<<
kX86InstOpCode_MM_Shift
,
// XOP.
kX86InstOpCode_MM_01001
=
0x09U
<<
kX86InstOpCode_MM_Shift
,
// XOP.
kX86InstOpCode_MM_0F01
=
0x0FU
<<
kX86InstOpCode_MM_Shift
,
// AsmJit specific, not part of AVX.
// `PP` field in AVX/XOP/AVX-512 instruction.
//
// `Mandatory Prefix` in legacy encoding.
//
// AVX reserves 2 bits for `PP` field, but AsmJit extends the storage by 1
// more bit that is used to emit 9B prefix for some X87-FPU instructions.
kX86InstOpCode_PP_Shift
=
20
,
kX86InstOpCode_PP_Mask
=
0x07U
<<
kX86InstOpCode_PP_Shift
,
kX86InstOpCode_PP_00
=
0x00U
<<
kX86InstOpCode_PP_Shift
,
kX86InstOpCode_PP_66
=
0x01U
<<
kX86InstOpCode_PP_Shift
,
kX86InstOpCode_PP_F3
=
0x02U
<<
kX86InstOpCode_PP_Shift
,
kX86InstOpCode_PP_F2
=
0x03U
<<
kX86InstOpCode_PP_Shift
,
kX86InstOpCode_PP_9B
=
0x07U
<<
kX86InstOpCode_PP_Shift
,
// AsmJit specific, not part of AVX.
// `L` field in AVX/XOP/AVX-512 instruction.
//
// AVX/XOP can only use the first bit `L.128` or `L.256`. AVX-512 makes it
// possible to use also `L.512`.
//
// \note If the instruction set manual describes an instruction by using `LIG`
// it means that the `L` field is ignored. AsmJit emits `0` in such case.
kX86InstOpCode_L_Shift
=
23
,
kX86InstOpCode_L_Mask
=
0x03U
<<
kX86InstOpCode_L_Shift
,
kX86InstOpCode_L_128
=
0x00U
<<
kX86InstOpCode_L_Shift
,
kX86InstOpCode_L_256
=
0x01U
<<
kX86InstOpCode_L_Shift
,
kX86InstOpCode_L_512
=
0x02U
<<
kX86InstOpCode_L_Shift
,
// `O` field (ModR/M).
kX86InstOpCode_O_Shift
=
25
,
kX86InstOpCode_O_Mask
=
0x07U
<<
kX86InstOpCode_O_Shift
,
// `W` field used in EVEX instruction encoding.
kX86InstOpCode_EW_Shift
=
30
,
kX86InstOpCode_EW_Mask
=
0x01U
<<
kX86InstOpCode_EW_Shift
,
kX86InstOpCode_EW
=
0x01U
<<
kX86InstOpCode_EW_Shift
,
// `W` field used in REX/VEX instruction encoding.
//
// \note If the instruction set manual describes an instruction by using `WIG`
// it means that the `W` field is ignored. AsmJit emits `0` in such case.
kX86InstOpCode_W_Shift
=
31
,
kX86InstOpCode_W_Mask
=
0x01U
<<
kX86InstOpCode_W_Shift
,
kX86InstOpCode_W
=
0x01U
<<
kX86InstOpCode_W_Shift
,
};
// ============================================================================
// [asmjit::
k
X86InstFlags]
// [asmjit::X86InstFlags]
// ============================================================================
//! \internal
//!
//! X86/X64 instruction
type
flags.
ASMJIT_ENUM
(
k
X86InstFlags
)
{
//! X86/X64 instruction flags.
ASMJIT_ENUM
(
X86InstFlags
)
{
//! No flags.
kX86InstFlagNone
=
0x0000
,
kX86InstFlagNone
=
0x0000
0000
,
//! Instruction is a control-flow instruction.
//!
//! Control flow instructions are jmp, jcc, call and ret.
kX86InstFlagFlow
=
0x0001
,
kX86InstFlagFlow
=
0x000
0000
1
,
//! Instruction is a compare/test like instruction.
kX86InstFlagTest
=
0x0002
,
kX86InstFlagTest
=
0x000
0000
2
,
//! Instruction is a move like instruction.
//!
...
...
@@ -1479,76 +1600,84 @@ ASMJIT_ENUM(kX86InstFlags) {
//! There are some MOV instructions that do only a partial move (for example
//! 'cvtsi2ss'), register allocator has to know the variable size and use
//! the flag accordingly to it.
kX86InstFlagMove
=
0x0004
,
kX86InstFlagMove
=
0x000
0000
4
,
//! Instruction is an exchange like instruction.
//!
//! Exchange instruction typically overwrite first and second operand. So
//! far only the instructions 'xchg' and 'xadd' are considered.
kX86InstFlagXchg
=
0x0008
,
kX86InstFlagXchg
=
0x000
0000
8
,
//! Instruction accesses Fp register(s).
kX86InstFlagFp
=
0x0010
,
kX86InstFlagFp
=
0x00
0000
10
,
//! Instruction can be prefixed by using the LOCK prefix.
kX86InstFlagLock
=
0x0020
,
kX86InstFlagLock
=
0x00
0000
20
,
//! Instruction
i
s special
, this is for `
Compiler
`
.
kX86InstFlagSpecial
=
0x0040
,
//! Instruction
require
s special
handling, used by \ref
Compiler.
kX86InstFlagSpecial
=
0x00
0000
40
,
//! Instruction always performs memory access.
//!
//! This flag is always combined with `kX86InstFlagSpecial` and
signaliz
es
//! This flag is always combined with `kX86InstFlagSpecial` and
describ
es
//! that there is an implicit address which is accessed (usually EDI/RDI or
//! ESI/EDI).
kX86InstFlagSpecialMem
=
0x0080
,
kX86InstFlagSpecialMem
=
0x00
0000
80
,
//! Instruction memory operand can refer to 16-bit address (used by FPU).
kX86InstFlagMem2
=
0x0100
,
kX86InstFlagMem2
=
0x0
0000
100
,
//! Instruction memory operand can refer to 32-bit address (used by FPU).
kX86InstFlagMem4
=
0x0200
,
kX86InstFlagMem4
=
0x0
0000
200
,
//! Instruction memory operand can refer to 64-bit address (used by FPU).
kX86InstFlagMem8
=
0x0400
,
kX86InstFlagMem8
=
0x0
0000
400
,
//! Instruction memory operand can refer to 80-bit address (used by FPU).
kX86InstFlagMem10
=
0x0800
,
//! \internal
//!
//! Combination of `kX86InstFlagMem2` and `kX86InstFlagMem4`.
kX86InstFlagMem2_4
=
kX86InstFlagMem2
|
kX86InstFlagMem4
,
//! \internal
//!
//! Combination of `kX86InstFlagMem2`, `kX86InstFlagMem4` and `kX86InstFlagMem8`.
kX86InstFlagMem2_4_8
=
kX86InstFlagMem2_4
|
kX86InstFlagMem8
,
//! \internal
//!
//! Combination of `kX86InstFlagMem4` and `kX86InstFlagMem8`.
kX86InstFlagMem4_8
=
kX86InstFlagMem4
|
kX86InstFlagMem8
,
//! \internal
//!
//! Combination of `kX86InstFlagMem4`, `kX86InstFlagMem8` and `kX86InstFlagMem10`.
kX86InstFlagMem4_8_10
=
kX86InstFlagMem4_8
|
kX86InstFlagMem10
,
kX86InstFlagMem10
=
0x00000800
,
//! Zeroes the rest of the register if the source operand is memory.
//!
//! Special behavior related to some SIMD load instructions.
kX86InstFlagZ
=
0x1000
,
//! REX.W/VEX.W by default.
kX86InstFlagW
=
0x8000
kX86InstFlagZ
=
0x00001000
,
//! Instruction is supported by AVX.
kX86InstFlagAvx
=
0x00010000
,
//! Instruction is supported by XOP.
kX86InstFlagXop
=
0x00020000
,
//! Instruction is supported by AVX-512 F (Zmm).
kX86InstFlagAvx512F
=
0x00100000
,
//! Instruction is supported by AVX-512 CD (Zmm).
kX86InstFlagAvx512CD
=
0x00200000
,
//! Instruction is supported by AVX-512 PF (Zmm).
kX86InstFlagAvx512PF
=
0x00400000
,
//! Instruction is supported by AVX-512 ER (Zmm).
kX86InstFlagAvx512ER
=
0x00800000
,
//! Instruction is supported by AVX-512 DQ (Zmm).
kX86InstFlagAvx512DQ
=
0x01000000
,
//! Instruction is supported by AVX-512 BW (Zmm).
kX86InstFlagAvx512BW
=
0x02000000
,
//! Instruction is supported by AVX-512 VL (Xmm/Ymm).
kX86InstFlagAvx512VL
=
0x04000000
,
//! Instruction supports masking {k0..k7}.
kX86InstFlagAvx512KMask
=
0x08000000
,
//! Instruction supports zeroing of elements {k0z..k7z}.
kX86InstFlagAvx512KZero
=
0x10000000
,
//! Instruction supports broadcast {1toN}.
kX86InstFlagAvx512Broadcast
=
0x20000000
,
//! Instruction supports suppressing all exceptions {sae}.
kX86InstFlagAvx512Sae
=
0x40000000
,
//! Instruction supports static rounding control with SAE {rnd-sae},
kX86InstFlagAvx512Rnd
=
0x80000000
};
// ============================================================================
// [asmjit::
k
X86InstOp]
// [asmjit::X86InstOp]
// ============================================================================
//! \internal
//!
//! X86/X64 instruction operand flags.
ASMJIT_ENUM
(
k
X86InstOp
)
{
ASMJIT_ENUM
(
X86InstOp
)
{
//! Instruction operand can be 8-bit Gpb register.
kX86InstOpGb
=
0x0001
,
//! Instruction operand can be 16-bit Gpw register.
...
...
@@ -1557,10 +1686,15 @@ ASMJIT_ENUM(kX86InstOp) {
kX86InstOpGd
=
0x0004
,
//! Instruction operand can be 64-bit Gpq register.
kX86InstOpGq
=
0x0008
,
//! Instruction operand can be Fp register.
kX86InstOpFp
=
0x0010
,
//! Instruction operand can be 64-bit Mm
x
register.
//! Instruction operand can be 64-bit Mm register.
kX86InstOpMm
=
0x0020
,
//! Instruction operand can be 64-bit K register.
kX86InstOpK
=
0x0040
,
//! Instruction operand can be 128-bit Xmm register.
kX86InstOpXmm
=
0x0100
,
//! Instruction operand can be 256-bit Ymm register.
...
...
@@ -1569,52 +1703,27 @@ ASMJIT_ENUM(kX86InstOp) {
kX86InstOpZmm
=
0x0400
,
//! Instruction operand can be memory.
kX86InstOpMem
=
0x
2
000
,
kX86InstOpMem
=
0x
1
000
,
//! Instruction operand can be immediate.
kX86InstOpImm
=
0x
4
000
,
kX86InstOpImm
=
0x
2
000
,
//! Instruction operand can be label.
kX86InstOpLabel
=
0x8000
,
//! \internal
//!
//! Combined flags.
kX86InstOpLabel
=
0x4000
,
//! Instruction operand doesn't have to be used.
//!
//! \{
kX86InstOpGwb
=
kX86InstOpGw
|
kX86InstOpGb
,
kX86InstOpGqd
=
kX86InstOpGq
|
kX86InstOpGd
,
kX86InstOpGqdw
=
kX86InstOpGq
|
kX86InstOpGd
|
kX86InstOpGw
,
kX86InstOpGqdwb
=
kX86InstOpGq
|
kX86InstOpGd
|
kX86InstOpGw
|
kX86InstOpGb
,
kX86InstOpGbMem
=
kX86InstOpGb
|
kX86InstOpMem
,
kX86InstOpGwMem
=
kX86InstOpGw
|
kX86InstOpMem
,
kX86InstOpGdMem
=
kX86InstOpGd
|
kX86InstOpMem
,
kX86InstOpGqMem
=
kX86InstOpGq
|
kX86InstOpMem
,
kX86InstOpGwbMem
=
kX86InstOpGwb
|
kX86InstOpMem
,
kX86InstOpGqdMem
=
kX86InstOpGqd
|
kX86InstOpMem
,
kX86InstOpGqdwMem
=
kX86InstOpGqdw
|
kX86InstOpMem
,
kX86InstOpGqdwbMem
=
kX86InstOpGqdwb
|
kX86InstOpMem
,
kX86InstOpFpMem
=
kX86InstOpFp
|
kX86InstOpMem
,
kX86InstOpMmMem
=
kX86InstOpMm
|
kX86InstOpMem
,
kX86InstOpXmmMem
=
kX86InstOpXmm
|
kX86InstOpMem
,
kX86InstOpYmmMem
=
kX86InstOpYmm
|
kX86InstOpMem
,
kX86InstOpMmXmm
=
kX86InstOpMm
|
kX86InstOpXmm
,
kX86InstOpMmXmmMem
=
kX86InstOpMmXmm
|
kX86InstOpMem
,
kX86InstOpXmmYmm
=
kX86InstOpXmm
|
kX86InstOpYmm
,
kX86InstOpXmmYmmMem
=
kX86InstOpXmmYmm
|
kX86InstOpMem
//! \}
//! \note If no operand is specified the meaning is clear (the operand at the
//! particular index doesn't exist), however, when one or more operand is
//! specified, it's not clear whether the operand can be omitted or not. When
//! `kX86InstOpNone` is used it means that the operand is not used in some
//! cases.
kX86InstOpNone
=
0x8000
};
// ============================================================================
// [asmjit::
k
X86Cond]
// [asmjit::X86Cond]
// ============================================================================
//! X86/X64 Condition codes.
ASMJIT_ENUM
(
k
X86Cond
)
{
ASMJIT_ENUM
(
X86Cond
)
{
kX86CondA
=
0x07
,
// CF==0 & ZF==0 (unsigned)
kX86CondAE
=
0x03
,
// CF==0 (unsigned)
kX86CondB
=
0x02
,
// CF==1 (unsigned)
...
...
@@ -1647,28 +1756,31 @@ ASMJIT_ENUM(kX86Cond) {
kX86CondZ
=
0x04
,
// ZF==1
// Simplified condition codes.
kX86CondOverflow
=
0x00
,
kX86CondNotOverflow
=
0x01
,
kX86CondBelow
=
0x02
,
//!< Unsigned comparison.
kX86CondAboveEqual
=
0x03
,
//!< Unsigned comparison.
kX86CondEqual
=
0x04
,
kX86CondNotEqual
=
0x05
,
kX86CondBelowEqual
=
0x06
,
//!< Unsigned comparison.
kX86CondAbove
=
0x07
,
//!< Unsigned comparison.
kX86CondSign
=
0x08
,
kX86CondNotSign
=
0x09
,
kX86CondParityEven
=
0x0A
,
kX86CondParityOdd
=
0x0B
,
kX86CondLess
=
0x0C
,
//!< Signed comparison.
kX86CondGreaterEqual
=
0x0D
,
//!< Signed comparison.
kX86CondLessEqual
=
0x0E
,
//!< Signed comparison.
kX86CondGreater
=
0x0F
,
//!< Signed comparison.
kX86CondSign
=
kX86CondS
,
//!< Sign (S).
kX86CondNotSign
=
kX86CondNS
,
//!< Not Sign (NS).
kX86CondOverflow
=
kX86CondO
,
//!< Signed Overflow (O)
kX86CondNotOverflow
=
kX86CondNO
,
//!< Not Signed Overflow (NO)
kX86CondLess
=
kX86CondL
,
//!< Signed `a < b` (L or NGE).
kX86CondLessEqual
=
kX86CondLE
,
//!< Signed `a <= b` (LE or NG ).
kX86CondGreater
=
kX86CondG
,
//!< Signed `a > b` (G or NLE).
kX86CondGreaterEqual
=
kX86CondGE
,
//!< Signed `a >= b` (GE or NL ).
kX86CondBelow
=
kX86CondB
,
//!< Unsigned `a < b` (B or NAE).
kX86CondBelowEqual
=
kX86CondBE
,
//!< Unsigned `a <= b` (BE or NA ).
kX86CondAbove
=
kX86CondA
,
//!< Unsigned `a > b` (A or NBE).
kX86CondAboveEqual
=
kX86CondAE
,
//!< Unsigned `a >= b` (AE or NB ).
kX86CondEqual
=
kX86CondE
,
//!< Equal `a == b` (E or Z ).
kX86CondNotEqual
=
kX86CondNE
,
//!< Not Equal `a != b` (NE or NZ ).
kX86CondParityEven
=
kX86CondP
,
kX86CondParityOdd
=
kX86CondPO
,
// Aliases.
kX86CondZero
=
0x04
,
kX86CondNotZero
=
0x05
,
kX86CondNegative
=
0x08
,
kX86CondPositive
=
0x09
,
kX86CondZero
=
kX86CondZ
,
kX86CondNotZero
=
kX86CondNZ
,
kX86CondNegative
=
kX86CondS
,
kX86CondPositive
=
kX86CondNS
,
// Fpu-only.
kX86CondFpuUnordered
=
0x10
,
...
...
@@ -1679,24 +1791,24 @@ ASMJIT_ENUM(kX86Cond) {
};
// ============================================================================
// [asmjit::
k
X86EFlags]
// [asmjit::X86EFlags]
// ============================================================================
//! X86/X64 EFLAGs bits (AsmJit specific).
//!
//! Each instruction stored in AsmJit database contains flags that instruction
//! uses (reads) and flags that instruction modifies (writes). This is used by
//! instruction reordering, but can be used by third parties as
the API and
//!
definitions are public
.
//! instruction reordering, but can be used by third parties as
it's part of
//!
AsmJit API
.
//!
//! \note Flags defined here do
es
n't correspond to real flags used by X86/X64
//! architecture defined in Intel's Manual Section `3.4.3 - EFLAGS Register`.
//! \note Flags defined here don't correspond to real flags used by X86/X64
//! architecture
,
defined in Intel's Manual Section `3.4.3 - EFLAGS Register`.
//!
//! \note Flags are designed to fit in 8-bit integer.
ASMJIT_ENUM
(
k
X86EFlags
)
{
//! \note Flags are designed to fit in
an
8-bit integer.
ASMJIT_ENUM
(
X86EFlags
)
{
// --------------------------------------------------------------------------
// src-gendefs.js relies on the values of these masks, t
o modify them th
e
//
tool has to be changed as well
.
// src-gendefs.js relies on the values of these masks, t
he tool has to b
e
//
changed as you plan to modify `X86EFlags`
.
// --------------------------------------------------------------------------
//! Overflow flag (OF).
...
...
@@ -1743,16 +1855,16 @@ ASMJIT_ENUM(kX86EFlags) {
//! `lods` and `stos`.
kX86EFlagD
=
0x40
,
//! Any other flag that AsmJit doesn't use to keep track of
it
.
//! Any other flag that AsmJit doesn't use to keep track of.
kX86EFlagX
=
0x80
};
// ============================================================================
// [asmjit::
k
X86FpSw]
// [asmjit::X86FpSw]
// ============================================================================
//! X86/X64 FPU status
W
ord.
ASMJIT_ENUM
(
k
X86FpSw
)
{
//! X86/X64 FPU status
w
ord.
ASMJIT_ENUM
(
X86FpSw
)
{
kX86FpSw_Invalid
=
0x0001
,
kX86FpSw_Denormalized
=
0x0002
,
kX86FpSw_DivByZero
=
0x0004
,
...
...
@@ -1770,11 +1882,11 @@ ASMJIT_ENUM(kX86FpSw) {
};
// ============================================================================
// [asmjit::
k
X86FpCw]
// [asmjit::X86FpCw]
// ============================================================================
//! X86/X64 FPU control
W
ord.
ASMJIT_ENUM
(
k
X86FpCw
)
{
//! X86/X64 FPU control
w
ord.
ASMJIT_ENUM
(
X86FpCw
)
{
kX86FpCw_EM_Mask
=
0x003F
,
// Bits 0-5.
kX86FpCw_EM_Invalid
=
0x0001
,
kX86FpCw_EM_Denormal
=
0x0002
,
...
...
@@ -1801,13 +1913,72 @@ ASMJIT_ENUM(kX86FpCw) {
};
// ============================================================================
// [asmjit::kX86Prefetch]
// [asmjit::X86Cmp]
// ============================================================================
//! X86/X64 Comparison predicate used by CMP[PD/PS/SD/SS] family instructions.
ASMJIT_ENUM
(
X86Cmp
)
{
kX86CmpEQ
=
0x00
,
//!< Equal (Quite).
kX86CmpLT
=
0x01
,
//!< Less (Signaling).
kX86CmpLE
=
0x02
,
//!< Less/Equal (Signaling).
kX86CmpUNORD
=
0x03
,
//!< Unordered (Quite).
kX86CmpNEQ
=
0x04
,
//!< Not Equal (Quite).
kX86CmpNLT
=
0x05
,
//!< Not Less (Signaling).
kX86CmpNLE
=
0x06
,
//!< Not Less/Equal (Signaling).
kX86CmpORD
=
0x07
//!< Ordered (Quite).
};
// ============================================================================
// [asmjit::X86VCmp]
// ============================================================================
//! X86/X64 Comparison predicate used by VCMP[PD/PS/SD/SS] family instructions.
//!
//! The first 8 are compatible with \ref X86Cmp.
ASMJIT_ENUM
(
X86VCmp
)
{
kX86VCmpEQ_OQ
=
0x00
,
//!< Equal (Quite, Ordered).
kX86VCmpLT_OS
=
0x01
,
//!< Less (Signaling, Ordered).
kX86VCmpLE_OS
=
0x02
,
//!< Less/Equal (Signaling, Ordered).
kX86VCmpUNORD_Q
=
0x03
,
//!< Unordered (Quite).
kX86VCmpNEQ_UQ
=
0x04
,
//!< Not Equal (Quite, Unordered).
kX86VCmpNLT_US
=
0x05
,
//!< Not Less (Signaling, Unordered).
kX86VCmpNLE_US
=
0x06
,
//!< Not Less/Equal (Signaling, Unordered).
kX86VCmpORD_Q
=
0x07
,
//!< Ordered (Quite).
kX86VCmpEQ_UQ
=
0x08
,
//!< Equal (Quite, Unordered).
kX86VCmpNGE_US
=
0x09
,
//!< Not Greater/Equal (Signaling, Unordered).
kX86VCmpNGT_US
=
0x0A
,
//!< Not Greater (Signaling, Unordered).
kX86VCmpFALSE_OQ
=
0x0B
,
//!< False (Quite, Ordered).
kX86VCmpNEQ_OQ
=
0x0C
,
//!< Not Equal (Quite, Ordered).
kX86VCmpGE_OS
=
0x0D
,
//!< Greater/Equal (Signaling, Ordered).
kX86VCmpGT_OS
=
0x0E
,
//!< Greater (Signaling, Ordered).
kX86VCmpTRUE_UQ
=
0x0F
,
//!< True (Quite, Unordered).
kX86VCmpEQ_OS
=
0x10
,
//!< Equal (Signaling, Ordered).
kX86VCmpLT_OQ
=
0x11
,
//!< Less (Quite, Ordered).
kX86VCmpLE_OQ
=
0x12
,
//!< Less/Equal (Quite, Ordered).
kX86VCmpUNORD_S
=
0x13
,
//!< Unordered (Signaling).
kX86VCmpNEQ_US
=
0x14
,
//!< Not Equal (Signaling, Unordered).
kX86VCmpNLT_UQ
=
0x15
,
//!< Not Less (Quite, Unordered).
kX86VCmpNLE_UQ
=
0x16
,
//!< Not Less/Equal (Quite, Unordered).
kX86VCmpORD_S
=
0x17
,
//!< Ordered (Signaling).
kX86VCmpEQ_US
=
0x18
,
//!< Equal (Signaling, Unordered).
kX86VCmpNGE_UQ
=
0x19
,
//!< Not Greater/Equal (Quite, Unordered).
kX86VCmpNGT_UQ
=
0x1A
,
//!< Not Greater (Quite, Unordered).
kX86VCmpFALSE_OS
=
0x1B
,
//!< False (Signaling, Ordered).
kX86VCmpNEQ_OS
=
0x1C
,
//!< Not Equal (Signaling, Ordered).
kX86VCmpGE_OQ
=
0x1D
,
//!< Greater/Equal (Quite, Ordered).
kX86VCmpGT_OQ
=
0x1E
,
//!< Greater (Quite, Ordered).
kX86VCmpTRUE_US
=
0x1F
//!< True (Signaling, Unordered).
};
// ============================================================================
// [asmjit::X86Prefetch]
// ============================================================================
//! X86/X64 Prefetch hints.
ASMJIT_ENUM
(
k
X86Prefetch
)
{
ASMJIT_ENUM
(
X86Prefetch
)
{
//! Prefetch using NT hint.
kX86PrefetchN
ta
=
0
,
kX86PrefetchN
TA
=
0
,
//! Prefetch to L0 cache.
kX86PrefetchT0
=
1
,
//! Prefetch to L1 cache.
...
...
@@ -1828,32 +1999,32 @@ ASMJIT_ENUM(kX86Prefetch) {
//! used by few instructions.
struct
X86InstExtendedInfo
{
// --------------------------------------------------------------------------
// [Accessors - Inst
Group
]
// [Accessors - Inst
ruction Encoding
]
// --------------------------------------------------------------------------
//! Get instruction
group
, see \ref kX86Inst
Group
.
ASMJIT_INLINE
uint32_t
get
InstGroup
()
const
{
return
_
instGroup
;
//! Get instruction
encoding
, see \ref kX86Inst
Encoding
.
ASMJIT_INLINE
uint32_t
get
EncodingId
()
const
{
return
_
encodingId
;
}
// --------------------------------------------------------------------------
// [Accessors - InstFlags]
// [Accessors - Inst
ruction
Flags]
// --------------------------------------------------------------------------
//! Get whether the instruction has
flag
`flag`, see `
k
X86InstFlags`.
//! Get whether the instruction has
a
`flag`, see `X86InstFlags`.
ASMJIT_INLINE
bool
hasInstFlag
(
uint32_t
flag
)
const
{
return
(
_instFlags
&
flag
)
!=
0
;
}
//! Get instruction flags, see `
k
X86InstFlags`.
//! Get
all
instruction flags, see `X86InstFlags`.
ASMJIT_INLINE
uint32_t
getInstFlags
()
const
{
return
_instFlags
;
}
//! Get whether the instruction is a control-flow intruction.
//!
//! Control flow instruction is instruction that
modifies instruction pointer
,
//! typically jmp, jcc, call, or ret.
//! Control flow instruction is instruction that
can perform a branch
,
//! typically
`
jmp
`
,
`
jcc
`
,
`
call
`
, or
`
ret
`
.
ASMJIT_INLINE
bool
isFlow
()
const
{
return
(
getInstFlags
()
&
kX86InstFlagFlow
)
!=
0
;
}
...
...
@@ -1893,14 +2064,13 @@ struct X86InstExtendedInfo {
return
(
getInstFlags
()
&
kX86InstFlagLock
)
!=
0
;
}
//! Get whether the instruction is special type (this is used by
//!
`Compiler`
to manage additional variables or functionality).
//! Get whether the instruction is special type (this is used by
`Compiler`
//! to manage additional variables or functionality).
ASMJIT_INLINE
bool
isSpecial
()
const
{
return
(
getInstFlags
()
&
kX86InstFlagSpecial
)
!=
0
;
}
//! Get whether the instruction is special type and it performs
//! memory access.
//! Get whether the instruction is special type and it performs memory access.
ASMJIT_INLINE
bool
isSpecialMem
()
const
{
return
(
getInstFlags
()
&
kX86InstFlagSpecialMem
)
!=
0
;
}
...
...
@@ -1917,25 +2087,28 @@ struct X86InstExtendedInfo {
// [Accessors - EFlags]
// --------------------------------------------------------------------------
//! Get EFLAGS that the instruction reads.
//! Get EFLAGS that the instruction reads
, see \ref X86EFlags
.
ASMJIT_INLINE
uint32_t
getEFlagsIn
()
const
{
return
_eflagsIn
;
}
//! Get EFLAGS that the instruction writes.
//! Get EFLAGS that the instruction writes
, see \ref X86EFlags
.
ASMJIT_INLINE
uint32_t
getEFlagsOut
()
const
{
return
_eflagsOut
;
}
// --------------------------------------------------------------------------
// [Accessors -
Move-
Size]
// [Accessors -
Write Index/
Size]
// --------------------------------------------------------------------------
//! Get size of move instruction in bytes.
//!
//! See \ref X86InstInfo::getMoveSize() for more details.
ASMJIT_INLINE
uint32_t
getMoveSize
()
const
{
return
_moveSize
;
//! Get the destination index of WRITE operation.
ASMJIT_INLINE
uint32_t
getWriteIndex
()
const
{
return
_writeIndex
;
}
//! Get the number of bytes that will be written by a WRITE operation.
ASMJIT_INLINE
uint32_t
getWriteSize
()
const
{
return
_writeSize
;
}
// --------------------------------------------------------------------------
...
...
@@ -1954,7 +2127,7 @@ struct X86InstExtendedInfo {
// [Accessors - OpCode]
// --------------------------------------------------------------------------
//! Get the secondary instruction opcode, see \ref
k
X86InstOpCode.
//! Get the secondary instruction opcode, see \ref X86InstOpCode
Flags
.
//!
//! See \ref X86InstInfo::getSecondaryOpCode() for more details.
ASMJIT_INLINE
uint32_t
getSecondaryOpCode
()
const
{
...
...
@@ -1965,26 +2138,39 @@ struct X86InstExtendedInfo {
// [Members]
// --------------------------------------------------------------------------
//! Instruction
group
.
uint8_t
_
instGroup
;
//! Instruction
encoding ID
.
uint8_t
_
encodingId
;
//! Count of bytes overwritten by a move instruction.
//! Destination index of WRITE operation, default 0.
uint8_t
_writeIndex
;
//! Count of bytes affected by a write operation, needed by analysis for all
//! instructions that do not read the register overwritten. Only used with
//! `kX86InstFlagMove` flag. If `_writeSize` is zero it is automatically
//! deduced from the size of the destination register.
//!
//! Only used with `kX86InstFlagMove` flag. If this value is zero move depends
//! on size of the destination register.
uint8_t
_moveSize
;
//! In general most of SSE write-only instructions should use 16 bytes as
//! this is the size of the register (and of Ymm/Zmm registers). This means
//! that 16-bytes of the register are changed, the rest remains unchanged.
//! However, AVX instructions should use the size of Zmm register as every
//! AVX instruction zeroes the rest of the register (AVX/AVX2 instructions
//! zero the HI part of Zmm if available).
uint8_t
_writeSize
;
//! EFlags read by the instruction.
uint8_t
_eflagsIn
;
//! EFlags
modified
by the instruction.
//! EFlags
written
by the instruction.
uint8_t
_eflagsOut
;
//!
Instruction flags.
uint
16
_t
_
instFlags
;
//!
\internal
uint
8
_t
_
reserved
;
//! Operands' flags.
//! Operands' flags
, up to 5 operands
.
uint16_t
_opFlags
[
5
];
//! Instruction flags.
uint32_t
_instFlags
;
//! Secondary opcode.
uint32_t
_secondaryOpCode
;
};
...
...
@@ -2026,41 +2212,54 @@ struct X86InstInfo {
}
// --------------------------------------------------------------------------
// [Accessors -
Group
]
// [Accessors -
Instruction Encoding
]
// --------------------------------------------------------------------------
//! Get instruction group, see \ref
k
X86Inst
Group
.
ASMJIT_INLINE
uint32_t
get
InstGroup
()
const
{
return
getExtendedInfo
().
get
InstGroup
();
//! Get instruction group, see \ref X86Inst
EncodingId
.
ASMJIT_INLINE
uint32_t
get
EncodingId
()
const
{
return
getExtendedInfo
().
get
EncodingId
();
}
// --------------------------------------------------------------------------
// [Accessors - Flags]
// [Accessors -
Instruction
Flags]
// --------------------------------------------------------------------------
//! Get instruction flags, see `
k
X86InstFlags`.
//! Get instruction flags, see `X86InstFlags`.
ASMJIT_INLINE
uint32_t
getInstFlags
()
const
{
return
getExtendedInfo
().
getInstFlags
();
}
//! Get whether the instruction has flag `flag`, see `
k
X86InstFlags`.
//! Get whether the instruction has flag `flag`, see `X86InstFlags`.
ASMJIT_INLINE
bool
hasInstFlag
(
uint32_t
flag
)
const
{
return
(
getInstFlags
()
&
flag
)
!=
0
;
}
// --------------------------------------------------------------------------
// [Accessors -
Move-Size
]
// [Accessors -
EFlags
]
// --------------------------------------------------------------------------
//! Get size of move instruction in bytes.
//!
//! If zero, the size of MOV instruction is determined by the size of the
//! destination register (applies mostly for x86 arithmetic). This value is
//! useful for register allocator when determining if a variable is going to
//! be overwritten or not. Basically if the move size is equal or greater
//! than a variable itself it is considered overwritten.
ASMJIT_INLINE
uint32_t
getMoveSize
()
const
{
return
getExtendedInfo
().
getMoveSize
();
//! Get EFLAGS that the instruction reads, see \ref X86EFlags.
ASMJIT_INLINE
uint32_t
getEFlagsIn
()
const
{
return
getExtendedInfo
().
getEFlagsIn
();
}
//! Get EFLAGS that the instruction writes, see \ref X86EFlags.
ASMJIT_INLINE
uint32_t
getEFlagsOut
()
const
{
return
getExtendedInfo
().
getEFlagsOut
();
}
// --------------------------------------------------------------------------
// [Accessors - Write Index/Size]
// --------------------------------------------------------------------------
//! Get the destination index of WRITE operation.
ASMJIT_INLINE
uint32_t
getWriteIndex
()
const
{
return
getExtendedInfo
().
getWriteIndex
();
}
//! Get the number of bytes that will be written by a WRITE operation.
ASMJIT_INLINE
uint32_t
getWriteSize
()
const
{
return
getExtendedInfo
().
getWriteSize
();
}
// --------------------------------------------------------------------------
...
...
@@ -2076,12 +2275,12 @@ struct X86InstInfo {
// [Accessors - OpCode]
// --------------------------------------------------------------------------
//! Get the primary instruction opcode, see \ref
k
X86InstOpCode.
//! Get the primary instruction opcode, see \ref X86InstOpCode
Flags
.
ASMJIT_INLINE
uint32_t
getPrimaryOpCode
()
const
{
return
_primaryOpCode
;
}
//! Get the secondary instruction opcode, see \ref
k
X86InstOpCode.
//! Get the secondary instruction opcode, see \ref X86InstOpCode
Flags
.
ASMJIT_INLINE
uint32_t
getSecondaryOpCode
()
const
{
return
getExtendedInfo
().
getSecondaryOpCode
();
}
...
...
@@ -2141,25 +2340,25 @@ struct X86Util {
//! Get the equivalent of negated condition code.
static
ASMJIT_INLINE
uint32_t
negateCond
(
uint32_t
cond
)
{
ASMJIT_ASSERT
(
cond
<
ASMJIT_ARRAY_SIZE
(
_x86ReverseCond
));
return
static_cast
<
kX86Cond
>
(
cond
^
static_cast
<
uint32_t
>
(
cond
<
kX86CondNone
)
)
;
return
cond
^
static_cast
<
uint32_t
>
(
cond
<
kX86CondNone
);
}
//! Translate condition code `cc` to `cmovcc` instruction code.
//! \sa \ref
k
X86InstId, \ref _kX86InstIdCmovcc.
//! \sa \ref X86InstId, \ref _kX86InstIdCmovcc.
static
ASMJIT_INLINE
uint32_t
condToCmovcc
(
uint32_t
cond
)
{
ASMJIT_ASSERT
(
static_cast
<
uint32_t
>
(
cond
)
<
ASMJIT_ARRAY_SIZE
(
_x86CondToCmovcc
));
return
_x86CondToCmovcc
[
cond
];
}
//! Translate condition code `cc` to `jcc` instruction code.
//! \sa \ref
k
X86InstId, \ref _kX86InstIdJcc.
//! \sa \ref X86InstId, \ref _kX86InstIdJcc.
static
ASMJIT_INLINE
uint32_t
condToJcc
(
uint32_t
cond
)
{
ASMJIT_ASSERT
(
static_cast
<
uint32_t
>
(
cond
)
<
ASMJIT_ARRAY_SIZE
(
_x86CondToJcc
));
return
_x86CondToJcc
[
cond
];
}
//! Translate condition code `cc` to `setcc` instruction code.
//! \sa \ref
k
X86InstId, \ref _kX86InstIdSetcc.
//! \sa \ref X86InstId, \ref _kX86InstIdSetcc.
static
ASMJIT_INLINE
uint32_t
condToSetcc
(
uint32_t
cond
)
{
ASMJIT_ASSERT
(
static_cast
<
uint32_t
>
(
cond
)
<
ASMJIT_ARRAY_SIZE
(
_x86CondToSetcc
));
return
_x86CondToSetcc
[
cond
];
...
...
@@ -2188,11 +2387,11 @@ struct X86Util {
//! \param w Fourth component position, number at interval [0, 3] inclusive.
//!
//! Shuffle constants can be used to make immediate value for these intrinsics:
//! - `X86Assembler::pshufw()` and `X86Compiler::pshufw()`
//! - `X86Assembler::pshufd()` and `X86Compiler::pshufd()`
//! - `X86Assembler::pshufw()`
and `X86Compiler::pshufw()`
//! - `X86Assembler::pshufd()`
and `X86Compiler::pshufd()`
//! - `X86Assembler::pshufhw()` and `X86Compiler::pshufhw()`
//! - `X86Assembler::pshuflw()` and `X86Compiler::pshuflw()`
//! - `X86Assembler::shufps()` and `X86Compiler::shufps()`
//! - `X86Assembler::shufps()`
and `X86Compiler::shufps()`
static
ASMJIT_INLINE
int
mmShuffle
(
uint32_t
z
,
uint32_t
y
,
uint32_t
x
,
uint32_t
w
)
{
return
static_cast
<
int
>
((
z
<<
6
)
|
(
y
<<
4
)
|
(
x
<<
2
)
|
w
);
}
...
...
libraries/asmjit/x86/x86operand.h
View file @
97ce448c
...
...
@@ -23,7 +23,7 @@
//!
//! Internal macro to get an operand ID casting it to `Operand`. Basically
//! allows to get an id of operand that has been just 'typedef'ed.
#define _OP_ID(_Op_) reinterpret_cast<const Operand&>(_Op_).getId()
#define
ASMJIT
_OP_ID(_Op_) reinterpret_cast<const Operand&>(_Op_).getId()
namespace
asmjit
{
...
...
@@ -32,49 +32,70 @@ namespace asmjit {
// ============================================================================
struct
X86Reg
;
struct
X86RipReg
;
struct
X86SegReg
;
struct
X86GpReg
;
struct
X86FpReg
;
struct
X86MmReg
;
struct
X86KReg
;
struct
X86XmmReg
;
struct
X86YmmReg
;
struct
X86
Seg
Reg
;
struct
X86
Zmm
Reg
;
#if !defined(ASMJIT_DISABLE_COMPILER)
struct
X86Var
;
struct
X86GpVar
;
struct
X86MmVar
;
struct
X86KVar
;
struct
X86XmmVar
;
struct
X86YmmVar
;
struct
X86ZmmVar
;
#endif // !ASMJIT_DISABLE_COMPILER
//! \addtogroup asmjit_x86_general
//! \{
// ============================================================================
// [asmjit::
k
X86RegClass]
// [asmjit::X86RegClass]
// ============================================================================
//! X86/X64 variable class.
ASMJIT_ENUM
(
kX86RegClass
)
{
ASMJIT_ENUM
(
X86RegClass
)
{
// --------------------------------------------------------------------------
// [Regs & Vars]
// --------------------------------------------------------------------------
//! X86/X64 Gp register class (compatible with universal \ref kRegClassGp).
kX86RegClassGp
=
kRegClassGp
,
//! X86/X64 Fp register class.
kX86RegClassFp
=
1
,
//! X86/X64 Mm register class.
kX86RegClassMm
=
2
,
kX86RegClassMm
=
1
,
//! X86/X64 K register class.
kX86RegClassK
=
2
,
//! X86/X64 Xmm/Ymm/Zmm register class.
kX86RegClassXyz
=
3
,
//! \internal
//!
//! Last register class that is managed by `X86Compiler`, used by asserts.
_kX86RegClassManagedCount
=
4
,
// --------------------------------------------------------------------------
// [Regs Only]
// --------------------------------------------------------------------------
//! X86/X64 Fp register class.
kX86RegClassFp
=
4
,
//! Count of X86/X64 register classes.
kX86RegClassCount
=
4
kX86RegClassCount
=
5
};
// ============================================================================
// [asmjit::
k
X86RegType]
// [asmjit::X86RegType]
// ============================================================================
//! X86/X64 register type.
ASMJIT_ENUM
(
k
X86RegType
)
{
ASMJIT_ENUM
(
X86RegType
)
{
//! Gpb-lo register (AL, BL, CL, DL, ...).
kX86RegTypeGpbLo
=
0x01
,
//! Gpb-hi register (AH, BH, CH, DH only).
...
...
@@ -89,27 +110,32 @@ ASMJIT_ENUM(kX86RegType) {
kX86RegTypeGpw
=
0x10
,
//! Gpd register.
kX86RegTypeGpd
=
0x20
,
//! Gpq register.
//! Gpq register
(X64)
.
kX86RegTypeGpq
=
0x30
,
//! Fp register.
kX86RegTypeFp
=
0x
5
0
,
//! Mm register.
kX86RegTypeMm
=
0x
6
0
,
kX86RegTypeFp
=
0x
4
0
,
//! Mm register
(MMX+)
.
kX86RegTypeMm
=
0x
5
0
,
//! Xmm register.
//! K register (AVX512+).
kX86RegTypeK
=
0x60
,
//! Xmm register (SSE+).
kX86RegTypeXmm
=
0x70
,
//! Ymm register.
//! Ymm register
(AVX+)
.
kX86RegTypeYmm
=
0x80
,
//! Zmm register.
//! Zmm register
(AVX512+)
.
kX86RegTypeZmm
=
0x90
,
//! Instruction pointer (RIP).
kX86RegTypeRip
=
0xE0
,
//! Segment register.
kX86RegTypeSeg
=
0xF0
};
// ============================================================================
// [asmjit::
k
X86RegIndex]
// [asmjit::X86RegIndex]
// ============================================================================
//! X86/X64 register indexes.
...
...
@@ -117,7 +143,7 @@ ASMJIT_ENUM(kX86RegType) {
//! \note Register indexes have been reduced to only support general purpose
//! registers. There is no need to have enumerations with number suffix that
//! expands to the exactly same value as the suffix value itself.
ASMJIT_ENUM
(
k
X86RegIndex
)
{
ASMJIT_ENUM
(
X86RegIndex
)
{
//! Index of Al/Ah/Ax/Eax/Rax registers.
kX86RegIndexAx
=
0
,
//! Index of Cl/Ch/Cx/Ecx/Rcx registers.
...
...
@@ -153,11 +179,11 @@ ASMJIT_ENUM(kX86RegIndex) {
};
// ============================================================================
// [asmjit::
k
X86Seg]
// [asmjit::X86Seg]
// ============================================================================
//! X86/X64 segment codes.
ASMJIT_ENUM
(
k
X86Seg
)
{
ASMJIT_ENUM
(
X86Seg
)
{
//! No/Default segment.
kX86SegDefault
=
0
,
//! Es segment.
...
...
@@ -184,27 +210,29 @@ ASMJIT_ENUM(kX86Seg) {
};
// ============================================================================
// [asmjit::
k
X86MemVSib]
// [asmjit::X86MemVSib]
// ============================================================================
//! X86/X64 index register legacy and AVX2 (VSIB) support.
ASMJIT_ENUM
(
k
X86MemVSib
)
{
//! Memory operand uses Gp
or no index register.
ASMJIT_ENUM
(
X86MemVSib
)
{
//! Memory operand uses Gp
d/Gpq index (
or no index register
)
.
kX86MemVSibGpz
=
0
,
//! Memory operand uses Xmm or no index register.
//! Memory operand uses Xmm
index (
or no index register
)
.
kX86MemVSibXmm
=
1
,
//! Memory operand uses Ymm or no index register.
kX86MemVSibYmm
=
2
//! Memory operand uses Ymm index (or no index register).
kX86MemVSibYmm
=
2
,
//! Memory operand uses Zmm index (or no index register).
kX86MemVSibZmm
=
3
};
// ============================================================================
// [asmjit::
k
X86MemFlags]
// [asmjit::X86MemFlags]
// ============================================================================
//! \internal
//!
//! X86/X64 specific memory flags.
ASMJIT_ENUM
(
k
X86MemFlags
)
{
ASMJIT_ENUM
(
X86MemFlags
)
{
kX86MemSegBits
=
0x7
,
kX86MemSegIndex
=
0
,
kX86MemSegMask
=
kX86MemSegBits
<<
kX86MemSegIndex
,
...
...
@@ -223,7 +251,21 @@ ASMJIT_ENUM(kX86MemFlags) {
};
// This is only defined by `x86operand_regs.cpp` when exporting registers.
#if !defined(ASMJIT_EXPORTS_X86OPERAND_REGS)
#if defined(ASMJIT_EXPORTS_X86OPERAND_REGS)
// Remap all classes to POD structs so they can be statically initialized
// without calling a constructor. Compiler will store these in .DATA section.
struct
X86RipReg
{
Operand
::
VRegOp
data
;
};
struct
X86SegReg
{
Operand
::
VRegOp
data
;
};
struct
X86GpReg
{
Operand
::
VRegOp
data
;
};
struct
X86FpReg
{
Operand
::
VRegOp
data
;
};
struct
X86KReg
{
Operand
::
VRegOp
data
;
};
struct
X86MmReg
{
Operand
::
VRegOp
data
;
};
struct
X86XmmReg
{
Operand
::
VRegOp
data
;
};
struct
X86YmmReg
{
Operand
::
VRegOp
data
;
};
struct
X86ZmmReg
{
Operand
::
VRegOp
data
;
};
#else
// ============================================================================
// [asmjit::X86RegCount]
...
...
@@ -231,12 +273,29 @@ ASMJIT_ENUM(kX86MemFlags) {
//! \internal
//!
//! X86/X64 registers count (Gp, Fp, Mm, Xmm).
//! X86/X64 registers count (Gp, Mm, K, Xmm/Ymm/Zmm).
//!
//! Since the number of registers changed across CPU generations `X86RegCount`
//! class is used by `X86Assembler` and `X86Compiler` to provide a way to get
//! number of available registers dynamically. 32-bit mode offers always only
//! 8 registers of all classes, however, 64-bit mode offers 16 Gp registers and
//! 16 Xmm/Ymm/Zmm registers. AVX512 instruction set doubles the number of SIMD
//! registers (Xmm/Ymm/Zmm) to 32, this mode has to be explicitly enabled to
//! take effect as it changes some assumptions.
//!
//! `X86RegCount` is also used extensively by `X86Compiler`'s register allocator
//! and data structures. Fp registers were omitted as they are never mapped to
//! variables, thus, not needed to be managed.
//!
//! \note At the moment `X86RegCount` can fit into 32-bits, having 8-bits for
//! all register classes (except Fp). This can change in the future after a
//! new instruction set is announced.
struct
X86RegCount
{
// --------------------------------------------------------------------------
// [Zero]
// --------------------------------------------------------------------------
//! Reset all counters to zero.
ASMJIT_INLINE
void
reset
()
{
_packed
=
0
;
}
...
...
@@ -245,61 +304,87 @@ struct X86RegCount {
// [Get]
// --------------------------------------------------------------------------
ASMJIT_INLINE
uint32_t
get
(
uint32_t
c
)
const
{
ASMJIT_ASSERT
(
c
<
kX86RegClassCount
);
return
_regs
[
c
];
//! Get register count by `classId`.
ASMJIT_INLINE
uint32_t
get
(
uint32_t
classId
)
const
{
ASMJIT_ASSERT
(
classId
<
_kX86RegClassManagedCount
);
return
_regs
[
classId
];
}
//! Get Gp register count.
ASMJIT_INLINE
uint32_t
getGp
()
const
{
return
_regs
[
kX86RegClassGp
];
}
ASMJIT_INLINE
uint32_t
getFp
()
const
{
return
_regs
[
kX86RegClassFp
];
}
//! Get Mm register count.
ASMJIT_INLINE
uint32_t
getMm
()
const
{
return
_regs
[
kX86RegClassMm
];
}
//! Get K register count.
ASMJIT_INLINE
uint32_t
getK
()
const
{
return
_regs
[
kX86RegClassK
];
}
//! Get Xmm/Ymm/Zmm register count.
ASMJIT_INLINE
uint32_t
getXyz
()
const
{
return
_regs
[
kX86RegClassXyz
];
}
// --------------------------------------------------------------------------
// [Set]
// --------------------------------------------------------------------------
ASMJIT_INLINE
void
set
(
uint32_t
c
,
uint32_t
n
)
{
ASMJIT_ASSERT
(
c
<
kX86RegClassCount
);
ASMJIT_ASSERT
(
n
<
0x100
);
//! Set register count by `classId`.
ASMJIT_INLINE
void
set
(
uint32_t
classId
,
uint32_t
n
)
{
ASMJIT_ASSERT
(
classId
<
_kX86RegClassManagedCount
);
ASMJIT_ASSERT
(
n
<=
0xFF
);
_regs
[
c
]
=
static_cast
<
uint8_t
>
(
n
);
_regs
[
c
lassId
]
=
static_cast
<
uint8_t
>
(
n
);
}
//! Set Gp register count.
ASMJIT_INLINE
void
setGp
(
uint32_t
n
)
{
set
(
kX86RegClassGp
,
n
);
}
ASMJIT_INLINE
void
setFp
(
uint32_t
n
)
{
set
(
kX86RegClassFp
,
n
);
}
//! Set Mm register count.
ASMJIT_INLINE
void
setMm
(
uint32_t
n
)
{
set
(
kX86RegClassMm
,
n
);
}
//! Set K register count.
ASMJIT_INLINE
void
setK
(
uint32_t
n
)
{
set
(
kX86RegClassK
,
n
);
}
//! Set Xmm/Ymm/Zmm register count.
ASMJIT_INLINE
void
setXyz
(
uint32_t
n
)
{
set
(
kX86RegClassXyz
,
n
);
}
// --------------------------------------------------------------------------
// [Add]
// --------------------------------------------------------------------------
ASMJIT_INLINE
void
add
(
uint32_t
c
,
uint32_t
n
=
1
)
{
ASMJIT_ASSERT
(
c
<
kX86RegClassCount
);
ASMJIT_ASSERT
(
n
<
0x100
);
//! Add register count by `classId`.
ASMJIT_INLINE
void
add
(
uint32_t
classId
,
uint32_t
n
=
1
)
{
ASMJIT_ASSERT
(
classId
<
_kX86RegClassManagedCount
);
ASMJIT_ASSERT
(
0xFF
-
static_cast
<
uint32_t
>
(
_regs
[
classId
])
>=
n
);
_regs
[
c
]
+=
static_cast
<
uint8_t
>
(
n
);
_regs
[
c
lassId
]
+=
static_cast
<
uint8_t
>
(
n
);
}
//! Add Gp register count.
ASMJIT_INLINE
void
addGp
(
uint32_t
n
)
{
add
(
kX86RegClassGp
,
n
);
}
ASMJIT_INLINE
void
addFp
(
uint32_t
n
)
{
add
(
kX86RegClassFp
,
n
);
}
//! Add Mm register count.
ASMJIT_INLINE
void
addMm
(
uint32_t
n
)
{
add
(
kX86RegClassMm
,
n
);
}
//! Add K register count.
ASMJIT_INLINE
void
addK
(
uint32_t
n
)
{
add
(
kX86RegClassK
,
n
);
}
//! Add Xmm/Ymm/Zmm register count.
ASMJIT_INLINE
void
addXyz
(
uint32_t
n
)
{
add
(
kX86RegClassXyz
,
n
);
}
// --------------------------------------------------------------------------
// [Misc]
// --------------------------------------------------------------------------
ASMJIT_INLINE
void
makeIndex
(
const
X86RegCount
&
count
)
{
uint8_t
a
=
count
.
_regs
[
0
];
uint8_t
b
=
count
.
_regs
[
1
];
uint8_t
c
=
count
.
_regs
[
2
];
//! Build a register indexes, based on register's `count`.
//!
//! Register index is used by \ref `X86Compiler` in per-instruction register
//! data. Indexes are sorted by register class in Gp, Mm, K, and Xmm/Ymm/Zmm
//! order.
ASMJIT_INLINE
void
indexFromRegCount
(
const
X86RegCount
&
count
)
{
uint32_t
x
=
count
.
_regs
[
0
];
uint32_t
y
;
_regs
[
0
]
=
static_cast
<
uint8_t
>
(
0
);
_regs
[
1
]
=
static_cast
<
uint8_t
>
(
x
);
x
=
x
+
count
.
_regs
[
1
];
y
=
x
+
count
.
_regs
[
2
];
_regs
[
0
]
=
0
;
_regs
[
1
]
=
a
;
_regs
[
2
]
=
a
+
b
;
_regs
[
3
]
=
a
+
b
+
c
;
ASMJIT_ASSERT
(
x
<=
0xFF
);
ASMJIT_ASSERT
(
y
<=
0xFF
);
_regs
[
2
]
=
static_cast
<
uint8_t
>
(
x
);
_regs
[
3
]
=
static_cast
<
uint8_t
>
(
y
);
}
// --------------------------------------------------------------------------
...
...
@@ -308,10 +393,16 @@ struct X86RegCount {
union
{
struct
{
//! Count of Gp registers.
uint8_t
_gp
;
uint8_t
_fp
;
//! Count of Mm registers.
uint8_t
_mm
;
uint8_t
_xy
;
//! Count of K registers.
uint8_t
_k
;
//! Count of Xmm/Ymm/Zmm registers.
uint8_t
_xyz
;
//! \internal
uint8_t
_reserved
[
3
];
};
uint8_t
_regs
[
4
];
...
...
@@ -325,12 +416,13 @@ struct X86RegCount {
//! \internal
//!
//! X86/X64 registers mask (Gp,
Fp, Mm
, Xmm/Ymm/Zmm).
//! X86/X64 registers mask (Gp,
Mm, K
, Xmm/Ymm/Zmm).
struct
X86RegMask
{
// --------------------------------------------------------------------------
// [Reset]
// --------------------------------------------------------------------------
//! Reset all register masks to zero.
ASMJIT_INLINE
void
reset
()
{
_packed
.
reset
();
}
...
...
@@ -339,135 +431,189 @@ struct X86RegMask {
// [IsEmpty / Has]
// --------------------------------------------------------------------------
//! Get whether all register masks are zero (empty).
ASMJIT_INLINE
bool
isEmpty
()
const
{
return
_packed
.
isZero
();
}
ASMJIT_INLINE
bool
has
(
uint32_t
c
,
uint32_t
mask
=
0xFFFFFFFF
)
const
{
switch
(
c
)
{
ASMJIT_INLINE
bool
has
(
uint32_t
classId
,
uint32_t
mask
=
0xFFFFFFFF
)
const
{
ASMJIT_ASSERT
(
classId
<
_kX86RegClassManagedCount
);
switch
(
classId
)
{
case
kX86RegClassGp
:
return
(
static_cast
<
uint32_t
>
(
_gp
)
&
mask
)
!=
0
;
case
kX86RegClassFp
:
return
(
static_cast
<
uint32_t
>
(
_fp
)
&
mask
)
!=
0
;
case
kX86RegClassMm
:
return
(
static_cast
<
uint32_t
>
(
_mm
)
&
mask
)
!=
0
;
case
kX86RegClassK
:
return
(
static_cast
<
uint32_t
>
(
_k
)
&
mask
)
!=
0
;
case
kX86RegClassXyz
:
return
(
static_cast
<
uint32_t
>
(
_xyz
)
&
mask
)
!=
0
;
}
ASMJIT_ASSERT
(
!
"Reached"
);
return
false
;
}
// --------------------------------------------------------------------------
// [Zero]
// --------------------------------------------------------------------------
ASMJIT_INLINE
void
zero
(
uint32_t
c
)
{
switch
(
c
)
{
case
kX86RegClassGp
:
_gp
=
0
;
break
;
case
kX86RegClassFp
:
_fp
=
0
;
break
;
case
kX86RegClassMm
:
_mm
=
0
;
break
;
case
kX86RegClassXyz
:
_xyz
=
0
;
break
;
}
}
ASMJIT_INLINE
bool
hasGp
(
uint32_t
mask
=
0xFFFFFFFF
)
const
{
return
has
(
kX86RegClassGp
,
mask
);
}
ASMJIT_INLINE
bool
hasMm
(
uint32_t
mask
=
0xFFFFFFFF
)
const
{
return
has
(
kX86RegClassMm
,
mask
);
}
ASMJIT_INLINE
bool
hasK
(
uint32_t
mask
=
0xFFFFFFFF
)
const
{
return
has
(
kX86RegClassK
,
mask
);
}
ASMJIT_INLINE
bool
hasXyz
(
uint32_t
mask
=
0xFFFFFFFF
)
const
{
return
has
(
kX86RegClassXyz
,
mask
);
}
// --------------------------------------------------------------------------
// [Get]
// --------------------------------------------------------------------------
ASMJIT_INLINE
uint32_t
get
(
uint32_t
c
)
const
{
switch
(
c
)
{
ASMJIT_INLINE
uint32_t
get
(
uint32_t
classId
)
const
{
ASMJIT_ASSERT
(
classId
<
_kX86RegClassManagedCount
);
switch
(
classId
)
{
case
kX86RegClassGp
:
return
_gp
;
case
kX86RegClassFp
:
return
_fp
;
case
kX86RegClassMm
:
return
_mm
;
case
kX86RegClassK
:
return
_k
;
case
kX86RegClassXyz
:
return
_xyz
;
}
ASMJIT_ASSERT
(
!
"Reached"
);
return
0
;
}
ASMJIT_INLINE
uint32_t
getGp
()
const
{
return
get
(
kX86RegClassGp
);
}
ASMJIT_INLINE
uint32_t
getMm
()
const
{
return
get
(
kX86RegClassMm
);
}
ASMJIT_INLINE
uint32_t
getK
()
const
{
return
get
(
kX86RegClassK
);
}
ASMJIT_INLINE
uint32_t
getXyz
()
const
{
return
get
(
kX86RegClassXyz
);
}
// --------------------------------------------------------------------------
// [Zero]
// --------------------------------------------------------------------------
ASMJIT_INLINE
void
zero
(
uint32_t
classId
)
{
ASMJIT_ASSERT
(
classId
<
_kX86RegClassManagedCount
);
switch
(
classId
)
{
case
kX86RegClassGp
:
_gp
=
0
;
break
;
case
kX86RegClassMm
:
_mm
=
0
;
break
;
case
kX86RegClassK
:
_k
=
0
;
break
;
case
kX86RegClassXyz
:
_xyz
=
0
;
break
;
}
}
ASMJIT_INLINE
void
zeroGp
()
{
zero
(
kX86RegClassGp
);
}
ASMJIT_INLINE
void
zeroMm
()
{
zero
(
kX86RegClassMm
);
}
ASMJIT_INLINE
void
zeroK
()
{
zero
(
kX86RegClassK
);
}
ASMJIT_INLINE
void
zeroXyz
()
{
zero
(
kX86RegClassXyz
);
}
// --------------------------------------------------------------------------
// [Set]
// --------------------------------------------------------------------------
ASMJIT_INLINE
void
set
(
uint32_t
c
,
uint32_t
mask
)
{
switch
(
c
)
{
ASMJIT_INLINE
void
set
(
const
X86RegMask
&
other
)
{
_packed
=
other
.
_packed
;
}
ASMJIT_INLINE
void
set
(
uint32_t
classId
,
uint32_t
mask
)
{
ASMJIT_ASSERT
(
classId
<
_kX86RegClassManagedCount
);
switch
(
classId
)
{
case
kX86RegClassGp
:
_gp
=
static_cast
<
uint16_t
>
(
mask
);
break
;
case
kX86RegClassFp
:
_fp
=
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassMm
:
_mm
=
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassK
:
_k
=
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassXyz
:
_xyz
=
static_cast
<
uint32_t
>
(
mask
);
break
;
}
}
ASMJIT_INLINE
void
set
(
const
X86RegMask
&
other
)
{
_packed
.
setUInt64
(
other
.
_packed
);
}
ASMJIT_INLINE
void
setGp
(
uint32_t
mask
)
{
return
set
(
kX86RegClassGp
,
mask
);
}
ASMJIT_INLINE
void
setMm
(
uint32_t
mask
)
{
return
set
(
kX86RegClassMm
,
mask
);
}
ASMJIT_INLINE
void
setK
(
uint32_t
mask
)
{
return
set
(
kX86RegClassK
,
mask
);
}
ASMJIT_INLINE
void
setXyz
(
uint32_t
mask
)
{
return
set
(
kX86RegClassXyz
,
mask
);
}
// --------------------------------------------------------------------------
// [A
d
d]
// [A
n
d]
// --------------------------------------------------------------------------
ASMJIT_INLINE
void
add
(
uint32_t
c
,
uint32_t
mask
)
{
switch
(
c
)
{
case
kX86RegClassGp
:
_gp
|=
static_cast
<
uint16_t
>
(
mask
);
break
;
case
kX86RegClassFp
:
_fp
|=
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassMm
:
_mm
|=
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassXyz
:
_xyz
|=
static_cast
<
uint32_t
>
(
mask
);
break
;
}
ASMJIT_INLINE
void
and_
(
const
X86RegMask
&
other
)
{
_packed
.
and_
(
other
.
_packed
);
}
ASMJIT_INLINE
void
add
(
const
X86RegMask
&
other
)
{
_packed
.
or_
(
other
.
_packed
);
ASMJIT_INLINE
void
and_
(
uint32_t
classId
,
uint32_t
mask
)
{
ASMJIT_ASSERT
(
classId
<
_kX86RegClassManagedCount
);
switch
(
classId
)
{
case
kX86RegClassGp
:
_gp
&=
static_cast
<
uint16_t
>
(
mask
);
break
;
case
kX86RegClassMm
:
_mm
&=
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassK
:
_k
&=
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassXyz
:
_xyz
&=
static_cast
<
uint32_t
>
(
mask
);
break
;
}
}
ASMJIT_INLINE
void
andGp
(
uint32_t
mask
)
{
and_
(
kX86RegClassGp
,
mask
);
}
ASMJIT_INLINE
void
andMm
(
uint32_t
mask
)
{
and_
(
kX86RegClassMm
,
mask
);
}
ASMJIT_INLINE
void
andK
(
uint32_t
mask
)
{
and_
(
kX86RegClassK
,
mask
);
}
ASMJIT_INLINE
void
andXyz
(
uint32_t
mask
)
{
and_
(
kX86RegClassXyz
,
mask
);
}
// --------------------------------------------------------------------------
// [
Del
]
// [
AndNot
]
// --------------------------------------------------------------------------
ASMJIT_INLINE
void
del
(
uint32_t
c
,
uint32_t
mask
)
{
switch
(
c
)
{
ASMJIT_INLINE
void
andNot
(
const
X86RegMask
&
other
)
{
_packed
.
andNot
(
other
.
_packed
);
}
ASMJIT_INLINE
void
andNot
(
uint32_t
classId
,
uint32_t
mask
)
{
ASMJIT_ASSERT
(
classId
<
_kX86RegClassManagedCount
);
switch
(
classId
)
{
case
kX86RegClassGp
:
_gp
&=
~
static_cast
<
uint16_t
>
(
mask
);
break
;
case
kX86RegClassFp
:
_fp
&=
~
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassMm
:
_mm
&=
~
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassK
:
_k
&=
~
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassXyz
:
_xyz
&=
~
static_cast
<
uint32_t
>
(
mask
);
break
;
}
}
ASMJIT_INLINE
void
del
(
const
X86RegMask
&
other
)
{
_packed
.
del
(
other
.
_packed
);
}
ASMJIT_INLINE
void
andNotGp
(
uint32_t
mask
)
{
andNot
(
kX86RegClassGp
,
mask
);
}
ASMJIT_INLINE
void
andNotMm
(
uint32_t
mask
)
{
andNot
(
kX86RegClassMm
,
mask
);
}
ASMJIT_INLINE
void
andNotK
(
uint32_t
mask
)
{
andNot
(
kX86RegClassK
,
mask
);
}
ASMJIT_INLINE
void
andNotXyz
(
uint32_t
mask
)
{
andNot
(
kX86RegClassXyz
,
mask
);
}
// --------------------------------------------------------------------------
// [
And
]
// [
Or
]
// --------------------------------------------------------------------------
ASMJIT_INLINE
void
and_
(
uint32_t
c
,
uint32_t
mask
)
{
switch
(
c
)
{
case
kX86RegClassGp
:
_gp
&=
static_cast
<
uint16_t
>
(
mask
);
break
;
case
kX86RegClassFp
:
_fp
&=
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassMm
:
_mm
&=
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassXyz
:
_xyz
&=
static_cast
<
uint32_t
>
(
mask
);
break
;
}
ASMJIT_INLINE
void
or_
(
const
X86RegMask
&
other
)
{
_packed
.
or_
(
other
.
_packed
);
}
ASMJIT_INLINE
void
and_
(
const
X86RegMask
&
other
)
{
_packed
.
and_
(
other
.
_packed
);
ASMJIT_INLINE
void
or_
(
uint32_t
classId
,
uint32_t
mask
)
{
ASMJIT_ASSERT
(
classId
<
_kX86RegClassManagedCount
);
switch
(
classId
)
{
case
kX86RegClassGp
:
_gp
|=
static_cast
<
uint16_t
>
(
mask
);
break
;
case
kX86RegClassMm
:
_mm
|=
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassK
:
_k
|=
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassXyz
:
_xyz
|=
static_cast
<
uint32_t
>
(
mask
);
break
;
}
}
ASMJIT_INLINE
void
orGp
(
uint32_t
mask
)
{
return
or_
(
kX86RegClassGp
,
mask
);
}
ASMJIT_INLINE
void
orMm
(
uint32_t
mask
)
{
return
or_
(
kX86RegClassMm
,
mask
);
}
ASMJIT_INLINE
void
orK
(
uint32_t
mask
)
{
return
or_
(
kX86RegClassK
,
mask
);
}
ASMJIT_INLINE
void
orXyz
(
uint32_t
mask
)
{
return
or_
(
kX86RegClassXyz
,
mask
);
}
// --------------------------------------------------------------------------
// [Xor]
// --------------------------------------------------------------------------
ASMJIT_INLINE
void
xor_
(
uint32_t
c
,
uint32_t
mask
)
{
switch
(
c
)
{
ASMJIT_INLINE
void
xor_
(
const
X86RegMask
&
other
)
{
_packed
.
xor_
(
other
.
_packed
);
}
ASMJIT_INLINE
void
xor_
(
uint32_t
classId
,
uint32_t
mask
)
{
ASMJIT_ASSERT
(
classId
<
_kX86RegClassManagedCount
);
switch
(
classId
)
{
case
kX86RegClassGp
:
_gp
^=
static_cast
<
uint16_t
>
(
mask
);
break
;
case
kX86RegClassFp
:
_fp
^=
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassMm
:
_mm
^=
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassK
:
_k
^=
static_cast
<
uint8_t
>
(
mask
);
break
;
case
kX86RegClassXyz
:
_xyz
^=
static_cast
<
uint32_t
>
(
mask
);
break
;
}
}
ASMJIT_INLINE
void
xor_
(
const
X86RegMask
&
other
)
{
_packed
.
xor_
(
other
.
_packed
);
}
ASMJIT_INLINE
void
xorGp
(
uint32_t
mask
)
{
xor_
(
kX86RegClassGp
,
mask
);
}
ASMJIT_INLINE
void
xorMm
(
uint32_t
mask
)
{
xor_
(
kX86RegClassMm
,
mask
);
}
ASMJIT_INLINE
void
xorK
(
uint32_t
mask
)
{
xor_
(
kX86RegClassK
,
mask
);
}
ASMJIT_INLINE
void
xorXyz
(
uint32_t
mask
)
{
xor_
(
kX86RegClassXyz
,
mask
);
}
// --------------------------------------------------------------------------
// [Members]
...
...
@@ -475,17 +621,17 @@ struct X86RegMask {
union
{
struct
{
//! Gp mask (16
-
bit).
//! Gp
registers
mask (16
bit
s
).
uint16_t
_gp
;
//! Fp mask (8-bit).
uint8_t
_fp
;
//! Mm mask (8-bit).
//! Mm registers mask (8 bits).
uint8_t
_mm
;
//! Xmm/Ymm/Zmm mask (32-bit).
//! K registers mask (8 bits).
uint8_t
_k
;
//! Xmm/Ymm/Zmm registers mask (32 bits).
uint32_t
_xyz
;
};
//!
All masks as 64-bit integer
.
//!
Packed masks
.
UInt64
_packed
;
};
};
...
...
@@ -494,7 +640,7 @@ struct X86RegMask {
// [asmjit::X86Reg]
// ============================================================================
//!
Base class for all
X86 registers.
//!
X86/
X86 register
base clas
s.
struct
X86Reg
:
public
Reg
{
// --------------------------------------------------------------------------
// [Construction / Destruction]
...
...
@@ -520,7 +666,7 @@ struct X86Reg : public Reg {
//! Get whether the register is Gp register.
ASMJIT_INLINE
bool
isGp
()
const
{
return
_vreg
.
type
<=
kX86RegTypeGpq
;
}
//! Get whether the register is Gp byte (8-bit) register.
ASMJIT_INLINE
bool
isGpb
()
const
{
return
_vreg
.
type
<=
kX86RegTypeGpbHi
;
}
ASMJIT_INLINE
bool
isGpb
()
const
{
return
_vreg
.
type
<=
_
kX86RegType
Patched
GpbHi
;
}
//! Get whether the register is Gp lo-byte (8-bit) register.
ASMJIT_INLINE
bool
isGpbLo
()
const
{
return
_vreg
.
type
==
kX86RegTypeGpbLo
;
}
//! Get whether the register is Gp hi-byte (8-bit) register.
...
...
@@ -536,6 +682,10 @@ struct X86Reg : public Reg {
ASMJIT_INLINE
bool
isFp
()
const
{
return
_vreg
.
type
==
kX86RegTypeFp
;
}
//! Get whether the register is Mm (64-bit) register.
ASMJIT_INLINE
bool
isMm
()
const
{
return
_vreg
.
type
==
kX86RegTypeMm
;
}
//! Get whether the register is K (64-bit) register.
ASMJIT_INLINE
bool
isK
()
const
{
return
_vreg
.
type
==
kX86RegTypeK
;
}
//! Get whether the register is Xmm (128-bit) register.
ASMJIT_INLINE
bool
isXmm
()
const
{
return
_vreg
.
type
==
kX86RegTypeXmm
;
}
//! Get whether the register is Ymm (256-bit) register.
...
...
@@ -543,7 +693,9 @@ struct X86Reg : public Reg {
//! Get whether the register is Zmm (512-bit) register.
ASMJIT_INLINE
bool
isZmm
()
const
{
return
_vreg
.
type
==
kX86RegTypeZmm
;
}
//! Get whether the register is a segment.
//! Get whether the register is RIP.
ASMJIT_INLINE
bool
isRip
()
const
{
return
_vreg
.
type
==
kX86RegTypeRip
;
}
//! Get whether the register is Segment.
ASMJIT_INLINE
bool
isSeg
()
const
{
return
_vreg
.
type
==
kX86RegTypeSeg
;
}
// --------------------------------------------------------------------------
...
...
@@ -559,6 +711,58 @@ struct X86Reg : public Reg {
}
};
// ============================================================================
// [asmjit::X86RipReg]
// ============================================================================
//! X86/X64 RIP register.
struct
X86RipReg
:
public
X86Reg
{
// --------------------------------------------------------------------------
// [Construction / Destruction]
// --------------------------------------------------------------------------
//! Create a RIP register.
ASMJIT_INLINE
X86RipReg
()
:
X86Reg
(
kX86RegTypeRip
,
0
,
0
)
{}
//! Create a reference to `other` RIP register.
ASMJIT_INLINE
X86RipReg
(
const
X86RipReg
&
other
)
:
X86Reg
(
other
)
{}
//! Create non-initialized RIP register.
explicit
ASMJIT_INLINE
X86RipReg
(
const
_NoInit
&
)
:
X86Reg
(
NoInit
)
{}
// --------------------------------------------------------------------------
// [X86RipReg Specific]
// --------------------------------------------------------------------------
ASMJIT_REG_OP
(
X86RipReg
)
};
// ============================================================================
// [asmjit::X86SegReg]
// ============================================================================
//! X86/X64 segment register.
struct
X86SegReg
:
public
X86Reg
{
// --------------------------------------------------------------------------
// [Construction / Destruction]
// --------------------------------------------------------------------------
//! Create a dummy segment register.
ASMJIT_INLINE
X86SegReg
()
:
X86Reg
()
{}
//! Create a reference to `other` segment register.
ASMJIT_INLINE
X86SegReg
(
const
X86SegReg
&
other
)
:
X86Reg
(
other
)
{}
//! Create a reference to `other` segment register and change the index to `index`.
ASMJIT_INLINE
X86SegReg
(
const
X86SegReg
&
other
,
uint32_t
index
)
:
X86Reg
(
other
,
index
)
{}
//! Create a custom segment register.
ASMJIT_INLINE
X86SegReg
(
uint32_t
type
,
uint32_t
index
,
uint32_t
size
)
:
X86Reg
(
type
,
index
,
size
)
{}
//! Create non-initialized segment register.
explicit
ASMJIT_INLINE
X86SegReg
(
const
_NoInit
&
)
:
X86Reg
(
NoInit
)
{}
// --------------------------------------------------------------------------
// [X86SegReg Specific]
// --------------------------------------------------------------------------
ASMJIT_REG_OP
(
X86SegReg
)
};
// ============================================================================
// [asmjit::X86GpReg]
// ============================================================================
...
...
@@ -585,6 +789,24 @@ struct X86GpReg : public X86Reg {
// --------------------------------------------------------------------------
ASMJIT_REG_OP
(
X86GpReg
)
// --------------------------------------------------------------------------
// [X86GpReg Cast]
// --------------------------------------------------------------------------
//! Cast this register to 8-bit (LO) part.
ASMJIT_INLINE
X86GpReg
r8
()
const
{
return
X86GpReg
(
kX86RegTypeGpbLo
,
getRegIndex
(),
1
);
}
//! Cast this register to 8-bit (LO) part.
ASMJIT_INLINE
X86GpReg
r8Lo
()
const
{
return
X86GpReg
(
kX86RegTypeGpbLo
,
getRegIndex
(),
1
);
}
//! Cast this register to 8-bit (HI) part.
ASMJIT_INLINE
X86GpReg
r8Hi
()
const
{
return
X86GpReg
(
kX86RegTypeGpbHi
,
getRegIndex
(),
1
);
}
//! Cast this register to 16-bit.
ASMJIT_INLINE
X86GpReg
r16
()
const
{
return
X86GpReg
(
kX86RegTypeGpw
,
getRegIndex
(),
2
);
}
//! Cast this register to 32-bit.
ASMJIT_INLINE
X86GpReg
r32
()
const
{
return
X86GpReg
(
kX86RegTypeGpd
,
getRegIndex
(),
4
);
}
//! Cast this register to 64-bit.
ASMJIT_INLINE
X86GpReg
r64
()
const
{
return
X86GpReg
(
kX86RegTypeGpq
,
getRegIndex
(),
8
);
}
};
// ============================================================================
...
...
@@ -619,7 +841,32 @@ struct X86FpReg : public X86Reg {
// [asmjit::X86MmReg]
// ============================================================================
//! X86/X64 64-bit Mm register.
//! X86/X64 64-bit Mm register (MMX+).
//!
//! Structure of MMX register and it's memory mapping:
//!
//! ~~~
//! Memory Bytes
//! +--+--+--+--+--+--+--+--+
//! |00|01|02|03|04|05|06|07|
//! +--+--+--+--+--+--+--+--+
//!
//! MMX Register
//! +-----------------------+
//! | QWord |
//! +-----------+-----------+
//! | HI-DWord | LO-DWord |
//! +-----------+-----------+
//! | W3 | W2 | W1 | W0 |
//! +--+--+--+--+--+--+--+--+
//! |07|06|05|04|03|02|01|00|
//! +--+--+--+--+--+--+--+--+
//! ~~~
//!
//! Move instruction semantics:
//!
//! - `movd` - writes 4-bytes in `LO-DWord` and zeroes `HI-DWord`.
//! - `movq` - writes 8-bytes in `QWord`.
struct
X86MmReg
:
public
X86Reg
{
// --------------------------------------------------------------------------
// [Construction / Destruction]
...
...
@@ -643,11 +890,92 @@ struct X86MmReg : public X86Reg {
ASMJIT_REG_OP
(
X86MmReg
)
};
// ============================================================================
// [asmjit::X86KReg]
// ============================================================================
//! X86/X64 64-bit K register (AVX512+).
struct
X86KReg
:
public
X86Reg
{
// --------------------------------------------------------------------------
// [Construction / Destruction]
// --------------------------------------------------------------------------
//! Create a dummy K register.
ASMJIT_INLINE
X86KReg
()
:
X86Reg
()
{}
//! Create a reference to `other` K register.
ASMJIT_INLINE
X86KReg
(
const
X86KReg
&
other
)
:
X86Reg
(
other
)
{}
//! Create a reference to `other` K register and change the index to `index`.
ASMJIT_INLINE
X86KReg
(
const
X86KReg
&
other
,
uint32_t
index
)
:
X86Reg
(
other
,
index
)
{}
//! Create a custom K register.
ASMJIT_INLINE
X86KReg
(
uint32_t
type
,
uint32_t
index
,
uint32_t
size
)
:
X86Reg
(
type
,
index
,
size
)
{}
//! Create non-initialized K register.
explicit
ASMJIT_INLINE
X86KReg
(
const
_NoInit
&
)
:
X86Reg
(
NoInit
)
{}
// --------------------------------------------------------------------------
// [X86KReg Specific]
// --------------------------------------------------------------------------
ASMJIT_REG_OP
(
X86KReg
)
};
// ============================================================================
// [asmjit::X86XmmReg]
// ============================================================================
//! X86/X64 128-bit Xmm register.
//! X86/X64 128-bit Xmm register (SSE+).
//!
//! Structure of XMM register and it's memory mapping:
//!
//! ~~~
//! Memory Bytes
//! +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
//! |00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|
//! +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
//!
//! XMM Register
//! +-----------------------------------------------+
//! | OWord |
//! +-----------------------+-----------------------+
//! | HI-QWord/PD | LO-QWord/SD |
//! +-----------+-----------+-----------+-----------+
//! | D3/PS | D2/PS | D1/PS | D0/SS |
//! +-----------+-----------+-----------+-----------+
//! | W7 | W6 | W5 | W4 | W3 | W2 | W1 | W0 |
//! +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
//! |15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
//! +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
//! ~~~
//!
//! Move instruction semantics:
//!
//! - `movd` - writes 4-bytes in `D0` and zeroes the rest.
//! - `movq` - writes 8-bytes in `Lo-QWord` and zeroes the rest.
//! - `movq2dq` - writes 8 bytes in `Lo-QWord` and zeroes the rest.
//!
//! - `movss` - writes 4-bytes in `D0`
//! (the rest is zeroed only if the source operand is a memory location).
//! - `movsd` - writes 8-bytes in `Lo-QWord`
//! (the rest is zeroed only if the source operand is a memory location).
//!
//! - `movaps`,
//! `movups`,
//! `movapd`,
//! `movupd`,
//! `movdqu`,
//! `movdqa`,
//! `lddqu` - writes 16-bytes in `OWord`.
//!
//! - `movlps`,
//! `movlpd`,
//! `movhlps` - writes 8-bytes in `Lo-QWord` and keeps the rest untouched.
//!
//! - `movhps`,
//! `movhpd`,
//! `movlhps` - writes 8-bytes in `Hi-QWord` and keeps the rest untouched.
//!
//! - `movddup`,
//! - `movsldup`,
//! - `movshdup` - writes 16 bytes in `OWord`.
struct
X86XmmReg
:
public
X86Reg
{
// --------------------------------------------------------------------------
// [Construction / Destruction]
...
...
@@ -669,13 +997,46 @@ struct X86XmmReg : public X86Reg {
// --------------------------------------------------------------------------
ASMJIT_REG_OP
(
X86XmmReg
)
// --------------------------------------------------------------------------
// [X86XmmReg Cast]
// --------------------------------------------------------------------------
//! Cast this register to Xmm (clone).
ASMJIT_INLINE
X86XmmReg
xmm
()
const
{
return
X86XmmReg
(
kX86RegTypeXmm
,
getRegIndex
(),
16
);
}
//! Cast this register to Ymm.
ASMJIT_INLINE
X86YmmReg
ymm
()
const
;
//! Cast this register to Zmm.
ASMJIT_INLINE
X86ZmmReg
zmm
()
const
;
};
// ============================================================================
// [asmjit::X86YmmReg]
// ============================================================================
//! X86/X64 256-bit Ymm register.
//! X86/X64 256-bit Ymm register (AVX+).
//!
//! Structure of YMM register and it's memory mapping:
//!
//! ~~~
//! Memory Bytes
//! +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
//! |00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|
//! +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
//!
//! YMM Register
//! +-----------------------------------------------+-----------------------------------------------+
//! | HI-DQWord | LO-DQWord |
//! +-----------------------+-----------------------+-----------------------+-----------------------+
//! | Q3/PD | Q2/PD | Q1/PD | Q0/SD |
//! +-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+
//! | D7/PS | D6/PS | D5/PS | D4/PS | D3/PS | D2/PS | D1/PS | D0/SS |
//! +-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+
//! | W15 | W14 | W13 | W12 | W11 | W10 | W9 | W8 | W7 | W6 | W5 | W4 | W3 | W2 | W1 | W0 |
//! +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
//! |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
//! +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
//! ~~~
struct
X86YmmReg
:
public
X86Reg
{
// --------------------------------------------------------------------------
// [Construction / Destruction]
...
...
@@ -683,7 +1044,7 @@ struct X86YmmReg : public X86Reg {
//! Create a dummy Ymm register.
ASMJIT_INLINE
X86YmmReg
()
:
X86Reg
()
{}
//! Create a reference to `other`
X
mm register.
//! Create a reference to `other`
Y
mm register.
ASMJIT_INLINE
X86YmmReg
(
const
X86YmmReg
&
other
)
:
X86Reg
(
other
)
{}
//! Create a reference to `other` Ymm register and change the index to `index`.
ASMJIT_INLINE
X86YmmReg
(
const
X86YmmReg
&
other
,
uint32_t
index
)
:
X86Reg
(
other
,
index
)
{}
...
...
@@ -697,36 +1058,63 @@ struct X86YmmReg : public X86Reg {
// --------------------------------------------------------------------------
ASMJIT_REG_OP
(
X86YmmReg
)
// --------------------------------------------------------------------------
// [X86YmmReg Cast]
// --------------------------------------------------------------------------
//! Cast this register to Xmm.
ASMJIT_INLINE
X86XmmReg
xmm
()
const
{
return
X86XmmReg
(
kX86RegTypeXmm
,
getRegIndex
(),
16
);
}
//! Cast this register to Ymm (clone).
ASMJIT_INLINE
X86YmmReg
ymm
()
const
{
return
X86YmmReg
(
kX86RegTypeYmm
,
getRegIndex
(),
32
);
}
//! Cast this register to Zmm.
ASMJIT_INLINE
X86ZmmReg
zmm
()
const
;
};
ASMJIT_INLINE
X86YmmReg
X86XmmReg
::
ymm
()
const
{
return
X86YmmReg
(
kX86RegTypeYmm
,
getRegIndex
(),
32
);
}
// ============================================================================
// [asmjit::X86
Seg
Reg]
// [asmjit::X86
Zmm
Reg]
// ============================================================================
//! X86/X64
segment register
.
struct
X86
Seg
Reg
:
public
X86Reg
{
//! X86/X64
512-bit Zmm register (AVX512+)
.
struct
X86
Zmm
Reg
:
public
X86Reg
{
// --------------------------------------------------------------------------
// [Construction / Destruction]
// --------------------------------------------------------------------------
//! Create a dummy
segment
register.
ASMJIT_INLINE
X86
Seg
Reg
()
:
X86Reg
()
{}
//! Create a reference to `other`
segment
register.
ASMJIT_INLINE
X86
Seg
Reg
(
const
X86
Seg
Reg
&
other
)
:
X86Reg
(
other
)
{}
//! Create a reference to `other`
segment
register and change the index to `index`.
ASMJIT_INLINE
X86
Seg
Reg
(
const
X86
Seg
Reg
&
other
,
uint32_t
index
)
:
X86Reg
(
other
,
index
)
{}
//! Create a custom
segment
register.
ASMJIT_INLINE
X86
Seg
Reg
(
uint32_t
type
,
uint32_t
index
,
uint32_t
size
)
:
X86Reg
(
type
,
index
,
size
)
{}
//! Create non-initialized
segment
register.
explicit
ASMJIT_INLINE
X86
Seg
Reg
(
const
_NoInit
&
)
:
X86Reg
(
NoInit
)
{}
//! Create a dummy
Zmm
register.
ASMJIT_INLINE
X86
Zmm
Reg
()
:
X86Reg
()
{}
//! Create a reference to `other`
Zmm
register.
ASMJIT_INLINE
X86
Zmm
Reg
(
const
X86
Zmm
Reg
&
other
)
:
X86Reg
(
other
)
{}
//! Create a reference to `other`
Zmm
register and change the index to `index`.
ASMJIT_INLINE
X86
Zmm
Reg
(
const
X86
Zmm
Reg
&
other
,
uint32_t
index
)
:
X86Reg
(
other
,
index
)
{}
//! Create a custom
Zmm
register.
ASMJIT_INLINE
X86
Zmm
Reg
(
uint32_t
type
,
uint32_t
index
,
uint32_t
size
)
:
X86Reg
(
type
,
index
,
size
)
{}
//! Create non-initialized
Zmm
register.
explicit
ASMJIT_INLINE
X86
Zmm
Reg
(
const
_NoInit
&
)
:
X86Reg
(
NoInit
)
{}
// --------------------------------------------------------------------------
// [X86
Seg
Reg Specific]
// [X86
Zmm
Reg Specific]
// --------------------------------------------------------------------------
ASMJIT_REG_OP
(
X86SegReg
)
ASMJIT_REG_OP
(
X86ZmmReg
)
// --------------------------------------------------------------------------
// [X86ZmmReg Cast]
// --------------------------------------------------------------------------
//! Cast this register to Xmm.
ASMJIT_INLINE
X86XmmReg
xmm
()
const
{
return
X86XmmReg
(
kX86RegTypeXmm
,
getRegIndex
(),
16
);
}
//! Cast this register to Ymm.
ASMJIT_INLINE
X86YmmReg
ymm
()
const
{
return
X86YmmReg
(
kX86RegTypeYmm
,
getRegIndex
(),
32
);
}
//! Cast this register to Zmm (clone).
ASMJIT_INLINE
X86ZmmReg
zmm
()
const
{
return
X86ZmmReg
(
kX86RegTypeZmm
,
getRegIndex
(),
64
);
}
};
ASMJIT_INLINE
X86ZmmReg
X86XmmReg
::
zmm
()
const
{
return
X86ZmmReg
(
kX86RegTypeZmm
,
getRegIndex
(),
64
);
}
ASMJIT_INLINE
X86ZmmReg
X86YmmReg
::
zmm
()
const
{
return
X86ZmmReg
(
kX86RegTypeZmm
,
getRegIndex
(),
64
);
}
// ============================================================================
// [asmjit::X86Mem]
// ============================================================================
...
...
@@ -807,7 +1195,7 @@ struct X86Mem : public BaseMem {
(
kX86MemVSibGpz
<<
kX86MemVSibIndex
)
+
(
shift
<<
kX86MemShiftIndex
),
label
.
getId
());
_vmem
.
index
=
_OP_ID
(
index
);
_vmem
.
index
=
ASMJIT
_OP_ID
(
index
);
_vmem
.
displacement
=
disp
;
}
...
...
@@ -815,7 +1203,7 @@ struct X86Mem : public BaseMem {
_init_packed_op_sz_b0_b1_id
(
kOperandTypeMem
,
size
,
kMemTypeBaseIndex
,
_getGpdFlags
(
reinterpret_cast
<
const
Var
&>
(
base
))
+
(
kX86MemVSibGpz
<<
kX86MemVSibIndex
),
_OP_ID
(
base
));
ASMJIT
_OP_ID
(
base
));
_init_packed_d2_d3
(
kInvalidValue
,
disp
);
}
...
...
@@ -825,8 +1213,8 @@ struct X86Mem : public BaseMem {
_init_packed_op_sz_b0_b1_id
(
kOperandTypeMem
,
size
,
kMemTypeBaseIndex
,
_getGpdFlags
(
reinterpret_cast
<
const
Var
&>
(
base
))
+
(
shift
<<
kX86MemShiftIndex
),
_OP_ID
(
base
));
_vmem
.
index
=
_OP_ID
(
index
);
ASMJIT
_OP_ID
(
base
));
_vmem
.
index
=
ASMJIT
_OP_ID
(
index
);
_vmem
.
displacement
=
disp
;
}
...
...
@@ -837,8 +1225,8 @@ struct X86Mem : public BaseMem {
_getGpdFlags
(
reinterpret_cast
<
const
Var
&>
(
base
))
+
(
kX86MemVSibXmm
<<
kX86MemVSibIndex
)
+
(
shift
<<
kX86MemShiftIndex
),
_OP_ID
(
base
));
_vmem
.
index
=
_OP_ID
(
index
);
ASMJIT
_OP_ID
(
base
));
_vmem
.
index
=
ASMJIT
_OP_ID
(
index
);
_vmem
.
displacement
=
disp
;
}
...
...
@@ -849,13 +1237,13 @@ struct X86Mem : public BaseMem {
_getGpdFlags
(
reinterpret_cast
<
const
Var
&>
(
base
))
+
(
kX86MemVSibYmm
<<
kX86MemVSibIndex
)
+
(
shift
<<
kX86MemShiftIndex
),
_OP_ID
(
base
));
_vmem
.
index
=
_OP_ID
(
index
);
ASMJIT
_OP_ID
(
base
));
_vmem
.
index
=
ASMJIT
_OP_ID
(
index
);
_vmem
.
displacement
=
disp
;
}
ASMJIT_INLINE
X86Mem
(
const
_Init
&
,
uint32_t
memType
,
const
X86Var
&
base
,
int32_t
disp
,
uint32_t
size
)
:
BaseMem
(
NoInit
)
{
_init_packed_op_sz_b0_b1_id
(
kOperandTypeMem
,
size
,
memType
,
0
,
_OP_ID
(
base
));
_init_packed_op_sz_b0_b1_id
(
kOperandTypeMem
,
size
,
memType
,
0
,
ASMJIT
_OP_ID
(
base
));
_vmem
.
index
=
kInvalidValue
;
_vmem
.
displacement
=
disp
;
}
...
...
@@ -863,8 +1251,8 @@ struct X86Mem : public BaseMem {
ASMJIT_INLINE
X86Mem
(
const
_Init
&
,
uint32_t
memType
,
const
X86Var
&
base
,
const
X86GpVar
&
index
,
uint32_t
shift
,
int32_t
disp
,
uint32_t
size
)
:
BaseMem
(
NoInit
)
{
ASMJIT_ASSERT
(
shift
<=
3
);
_init_packed_op_sz_b0_b1_id
(
kOperandTypeMem
,
size
,
memType
,
shift
<<
kX86MemShiftIndex
,
_OP_ID
(
base
));
_vmem
.
index
=
_OP_ID
(
index
);
_init_packed_op_sz_b0_b1_id
(
kOperandTypeMem
,
size
,
memType
,
shift
<<
kX86MemShiftIndex
,
ASMJIT
_OP_ID
(
base
));
_vmem
.
index
=
ASMJIT
_OP_ID
(
index
);
_vmem
.
displacement
=
disp
;
}
#endif // !ASMJIT_DISABLE_COMPILER
...
...
@@ -903,19 +1291,19 @@ struct X86Mem : public BaseMem {
return
(
_vmem
.
flags
&
kX86MemSegMask
)
!=
(
kX86SegDefault
<<
kX86MemSegIndex
);
}
//! Get memory operand segment, see `
k
X86Seg`.
//! Get memory operand segment, see `X86Seg`.
ASMJIT_INLINE
uint32_t
getSegment
()
const
{
return
(
static_cast
<
uint32_t
>
(
_vmem
.
flags
)
>>
kX86MemSegIndex
)
&
kX86MemSegBits
;
}
//! Set memory operand segment, see `
k
X86Seg`.
//! Set memory operand segment, see `X86Seg`.
ASMJIT_INLINE
X86Mem
&
setSegment
(
uint32_t
segIndex
)
{
_vmem
.
flags
=
static_cast
<
uint8_t
>
(
(
static_cast
<
uint32_t
>
(
_vmem
.
flags
)
&
kX86MemSegMask
)
+
(
segIndex
<<
kX86MemSegIndex
));
return
*
this
;
}
//! Set memory operand segment, see `
k
X86Seg`.
//! Set memory operand segment, see `X86Seg`.
ASMJIT_INLINE
X86Mem
&
setSegment
(
const
X86SegReg
&
seg
)
{
return
setSegment
(
seg
.
getRegIndex
());
}
...
...
@@ -946,12 +1334,12 @@ struct X86Mem : public BaseMem {
// [VSib]
// --------------------------------------------------------------------------
//! Get SIB type.
//! Get
V-
SIB type.
ASMJIT_INLINE
uint32_t
getVSib
()
const
{
return
(
static_cast
<
uint32_t
>
(
_vmem
.
flags
)
>>
kX86MemVSibIndex
)
&
kX86MemVSibBits
;
}
//! Set SIB type.
//! Set
V-
SIB type.
ASMJIT_INLINE
X86Mem
&
_setVSib
(
uint32_t
vsib
)
{
_packed
[
0
].
u32
[
0
]
&=~
IntUtil
::
pack32_4x8
(
0x00
,
0x00
,
0x00
,
kX86MemVSibMask
);
_packed
[
0
].
u32
[
0
]
|=
IntUtil
::
pack32_4x8
(
0x00
,
0x00
,
0x00
,
vsib
<<
kX86MemVSibIndex
);
...
...
@@ -1047,38 +1435,38 @@ struct X86Mem : public BaseMem {
#if !defined(ASMJIT_DISABLE_COMPILER)
//! Set memory index.
ASMJIT_INLINE
X86Mem
&
setIndex
(
const
X86GpVar
&
index
)
{
_vmem
.
index
=
_OP_ID
(
index
);
_vmem
.
index
=
ASMJIT
_OP_ID
(
index
);
return
_setVSib
(
kX86MemVSibGpz
);
}
//! Set memory index.
ASMJIT_INLINE
X86Mem
&
setIndex
(
const
X86GpVar
&
index
,
uint32_t
shift
)
{
_vmem
.
index
=
_OP_ID
(
index
);
_vmem
.
index
=
ASMJIT
_OP_ID
(
index
);
return
_setVSib
(
kX86MemVSibGpz
).
setShift
(
shift
);
}
//! Set memory index.
ASMJIT_INLINE
X86Mem
&
setIndex
(
const
X86XmmVar
&
index
)
{
_vmem
.
index
=
_OP_ID
(
index
);
_vmem
.
index
=
ASMJIT
_OP_ID
(
index
);
return
_setVSib
(
kX86MemVSibXmm
);
}
//! Set memory index.
ASMJIT_INLINE
X86Mem
&
setIndex
(
const
X86XmmVar
&
index
,
uint32_t
shift
)
{
_vmem
.
index
=
_OP_ID
(
index
);
_vmem
.
index
=
ASMJIT
_OP_ID
(
index
);
return
_setVSib
(
kX86MemVSibXmm
).
setShift
(
shift
);
}
//! Set memory index.
ASMJIT_INLINE
X86Mem
&
setIndex
(
const
X86YmmVar
&
index
)
{
_vmem
.
index
=
_OP_ID
(
index
);
_vmem
.
index
=
ASMJIT
_OP_ID
(
index
);
return
_setVSib
(
kX86MemVSibYmm
);
}
//! Set memory index.
ASMJIT_INLINE
X86Mem
&
setIndex
(
const
X86YmmVar
&
index
,
uint32_t
shift
)
{
_vmem
.
index
=
_OP_ID
(
index
);
_vmem
.
index
=
ASMJIT
_OP_ID
(
index
);
return
_setVSib
(
kX86MemVSibYmm
).
setShift
(
shift
);
}
#endif // !ASMJIT_DISABLE_COMPILER
...
...
@@ -1183,7 +1571,35 @@ struct X86Mem : public BaseMem {
return
(
base
.
_vreg
.
size
&
0x4
)
<<
(
kX86MemGpdIndex
-
2
);
}
};
#endif // !ASMJIT_EXPORTS_X86OPERAND_REGS
#endif // ASMJIT_EXPORTS_X86OPERAND_REGS
// ============================================================================
// [asmjit::X86RegData]
// ============================================================================
struct
X86RegData
{
X86RipReg
rip
;
X86GpReg
noGp
;
X86SegReg
seg
[
7
];
X86GpReg
gpbLo
[
16
];
X86GpReg
gpbHi
[
4
];
X86GpReg
gpw
[
16
];
X86GpReg
gpd
[
16
];
X86GpReg
gpq
[
16
];
X86FpReg
fp
[
8
];
X86MmReg
mm
[
8
];
X86KReg
k
[
8
];
X86XmmReg
xmm
[
32
];
X86YmmReg
ymm
[
32
];
X86ZmmReg
zmm
[
32
];
};
ASMJIT_VAR
const
X86RegData
x86RegData
;
// ============================================================================
// [asmjit::x86]
...
...
@@ -1195,140 +1611,218 @@ namespace x86 {
// [asmjit::x86 - Reg]
// ============================================================================
//! No Gp register, can be used only within `X86Mem` operand.
ASMJIT_VAR
const
X86GpReg
noGpReg
;
ASMJIT_VAR
const
X86GpReg
al
;
//!< 8-bit Gpb-lo register.
ASMJIT_VAR
const
X86GpReg
cl
;
//!< 8-bit Gpb-lo register.
ASMJIT_VAR
const
X86GpReg
dl
;
//!< 8-bit Gpb-lo register.
ASMJIT_VAR
const
X86GpReg
bl
;
//!< 8-bit Gpb-lo register.
ASMJIT_VAR
const
X86GpReg
spl
;
//!< 8-bit Gpb-lo register (X64).
ASMJIT_VAR
const
X86GpReg
bpl
;
//!< 8-bit Gpb-lo register (X64).
ASMJIT_VAR
const
X86GpReg
sil
;
//!< 8-bit Gpb-lo register (X64).
ASMJIT_VAR
const
X86GpReg
dil
;
//!< 8-bit Gpb-lo register (X64).
ASMJIT_VAR
const
X86GpReg
r8b
;
//!< 8-bit Gpb-lo register (X64).
ASMJIT_VAR
const
X86GpReg
r9b
;
//!< 8-bit Gpb-lo register (X64).
ASMJIT_VAR
const
X86GpReg
r10b
;
//!< 8-bit Gpb-lo register (X64).
ASMJIT_VAR
const
X86GpReg
r11b
;
//!< 8-bit Gpb-lo register (X64).
ASMJIT_VAR
const
X86GpReg
r12b
;
//!< 8-bit Gpb-lo register (X64).
ASMJIT_VAR
const
X86GpReg
r13b
;
//!< 8-bit Gpb-lo register (X64).
ASMJIT_VAR
const
X86GpReg
r14b
;
//!< 8-bit Gpb-lo register (X64).
ASMJIT_VAR
const
X86GpReg
r15b
;
//!< 8-bit Gpb-lo register (X64).
ASMJIT_VAR
const
X86GpReg
ah
;
//!< 8-bit Gpb-hi register.
ASMJIT_VAR
const
X86GpReg
ch
;
//!< 8-bit Gpb-hi register.
ASMJIT_VAR
const
X86GpReg
dh
;
//!< 8-bit Gpb-hi register.
ASMJIT_VAR
const
X86GpReg
bh
;
//!< 8-bit Gpb-hi register.
ASMJIT_VAR
const
X86GpReg
ax
;
//!< 16-bit Gpw register.
ASMJIT_VAR
const
X86GpReg
cx
;
//!< 16-bit Gpw register.
ASMJIT_VAR
const
X86GpReg
dx
;
//!< 16-bit Gpw register.
ASMJIT_VAR
const
X86GpReg
bx
;
//!< 16-bit Gpw register.
ASMJIT_VAR
const
X86GpReg
sp
;
//!< 16-bit Gpw register.
ASMJIT_VAR
const
X86GpReg
bp
;
//!< 16-bit Gpw register.
ASMJIT_VAR
const
X86GpReg
si
;
//!< 16-bit Gpw register.
ASMJIT_VAR
const
X86GpReg
di
;
//!< 16-bit Gpw register.
ASMJIT_VAR
const
X86GpReg
r8w
;
//!< 16-bit Gpw register (X64).
ASMJIT_VAR
const
X86GpReg
r9w
;
//!< 16-bit Gpw register (X64).
ASMJIT_VAR
const
X86GpReg
r10w
;
//!< 16-bit Gpw register (X64).
ASMJIT_VAR
const
X86GpReg
r11w
;
//!< 16-bit Gpw register (X64).
ASMJIT_VAR
const
X86GpReg
r12w
;
//!< 16-bit Gpw register (X64).
ASMJIT_VAR
const
X86GpReg
r13w
;
//!< 16-bit Gpw register (X64).
ASMJIT_VAR
const
X86GpReg
r14w
;
//!< 16-bit Gpw register (X64).
ASMJIT_VAR
const
X86GpReg
r15w
;
//!< 16-bit Gpw register (X64).
ASMJIT_VAR
const
X86GpReg
eax
;
//!< 32-bit Gpd register.
ASMJIT_VAR
const
X86GpReg
ecx
;
//!< 32-bit Gpd register.
ASMJIT_VAR
const
X86GpReg
edx
;
//!< 32-bit Gpd register.
ASMJIT_VAR
const
X86GpReg
ebx
;
//!< 32-bit Gpd register.
ASMJIT_VAR
const
X86GpReg
esp
;
//!< 32-bit Gpd register.
ASMJIT_VAR
const
X86GpReg
ebp
;
//!< 32-bit Gpd register.
ASMJIT_VAR
const
X86GpReg
esi
;
//!< 32-bit Gpd register.
ASMJIT_VAR
const
X86GpReg
edi
;
//!< 32-bit Gpd register.
ASMJIT_VAR
const
X86GpReg
r8d
;
//!< 32-bit Gpd register (X64).
ASMJIT_VAR
const
X86GpReg
r9d
;
//!< 32-bit Gpd register (X64).
ASMJIT_VAR
const
X86GpReg
r10d
;
//!< 32-bit Gpd register (X64).
ASMJIT_VAR
const
X86GpReg
r11d
;
//!< 32-bit Gpd register (X64).
ASMJIT_VAR
const
X86GpReg
r12d
;
//!< 32-bit Gpd register (X64).
ASMJIT_VAR
const
X86GpReg
r13d
;
//!< 32-bit Gpd register (X64).
ASMJIT_VAR
const
X86GpReg
r14d
;
//!< 32-bit Gpd register (X64).
ASMJIT_VAR
const
X86GpReg
r15d
;
//!< 32-bit Gpd register (X64).
ASMJIT_VAR
const
X86GpReg
rax
;
//!< 64-bit Gpq register (X64).
ASMJIT_VAR
const
X86GpReg
rcx
;
//!< 64-bit Gpq register (X64)
ASMJIT_VAR
const
X86GpReg
rdx
;
//!< 64-bit Gpq register (X64)
ASMJIT_VAR
const
X86GpReg
rbx
;
//!< 64-bit Gpq register (X64)
ASMJIT_VAR
const
X86GpReg
rsp
;
//!< 64-bit Gpq register (X64)
ASMJIT_VAR
const
X86GpReg
rbp
;
//!< 64-bit Gpq register (X64)
ASMJIT_VAR
const
X86GpReg
rsi
;
//!< 64-bit Gpq register (X64)
ASMJIT_VAR
const
X86GpReg
rdi
;
//!< 64-bit Gpq register (X64)
ASMJIT_VAR
const
X86GpReg
r8
;
//!< 64-bit Gpq register (X64)
ASMJIT_VAR
const
X86GpReg
r9
;
//!< 64-bit Gpq register (X64)
ASMJIT_VAR
const
X86GpReg
r10
;
//!< 64-bit Gpq register (X64)
ASMJIT_VAR
const
X86GpReg
r11
;
//!< 64-bit Gpq register (X64)
ASMJIT_VAR
const
X86GpReg
r12
;
//!< 64-bit Gpq register (X64)
ASMJIT_VAR
const
X86GpReg
r13
;
//!< 64-bit Gpq register (X64)
ASMJIT_VAR
const
X86GpReg
r14
;
//!< 64-bit Gpq register (X64)
ASMJIT_VAR
const
X86GpReg
r15
;
//!< 64-bit Gpq register (X64)
ASMJIT_VAR
const
X86FpReg
fp0
;
//!< 80-bit Fp register.
ASMJIT_VAR
const
X86FpReg
fp1
;
//!< 80-bit Fp register.
ASMJIT_VAR
const
X86FpReg
fp2
;
//!< 80-bit Fp register.
ASMJIT_VAR
const
X86FpReg
fp3
;
//!< 80-bit Fp register.
ASMJIT_VAR
const
X86FpReg
fp4
;
//!< 80-bit Fp register.
ASMJIT_VAR
const
X86FpReg
fp5
;
//!< 80-bit Fp register.
ASMJIT_VAR
const
X86FpReg
fp6
;
//!< 80-bit Fp register.
ASMJIT_VAR
const
X86FpReg
fp7
;
//!< 80-bit Fp register.
ASMJIT_VAR
const
X86MmReg
mm0
;
//!< 64-bit Mm register.
ASMJIT_VAR
const
X86MmReg
mm1
;
//!< 64-bit Mm register.
ASMJIT_VAR
const
X86MmReg
mm2
;
//!< 64-bit Mm register.
ASMJIT_VAR
const
X86MmReg
mm3
;
//!< 64-bit Mm register.
ASMJIT_VAR
const
X86MmReg
mm4
;
//!< 64-bit Mm register.
ASMJIT_VAR
const
X86MmReg
mm5
;
//!< 64-bit Mm register.
ASMJIT_VAR
const
X86MmReg
mm6
;
//!< 64-bit Mm register.
ASMJIT_VAR
const
X86MmReg
mm7
;
//!< 64-bit Mm register.
ASMJIT_VAR
const
X86XmmReg
xmm0
;
//!< 128-bit Xmm register.
ASMJIT_VAR
const
X86XmmReg
xmm1
;
//!< 128-bit Xmm register.
ASMJIT_VAR
const
X86XmmReg
xmm2
;
//!< 128-bit Xmm register.
ASMJIT_VAR
const
X86XmmReg
xmm3
;
//!< 128-bit Xmm register.
ASMJIT_VAR
const
X86XmmReg
xmm4
;
//!< 128-bit Xmm register.
ASMJIT_VAR
const
X86XmmReg
xmm5
;
//!< 128-bit Xmm register.
ASMJIT_VAR
const
X86XmmReg
xmm6
;
//!< 128-bit Xmm register.
ASMJIT_VAR
const
X86XmmReg
xmm7
;
//!< 128-bit Xmm register.
ASMJIT_VAR
const
X86XmmReg
xmm8
;
//!< 128-bit Xmm register (X64).
ASMJIT_VAR
const
X86XmmReg
xmm9
;
//!< 128-bit Xmm register (X64).
ASMJIT_VAR
const
X86XmmReg
xmm10
;
//!< 128-bit Xmm register (X64).
ASMJIT_VAR
const
X86XmmReg
xmm11
;
//!< 128-bit Xmm register (X64).
ASMJIT_VAR
const
X86XmmReg
xmm12
;
//!< 128-bit Xmm register (X64).
ASMJIT_VAR
const
X86XmmReg
xmm13
;
//!< 128-bit Xmm register (X64).
ASMJIT_VAR
const
X86XmmReg
xmm14
;
//!< 128-bit Xmm register (X64).
ASMJIT_VAR
const
X86XmmReg
xmm15
;
//!< 128-bit Xmm register (X64).
ASMJIT_VAR
const
X86YmmReg
ymm0
;
//!< 256-bit Ymm register.
ASMJIT_VAR
const
X86YmmReg
ymm1
;
//!< 256-bit Ymm register.
ASMJIT_VAR
const
X86YmmReg
ymm2
;
//!< 256-bit Ymm register.
ASMJIT_VAR
const
X86YmmReg
ymm3
;
//!< 256-bit Ymm register.
ASMJIT_VAR
const
X86YmmReg
ymm4
;
//!< 256-bit Ymm register.
ASMJIT_VAR
const
X86YmmReg
ymm5
;
//!< 256-bit Ymm register.
ASMJIT_VAR
const
X86YmmReg
ymm6
;
//!< 256-bit Ymm register.
ASMJIT_VAR
const
X86YmmReg
ymm7
;
//!< 256-bit Ymm register.
ASMJIT_VAR
const
X86YmmReg
ymm8
;
//!< 256-bit Ymm register (X64).
ASMJIT_VAR
const
X86YmmReg
ymm9
;
//!< 256-bit Ymm register (X64).
ASMJIT_VAR
const
X86YmmReg
ymm10
;
//!< 256-bit Ymm register (X64).
ASMJIT_VAR
const
X86YmmReg
ymm11
;
//!< 256-bit Ymm register (X64).
ASMJIT_VAR
const
X86YmmReg
ymm12
;
//!< 256-bit Ymm register (X64).
ASMJIT_VAR
const
X86YmmReg
ymm13
;
//!< 256-bit Ymm register (X64).
ASMJIT_VAR
const
X86YmmReg
ymm14
;
//!< 256-bit Ymm register (X64).
ASMJIT_VAR
const
X86YmmReg
ymm15
;
//!< 256-bit Ymm register (X64).
ASMJIT_VAR
const
X86SegReg
cs
;
//!< Cs segment register.
ASMJIT_VAR
const
X86SegReg
ss
;
//!< Ss segment register.
ASMJIT_VAR
const
X86SegReg
ds
;
//!< Ds segment register.
ASMJIT_VAR
const
X86SegReg
es
;
//!< Es segment register.
ASMJIT_VAR
const
X86SegReg
fs
;
//!< Fs segment register.
ASMJIT_VAR
const
X86SegReg
gs
;
//!< Gs segment register.
#define ASMJIT_DEF_REG(_Type_, _Name_, _Field_) \
static const _Type_& _Name_ = x86RegData._Field_
ASMJIT_DEF_REG
(
X86RipReg
,
rip
,
rip
);
//!< RIP register.
ASMJIT_DEF_REG
(
X86GpReg
,
noGpReg
,
noGp
);
//!< No GP register (for `X86Mem` operand.).
ASMJIT_DEF_REG
(
X86SegReg
,
es
,
seg
[
1
]);
//!< Cs segment register.
ASMJIT_DEF_REG
(
X86SegReg
,
cs
,
seg
[
2
]);
//!< Ss segment register.
ASMJIT_DEF_REG
(
X86SegReg
,
ss
,
seg
[
3
]);
//!< Ds segment register.
ASMJIT_DEF_REG
(
X86SegReg
,
ds
,
seg
[
4
]);
//!< Es segment register.
ASMJIT_DEF_REG
(
X86SegReg
,
fs
,
seg
[
5
]);
//!< Fs segment register.
ASMJIT_DEF_REG
(
X86SegReg
,
gs
,
seg
[
6
]);
//!< Gs segment register.
ASMJIT_DEF_REG
(
X86GpReg
,
al
,
gpbLo
[
0
]);
//!< 8-bit Gpb-lo register.
ASMJIT_DEF_REG
(
X86GpReg
,
cl
,
gpbLo
[
1
]);
//!< 8-bit Gpb-lo register.
ASMJIT_DEF_REG
(
X86GpReg
,
dl
,
gpbLo
[
2
]);
//!< 8-bit Gpb-lo register.
ASMJIT_DEF_REG
(
X86GpReg
,
bl
,
gpbLo
[
3
]);
//!< 8-bit Gpb-lo register.
ASMJIT_DEF_REG
(
X86GpReg
,
spl
,
gpbLo
[
4
]);
//!< 8-bit Gpb-lo register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
bpl
,
gpbLo
[
5
]);
//!< 8-bit Gpb-lo register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
sil
,
gpbLo
[
6
]);
//!< 8-bit Gpb-lo register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
dil
,
gpbLo
[
7
]);
//!< 8-bit Gpb-lo register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r8b
,
gpbLo
[
8
]);
//!< 8-bit Gpb-lo register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r9b
,
gpbLo
[
9
]);
//!< 8-bit Gpb-lo register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r10b
,
gpbLo
[
10
]);
//!< 8-bit Gpb-lo register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r11b
,
gpbLo
[
11
]);
//!< 8-bit Gpb-lo register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r12b
,
gpbLo
[
12
]);
//!< 8-bit Gpb-lo register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r13b
,
gpbLo
[
13
]);
//!< 8-bit Gpb-lo register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r14b
,
gpbLo
[
14
]);
//!< 8-bit Gpb-lo register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r15b
,
gpbLo
[
15
]);
//!< 8-bit Gpb-lo register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
ah
,
gpbHi
[
0
]);
//!< 8-bit Gpb-hi register.
ASMJIT_DEF_REG
(
X86GpReg
,
ch
,
gpbHi
[
1
]);
//!< 8-bit Gpb-hi register.
ASMJIT_DEF_REG
(
X86GpReg
,
dh
,
gpbHi
[
2
]);
//!< 8-bit Gpb-hi register.
ASMJIT_DEF_REG
(
X86GpReg
,
bh
,
gpbHi
[
3
]);
//!< 8-bit Gpb-hi register.
ASMJIT_DEF_REG
(
X86GpReg
,
ax
,
gpw
[
0
]);
//!< 16-bit Gpw register.
ASMJIT_DEF_REG
(
X86GpReg
,
cx
,
gpw
[
1
]);
//!< 16-bit Gpw register.
ASMJIT_DEF_REG
(
X86GpReg
,
dx
,
gpw
[
2
]);
//!< 16-bit Gpw register.
ASMJIT_DEF_REG
(
X86GpReg
,
bx
,
gpw
[
3
]);
//!< 16-bit Gpw register.
ASMJIT_DEF_REG
(
X86GpReg
,
sp
,
gpw
[
4
]);
//!< 16-bit Gpw register.
ASMJIT_DEF_REG
(
X86GpReg
,
bp
,
gpw
[
5
]);
//!< 16-bit Gpw register.
ASMJIT_DEF_REG
(
X86GpReg
,
si
,
gpw
[
6
]);
//!< 16-bit Gpw register.
ASMJIT_DEF_REG
(
X86GpReg
,
di
,
gpw
[
7
]);
//!< 16-bit Gpw register.
ASMJIT_DEF_REG
(
X86GpReg
,
r8w
,
gpw
[
8
]);
//!< 16-bit Gpw register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r9w
,
gpw
[
9
]);
//!< 16-bit Gpw register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r10w
,
gpw
[
10
]);
//!< 16-bit Gpw register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r11w
,
gpw
[
11
]);
//!< 16-bit Gpw register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r12w
,
gpw
[
12
]);
//!< 16-bit Gpw register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r13w
,
gpw
[
13
]);
//!< 16-bit Gpw register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r14w
,
gpw
[
14
]);
//!< 16-bit Gpw register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r15w
,
gpw
[
15
]);
//!< 16-bit Gpw register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
eax
,
gpd
[
0
]);
//!< 32-bit Gpd register.
ASMJIT_DEF_REG
(
X86GpReg
,
ecx
,
gpd
[
1
]);
//!< 32-bit Gpd register.
ASMJIT_DEF_REG
(
X86GpReg
,
edx
,
gpd
[
2
]);
//!< 32-bit Gpd register.
ASMJIT_DEF_REG
(
X86GpReg
,
ebx
,
gpd
[
3
]);
//!< 32-bit Gpd register.
ASMJIT_DEF_REG
(
X86GpReg
,
esp
,
gpd
[
4
]);
//!< 32-bit Gpd register.
ASMJIT_DEF_REG
(
X86GpReg
,
ebp
,
gpd
[
5
]);
//!< 32-bit Gpd register.
ASMJIT_DEF_REG
(
X86GpReg
,
esi
,
gpd
[
6
]);
//!< 32-bit Gpd register.
ASMJIT_DEF_REG
(
X86GpReg
,
edi
,
gpd
[
7
]);
//!< 32-bit Gpd register.
ASMJIT_DEF_REG
(
X86GpReg
,
r8d
,
gpd
[
8
]);
//!< 32-bit Gpd register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r9d
,
gpd
[
9
]);
//!< 32-bit Gpd register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r10d
,
gpd
[
10
]);
//!< 32-bit Gpd register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r11d
,
gpd
[
11
]);
//!< 32-bit Gpd register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r12d
,
gpd
[
12
]);
//!< 32-bit Gpd register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r13d
,
gpd
[
13
]);
//!< 32-bit Gpd register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r14d
,
gpd
[
14
]);
//!< 32-bit Gpd register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
r15d
,
gpd
[
15
]);
//!< 32-bit Gpd register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
rax
,
gpq
[
0
]);
//!< 64-bit Gpq register (X64).
ASMJIT_DEF_REG
(
X86GpReg
,
rcx
,
gpq
[
1
]);
//!< 64-bit Gpq register (X64)
ASMJIT_DEF_REG
(
X86GpReg
,
rdx
,
gpq
[
2
]);
//!< 64-bit Gpq register (X64)
ASMJIT_DEF_REG
(
X86GpReg
,
rbx
,
gpq
[
3
]);
//!< 64-bit Gpq register (X64)
ASMJIT_DEF_REG
(
X86GpReg
,
rsp
,
gpq
[
4
]);
//!< 64-bit Gpq register (X64)
ASMJIT_DEF_REG
(
X86GpReg
,
rbp
,
gpq
[
5
]);
//!< 64-bit Gpq register (X64)
ASMJIT_DEF_REG
(
X86GpReg
,
rsi
,
gpq
[
6
]);
//!< 64-bit Gpq register (X64)
ASMJIT_DEF_REG
(
X86GpReg
,
rdi
,
gpq
[
7
]);
//!< 64-bit Gpq register (X64)
ASMJIT_DEF_REG
(
X86GpReg
,
r8
,
gpq
[
8
]);
//!< 64-bit Gpq register (X64)
ASMJIT_DEF_REG
(
X86GpReg
,
r9
,
gpq
[
9
]);
//!< 64-bit Gpq register (X64)
ASMJIT_DEF_REG
(
X86GpReg
,
r10
,
gpq
[
10
]);
//!< 64-bit Gpq register (X64)
ASMJIT_DEF_REG
(
X86GpReg
,
r11
,
gpq
[
11
]);
//!< 64-bit Gpq register (X64)
ASMJIT_DEF_REG
(
X86GpReg
,
r12
,
gpq
[
12
]);
//!< 64-bit Gpq register (X64)
ASMJIT_DEF_REG
(
X86GpReg
,
r13
,
gpq
[
13
]);
//!< 64-bit Gpq register (X64)
ASMJIT_DEF_REG
(
X86GpReg
,
r14
,
gpq
[
14
]);
//!< 64-bit Gpq register (X64)
ASMJIT_DEF_REG
(
X86GpReg
,
r15
,
gpq
[
15
]);
//!< 64-bit Gpq register (X64)
ASMJIT_DEF_REG
(
X86FpReg
,
fp0
,
fp
[
0
]);
//!< 80-bit Fp register.
ASMJIT_DEF_REG
(
X86FpReg
,
fp1
,
fp
[
1
]);
//!< 80-bit Fp register.
ASMJIT_DEF_REG
(
X86FpReg
,
fp2
,
fp
[
2
]);
//!< 80-bit Fp register.
ASMJIT_DEF_REG
(
X86FpReg
,
fp3
,
fp
[
3
]);
//!< 80-bit Fp register.
ASMJIT_DEF_REG
(
X86FpReg
,
fp4
,
fp
[
4
]);
//!< 80-bit Fp register.
ASMJIT_DEF_REG
(
X86FpReg
,
fp5
,
fp
[
5
]);
//!< 80-bit Fp register.
ASMJIT_DEF_REG
(
X86FpReg
,
fp6
,
fp
[
6
]);
//!< 80-bit Fp register.
ASMJIT_DEF_REG
(
X86FpReg
,
fp7
,
fp
[
7
]);
//!< 80-bit Fp register.
ASMJIT_DEF_REG
(
X86MmReg
,
mm0
,
mm
[
0
]);
//!< 64-bit Mm register.
ASMJIT_DEF_REG
(
X86MmReg
,
mm1
,
mm
[
1
]);
//!< 64-bit Mm register.
ASMJIT_DEF_REG
(
X86MmReg
,
mm2
,
mm
[
2
]);
//!< 64-bit Mm register.
ASMJIT_DEF_REG
(
X86MmReg
,
mm3
,
mm
[
3
]);
//!< 64-bit Mm register.
ASMJIT_DEF_REG
(
X86MmReg
,
mm4
,
mm
[
4
]);
//!< 64-bit Mm register.
ASMJIT_DEF_REG
(
X86MmReg
,
mm5
,
mm
[
5
]);
//!< 64-bit Mm register.
ASMJIT_DEF_REG
(
X86MmReg
,
mm6
,
mm
[
6
]);
//!< 64-bit Mm register.
ASMJIT_DEF_REG
(
X86MmReg
,
mm7
,
mm
[
7
]);
//!< 64-bit Mm register.
ASMJIT_DEF_REG
(
X86KReg
,
k0
,
k
[
0
]);
//!< 64-bit K register.
ASMJIT_DEF_REG
(
X86KReg
,
k1
,
k
[
1
]);
//!< 64-bit K register.
ASMJIT_DEF_REG
(
X86KReg
,
k2
,
k
[
2
]);
//!< 64-bit K register.
ASMJIT_DEF_REG
(
X86KReg
,
k3
,
k
[
3
]);
//!< 64-bit K register.
ASMJIT_DEF_REG
(
X86KReg
,
k4
,
k
[
4
]);
//!< 64-bit K register.
ASMJIT_DEF_REG
(
X86KReg
,
k5
,
k
[
5
]);
//!< 64-bit K register.
ASMJIT_DEF_REG
(
X86KReg
,
k6
,
k
[
6
]);
//!< 64-bit K register.
ASMJIT_DEF_REG
(
X86KReg
,
k7
,
k
[
7
]);
//!< 64-bit K register.
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm0
,
xmm
[
0
]);
//!< 128-bit Xmm register.
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm1
,
xmm
[
1
]);
//!< 128-bit Xmm register.
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm2
,
xmm
[
2
]);
//!< 128-bit Xmm register.
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm3
,
xmm
[
3
]);
//!< 128-bit Xmm register.
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm4
,
xmm
[
4
]);
//!< 128-bit Xmm register.
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm5
,
xmm
[
5
]);
//!< 128-bit Xmm register.
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm6
,
xmm
[
6
]);
//!< 128-bit Xmm register.
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm7
,
xmm
[
7
]);
//!< 128-bit Xmm register.
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm8
,
xmm
[
8
]);
//!< 128-bit Xmm register (X64).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm9
,
xmm
[
9
]);
//!< 128-bit Xmm register (X64).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm10
,
xmm
[
10
]);
//!< 128-bit Xmm register (X64).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm11
,
xmm
[
11
]);
//!< 128-bit Xmm register (X64).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm12
,
xmm
[
12
]);
//!< 128-bit Xmm register (X64).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm13
,
xmm
[
13
]);
//!< 128-bit Xmm register (X64).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm14
,
xmm
[
14
]);
//!< 128-bit Xmm register (X64).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm15
,
xmm
[
15
]);
//!< 128-bit Xmm register (X64).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm16
,
xmm
[
16
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm17
,
xmm
[
17
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm18
,
xmm
[
18
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm19
,
xmm
[
19
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm20
,
xmm
[
20
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm21
,
xmm
[
21
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm22
,
xmm
[
22
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm23
,
xmm
[
23
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm24
,
xmm
[
24
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm25
,
xmm
[
25
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm26
,
xmm
[
26
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm27
,
xmm
[
27
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm28
,
xmm
[
28
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm29
,
xmm
[
29
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm30
,
xmm
[
30
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86XmmReg
,
xmm31
,
xmm
[
31
]);
//!< 128-bit Xmm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm0
,
ymm
[
0
]);
//!< 256-bit Ymm register.
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm1
,
ymm
[
1
]);
//!< 256-bit Ymm register.
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm2
,
ymm
[
2
]);
//!< 256-bit Ymm register.
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm3
,
ymm
[
3
]);
//!< 256-bit Ymm register.
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm4
,
ymm
[
4
]);
//!< 256-bit Ymm register.
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm5
,
ymm
[
5
]);
//!< 256-bit Ymm register.
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm6
,
ymm
[
6
]);
//!< 256-bit Ymm register.
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm7
,
ymm
[
7
]);
//!< 256-bit Ymm register.
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm8
,
ymm
[
8
]);
//!< 256-bit Ymm register (X64).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm9
,
ymm
[
9
]);
//!< 256-bit Ymm register (X64).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm10
,
ymm
[
10
]);
//!< 256-bit Ymm register (X64).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm11
,
ymm
[
11
]);
//!< 256-bit Ymm register (X64).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm12
,
ymm
[
12
]);
//!< 256-bit Ymm register (X64).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm13
,
ymm
[
13
]);
//!< 256-bit Ymm register (X64).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm14
,
ymm
[
14
]);
//!< 256-bit Ymm register (X64).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm15
,
ymm
[
15
]);
//!< 256-bit Ymm register (X64).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm16
,
ymm
[
16
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm17
,
ymm
[
17
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm18
,
ymm
[
18
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm19
,
ymm
[
19
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm20
,
ymm
[
20
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm21
,
ymm
[
21
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm22
,
ymm
[
22
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm23
,
ymm
[
23
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm24
,
ymm
[
24
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm25
,
ymm
[
25
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm26
,
ymm
[
26
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm27
,
ymm
[
27
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm28
,
ymm
[
28
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm29
,
ymm
[
29
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm30
,
ymm
[
30
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86YmmReg
,
ymm31
,
ymm
[
31
]);
//!< 256-bit Ymm register (X64 & AVX512VL+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm0
,
zmm
[
0
]);
//!< 512-bit Zmm register.
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm1
,
zmm
[
1
]);
//!< 512-bit Zmm register.
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm2
,
zmm
[
2
]);
//!< 512-bit Zmm register.
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm3
,
zmm
[
3
]);
//!< 512-bit Zmm register.
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm4
,
zmm
[
4
]);
//!< 512-bit Zmm register.
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm5
,
zmm
[
5
]);
//!< 512-bit Zmm register.
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm6
,
zmm
[
6
]);
//!< 512-bit Zmm register.
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm7
,
zmm
[
7
]);
//!< 512-bit Zmm register.
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm8
,
zmm
[
8
]);
//!< 512-bit Zmm register (X64).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm9
,
zmm
[
9
]);
//!< 512-bit Zmm register (X64).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm10
,
zmm
[
10
]);
//!< 512-bit Zmm register (X64).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm11
,
zmm
[
11
]);
//!< 512-bit Zmm register (X64).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm12
,
zmm
[
12
]);
//!< 512-bit Zmm register (X64).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm13
,
zmm
[
13
]);
//!< 512-bit Zmm register (X64).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm14
,
zmm
[
14
]);
//!< 512-bit Zmm register (X64).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm15
,
zmm
[
15
]);
//!< 512-bit Zmm register (X64).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm16
,
zmm
[
16
]);
//!< 512-bit Zmm register (X64 & AVX512+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm17
,
zmm
[
17
]);
//!< 512-bit Zmm register (X64 & AVX512+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm18
,
zmm
[
18
]);
//!< 512-bit Zmm register (X64 & AVX512+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm19
,
zmm
[
19
]);
//!< 512-bit Zmm register (X64 & AVX512+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm20
,
zmm
[
20
]);
//!< 512-bit Zmm register (X64 & AVX512+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm21
,
zmm
[
21
]);
//!< 512-bit Zmm register (X64 & AVX512+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm22
,
zmm
[
22
]);
//!< 512-bit Zmm register (X64 & AVX512+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm23
,
zmm
[
23
]);
//!< 512-bit Zmm register (X64 & AVX512+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm24
,
zmm
[
24
]);
//!< 512-bit Zmm register (X64 & AVX512+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm25
,
zmm
[
25
]);
//!< 512-bit Zmm register (X64 & AVX512+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm26
,
zmm
[
26
]);
//!< 512-bit Zmm register (X64 & AVX512+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm27
,
zmm
[
27
]);
//!< 512-bit Zmm register (X64 & AVX512+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm28
,
zmm
[
28
]);
//!< 512-bit Zmm register (X64 & AVX512+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm29
,
zmm
[
29
]);
//!< 512-bit Zmm register (X64 & AVX512+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm30
,
zmm
[
30
]);
//!< 512-bit Zmm register (X64 & AVX512+).
ASMJIT_DEF_REG
(
X86ZmmReg
,
zmm31
,
zmm
[
31
]);
//!< 512-bit Zmm register (X64 & AVX512+).
#undef ASMJIT_DEF_REG
// This is only defined by `x86operand_regs.cpp` when exporting registers.
#if !defined(ASMJIT_EXPORTS_X86OPERAND_REGS)
...
...
@@ -1347,10 +1841,14 @@ static ASMJIT_INLINE X86GpReg gpq(uint32_t index) { return X86GpReg(kX86RegTypeG
static
ASMJIT_INLINE
X86FpReg
fp
(
uint32_t
index
)
{
return
X86FpReg
(
kX86RegTypeFp
,
index
,
10
);
}
//! Create 64-bit Mm register operand.
static
ASMJIT_INLINE
X86MmReg
mm
(
uint32_t
index
)
{
return
X86MmReg
(
kX86RegTypeMm
,
index
,
8
);
}
//! Create 64-bit K register operand.
static
ASMJIT_INLINE
X86KReg
k
(
uint32_t
index
)
{
return
X86KReg
(
kX86RegTypeK
,
index
,
8
);
}
//! Create 128-bit Xmm register operand.
static
ASMJIT_INLINE
X86XmmReg
xmm
(
uint32_t
index
)
{
return
X86XmmReg
(
kX86RegTypeXmm
,
index
,
16
);
}
//! Create 256-bit Ymm register operand.
static
ASMJIT_INLINE
X86YmmReg
ymm
(
uint32_t
index
)
{
return
X86YmmReg
(
kX86RegTypeYmm
,
index
,
32
);
}
//! Create 512-bit Zmm register operand.
static
ASMJIT_INLINE
X86ZmmReg
zmm
(
uint32_t
index
)
{
return
X86ZmmReg
(
kX86RegTypeZmm
,
index
,
64
);
}
// ============================================================================
// [asmjit::x86 - Ptr (Reg)]
...
...
@@ -1522,7 +2020,8 @@ ASMJIT_EXPAND_PTR_VAR(zword, 64)
}
// asmjit namespace
#undef _OP_ID
// [Cleanup]
#undef ASMJIT_OP_ID
// [Api-End]
#include "../apiend.h"
...
...
libraries/asmjit/x86/x86operand_regs.cpp
View file @
97ce448c
...
...
@@ -20,165 +20,262 @@
namespace
asmjit
{
// Prevent static initialization.
//
// Remap all classes to POD structs so they can be statically initialized
// without calling a constructor. Compiler will store these in data section.
struct
X86GpReg
{
Operand
::
VRegOp
data
;
};
struct
X86FpReg
{
Operand
::
VRegOp
data
;
};
struct
X86MmReg
{
Operand
::
VRegOp
data
;
};
struct
X86XmmReg
{
Operand
::
VRegOp
data
;
};
struct
X86YmmReg
{
Operand
::
VRegOp
data
;
};
struct
X86SegReg
{
Operand
::
VRegOp
data
;
};
namespace
x86
{
// ============================================================================
// [asmjit::x86::Registers]
// ============================================================================
#define REG(_Class_, _Name_, _Type_, _Index_, _Size_) \
const _Class_ _Name_ = {{ \
kOperandTypeReg, _Size_, { ((_Type_) << 8) + _Index_ }, kInvalidValue, {{ kInvalidVar, 0 }} \
}}
REG
(
X86GpReg
,
noGpReg
,
kInvalidReg
,
kInvalidReg
,
0
);
REG
(
X86GpReg
,
al
,
kX86RegTypeGpbLo
,
kX86RegIndexAx
,
1
);
REG
(
X86GpReg
,
cl
,
kX86RegTypeGpbLo
,
kX86RegIndexCx
,
1
);
REG
(
X86GpReg
,
dl
,
kX86RegTypeGpbLo
,
kX86RegIndexDx
,
1
);
REG
(
X86GpReg
,
bl
,
kX86RegTypeGpbLo
,
kX86RegIndexBx
,
1
);
REG
(
X86GpReg
,
spl
,
kX86RegTypeGpbLo
,
kX86RegIndexSp
,
1
);
REG
(
X86GpReg
,
bpl
,
kX86RegTypeGpbLo
,
kX86RegIndexBp
,
1
);
REG
(
X86GpReg
,
sil
,
kX86RegTypeGpbLo
,
kX86RegIndexSi
,
1
);
REG
(
X86GpReg
,
dil
,
kX86RegTypeGpbLo
,
kX86RegIndexDi
,
1
);
REG
(
X86GpReg
,
r8b
,
kX86RegTypeGpbLo
,
8
,
1
);
REG
(
X86GpReg
,
r9b
,
kX86RegTypeGpbLo
,
9
,
1
);
REG
(
X86GpReg
,
r10b
,
kX86RegTypeGpbLo
,
10
,
1
);
REG
(
X86GpReg
,
r11b
,
kX86RegTypeGpbLo
,
11
,
1
);
REG
(
X86GpReg
,
r12b
,
kX86RegTypeGpbLo
,
12
,
1
);
REG
(
X86GpReg
,
r13b
,
kX86RegTypeGpbLo
,
13
,
1
);
REG
(
X86GpReg
,
r14b
,
kX86RegTypeGpbLo
,
14
,
1
);
REG
(
X86GpReg
,
r15b
,
kX86RegTypeGpbLo
,
15
,
1
);
REG
(
X86GpReg
,
ah
,
kX86RegTypeGpbHi
,
kX86RegIndexAx
,
1
);
REG
(
X86GpReg
,
ch
,
kX86RegTypeGpbHi
,
kX86RegIndexCx
,
1
);
REG
(
X86GpReg
,
dh
,
kX86RegTypeGpbHi
,
kX86RegIndexDx
,
1
);
REG
(
X86GpReg
,
bh
,
kX86RegTypeGpbHi
,
kX86RegIndexBx
,
1
);
REG
(
X86GpReg
,
ax
,
kX86RegTypeGpw
,
kX86RegIndexAx
,
2
);
REG
(
X86GpReg
,
cx
,
kX86RegTypeGpw
,
kX86RegIndexCx
,
2
);
REG
(
X86GpReg
,
dx
,
kX86RegTypeGpw
,
kX86RegIndexDx
,
2
);
REG
(
X86GpReg
,
bx
,
kX86RegTypeGpw
,
kX86RegIndexBx
,
2
);
REG
(
X86GpReg
,
sp
,
kX86RegTypeGpw
,
kX86RegIndexSp
,
2
);
REG
(
X86GpReg
,
bp
,
kX86RegTypeGpw
,
kX86RegIndexBp
,
2
);
REG
(
X86GpReg
,
si
,
kX86RegTypeGpw
,
kX86RegIndexSi
,
2
);
REG
(
X86GpReg
,
di
,
kX86RegTypeGpw
,
kX86RegIndexDi
,
2
);
REG
(
X86GpReg
,
r8w
,
kX86RegTypeGpw
,
8
,
2
);
REG
(
X86GpReg
,
r9w
,
kX86RegTypeGpw
,
9
,
2
);
REG
(
X86GpReg
,
r10w
,
kX86RegTypeGpw
,
10
,
2
);
REG
(
X86GpReg
,
r11w
,
kX86RegTypeGpw
,
11
,
2
);
REG
(
X86GpReg
,
r12w
,
kX86RegTypeGpw
,
12
,
2
);
REG
(
X86GpReg
,
r13w
,
kX86RegTypeGpw
,
13
,
2
);
REG
(
X86GpReg
,
r14w
,
kX86RegTypeGpw
,
14
,
2
);
REG
(
X86GpReg
,
r15w
,
kX86RegTypeGpw
,
15
,
2
);
REG
(
X86GpReg
,
eax
,
kX86RegTypeGpd
,
kX86RegIndexAx
,
4
);
REG
(
X86GpReg
,
ecx
,
kX86RegTypeGpd
,
kX86RegIndexCx
,
4
);
REG
(
X86GpReg
,
edx
,
kX86RegTypeGpd
,
kX86RegIndexDx
,
4
);
REG
(
X86GpReg
,
ebx
,
kX86RegTypeGpd
,
kX86RegIndexBx
,
4
);
REG
(
X86GpReg
,
esp
,
kX86RegTypeGpd
,
kX86RegIndexSp
,
4
);
REG
(
X86GpReg
,
ebp
,
kX86RegTypeGpd
,
kX86RegIndexBp
,
4
);
REG
(
X86GpReg
,
esi
,
kX86RegTypeGpd
,
kX86RegIndexSi
,
4
);
REG
(
X86GpReg
,
edi
,
kX86RegTypeGpd
,
kX86RegIndexDi
,
4
);
REG
(
X86GpReg
,
r8d
,
kX86RegTypeGpd
,
8
,
4
);
REG
(
X86GpReg
,
r9d
,
kX86RegTypeGpd
,
9
,
4
);
REG
(
X86GpReg
,
r10d
,
kX86RegTypeGpd
,
10
,
4
);
REG
(
X86GpReg
,
r11d
,
kX86RegTypeGpd
,
11
,
4
);
REG
(
X86GpReg
,
r12d
,
kX86RegTypeGpd
,
12
,
4
);
REG
(
X86GpReg
,
r13d
,
kX86RegTypeGpd
,
13
,
4
);
REG
(
X86GpReg
,
r14d
,
kX86RegTypeGpd
,
14
,
4
);
REG
(
X86GpReg
,
r15d
,
kX86RegTypeGpd
,
15
,
4
);
REG
(
X86GpReg
,
rax
,
kX86RegTypeGpq
,
kX86RegIndexAx
,
8
);
REG
(
X86GpReg
,
rcx
,
kX86RegTypeGpq
,
kX86RegIndexCx
,
8
);
REG
(
X86GpReg
,
rdx
,
kX86RegTypeGpq
,
kX86RegIndexDx
,
8
);
REG
(
X86GpReg
,
rbx
,
kX86RegTypeGpq
,
kX86RegIndexBx
,
8
);
REG
(
X86GpReg
,
rsp
,
kX86RegTypeGpq
,
kX86RegIndexSp
,
8
);
REG
(
X86GpReg
,
rbp
,
kX86RegTypeGpq
,
kX86RegIndexBp
,
8
);
REG
(
X86GpReg
,
rsi
,
kX86RegTypeGpq
,
kX86RegIndexSi
,
8
);
REG
(
X86GpReg
,
rdi
,
kX86RegTypeGpq
,
kX86RegIndexDi
,
8
);
REG
(
X86GpReg
,
r8
,
kX86RegTypeGpq
,
8
,
8
);
REG
(
X86GpReg
,
r9
,
kX86RegTypeGpq
,
9
,
8
);
REG
(
X86GpReg
,
r10
,
kX86RegTypeGpq
,
10
,
8
);
REG
(
X86GpReg
,
r11
,
kX86RegTypeGpq
,
11
,
8
);
REG
(
X86GpReg
,
r12
,
kX86RegTypeGpq
,
12
,
8
);
REG
(
X86GpReg
,
r13
,
kX86RegTypeGpq
,
13
,
8
);
REG
(
X86GpReg
,
r14
,
kX86RegTypeGpq
,
14
,
8
);
REG
(
X86GpReg
,
r15
,
kX86RegTypeGpq
,
15
,
8
);
REG
(
X86FpReg
,
fp0
,
kX86RegTypeFp
,
0
,
10
);
REG
(
X86FpReg
,
fp1
,
kX86RegTypeFp
,
1
,
10
);
REG
(
X86FpReg
,
fp2
,
kX86RegTypeFp
,
2
,
10
);
REG
(
X86FpReg
,
fp3
,
kX86RegTypeFp
,
3
,
10
);
REG
(
X86FpReg
,
fp4
,
kX86RegTypeFp
,
4
,
10
);
REG
(
X86FpReg
,
fp5
,
kX86RegTypeFp
,
5
,
10
);
REG
(
X86FpReg
,
fp6
,
kX86RegTypeFp
,
6
,
10
);
REG
(
X86FpReg
,
fp7
,
kX86RegTypeFp
,
7
,
10
);
REG
(
X86MmReg
,
mm0
,
kX86RegTypeMm
,
0
,
8
);
REG
(
X86MmReg
,
mm1
,
kX86RegTypeMm
,
1
,
8
);
REG
(
X86MmReg
,
mm2
,
kX86RegTypeMm
,
2
,
8
);
REG
(
X86MmReg
,
mm3
,
kX86RegTypeMm
,
3
,
8
);
REG
(
X86MmReg
,
mm4
,
kX86RegTypeMm
,
4
,
8
);
REG
(
X86MmReg
,
mm5
,
kX86RegTypeMm
,
5
,
8
);
REG
(
X86MmReg
,
mm6
,
kX86RegTypeMm
,
6
,
8
);
REG
(
X86MmReg
,
mm7
,
kX86RegTypeMm
,
7
,
8
);
REG
(
X86XmmReg
,
xmm0
,
kX86RegTypeXmm
,
0
,
16
);
REG
(
X86XmmReg
,
xmm1
,
kX86RegTypeXmm
,
1
,
16
);
REG
(
X86XmmReg
,
xmm2
,
kX86RegTypeXmm
,
2
,
16
);
REG
(
X86XmmReg
,
xmm3
,
kX86RegTypeXmm
,
3
,
16
);
REG
(
X86XmmReg
,
xmm4
,
kX86RegTypeXmm
,
4
,
16
);
REG
(
X86XmmReg
,
xmm5
,
kX86RegTypeXmm
,
5
,
16
);
REG
(
X86XmmReg
,
xmm6
,
kX86RegTypeXmm
,
6
,
16
);
REG
(
X86XmmReg
,
xmm7
,
kX86RegTypeXmm
,
7
,
16
);
REG
(
X86XmmReg
,
xmm8
,
kX86RegTypeXmm
,
8
,
16
);
REG
(
X86XmmReg
,
xmm9
,
kX86RegTypeXmm
,
9
,
16
);
REG
(
X86XmmReg
,
xmm10
,
kX86RegTypeXmm
,
10
,
16
);
REG
(
X86XmmReg
,
xmm11
,
kX86RegTypeXmm
,
11
,
16
);
REG
(
X86XmmReg
,
xmm12
,
kX86RegTypeXmm
,
12
,
16
);
REG
(
X86XmmReg
,
xmm13
,
kX86RegTypeXmm
,
13
,
16
);
REG
(
X86XmmReg
,
xmm14
,
kX86RegTypeXmm
,
14
,
16
);
REG
(
X86XmmReg
,
xmm15
,
kX86RegTypeXmm
,
15
,
16
);
REG
(
X86YmmReg
,
ymm0
,
kX86RegTypeYmm
,
0
,
32
);
REG
(
X86YmmReg
,
ymm1
,
kX86RegTypeYmm
,
1
,
32
);
REG
(
X86YmmReg
,
ymm2
,
kX86RegTypeYmm
,
2
,
32
);
REG
(
X86YmmReg
,
ymm3
,
kX86RegTypeYmm
,
3
,
32
);
REG
(
X86YmmReg
,
ymm4
,
kX86RegTypeYmm
,
4
,
32
);
REG
(
X86YmmReg
,
ymm5
,
kX86RegTypeYmm
,
5
,
32
);
REG
(
X86YmmReg
,
ymm6
,
kX86RegTypeYmm
,
6
,
32
);
REG
(
X86YmmReg
,
ymm7
,
kX86RegTypeYmm
,
7
,
32
);
REG
(
X86YmmReg
,
ymm8
,
kX86RegTypeYmm
,
8
,
32
);
REG
(
X86YmmReg
,
ymm9
,
kX86RegTypeYmm
,
9
,
32
);
REG
(
X86YmmReg
,
ymm10
,
kX86RegTypeYmm
,
10
,
32
);
REG
(
X86YmmReg
,
ymm11
,
kX86RegTypeYmm
,
11
,
32
);
REG
(
X86YmmReg
,
ymm12
,
kX86RegTypeYmm
,
12
,
32
);
REG
(
X86YmmReg
,
ymm13
,
kX86RegTypeYmm
,
13
,
32
);
REG
(
X86YmmReg
,
ymm14
,
kX86RegTypeYmm
,
14
,
32
);
REG
(
X86YmmReg
,
ymm15
,
kX86RegTypeYmm
,
15
,
32
);
REG
(
X86SegReg
,
cs
,
kX86RegTypeSeg
,
kX86SegCs
,
2
);
REG
(
X86SegReg
,
ss
,
kX86RegTypeSeg
,
kX86SegSs
,
2
);
REG
(
X86SegReg
,
ds
,
kX86RegTypeSeg
,
kX86SegDs
,
2
);
REG
(
X86SegReg
,
es
,
kX86RegTypeSeg
,
kX86SegEs
,
2
);
REG
(
X86SegReg
,
fs
,
kX86RegTypeSeg
,
kX86SegFs
,
2
);
REG
(
X86SegReg
,
gs
,
kX86RegTypeSeg
,
kX86SegGs
,
2
);
#define REG(_Type_, _Index_, _Size_) {{ \
kOperandTypeReg, _Size_, { ((_Type_) << 8) + _Index_ }, kInvalidValue, {{ kInvalidVar, 0 }} \
}}
const
X86RegData
x86RegData
=
{
// RIP.
REG
(
kX86RegTypeRip
,
0
,
0
),
// NpGp.
REG
(
kInvalidReg
,
kInvalidReg
,
0
),
// Segments.
{
REG
(
kX86RegTypeSeg
,
0
,
2
),
// Default.
REG
(
kX86RegTypeSeg
,
1
,
2
),
// ES.
REG
(
kX86RegTypeSeg
,
2
,
2
),
// CS.
REG
(
kX86RegTypeSeg
,
3
,
2
),
// SS.
REG
(
kX86RegTypeSeg
,
4
,
2
),
// DS.
REG
(
kX86RegTypeSeg
,
5
,
2
),
// FS.
REG
(
kX86RegTypeSeg
,
6
,
2
)
// GS.
},
// GpbLo.
{
REG
(
kX86RegTypeGpbLo
,
0
,
1
),
REG
(
kX86RegTypeGpbLo
,
1
,
1
),
REG
(
kX86RegTypeGpbLo
,
2
,
1
),
REG
(
kX86RegTypeGpbLo
,
3
,
1
),
REG
(
kX86RegTypeGpbLo
,
4
,
1
),
REG
(
kX86RegTypeGpbLo
,
5
,
1
),
REG
(
kX86RegTypeGpbLo
,
6
,
1
),
REG
(
kX86RegTypeGpbLo
,
7
,
1
),
REG
(
kX86RegTypeGpbLo
,
8
,
1
),
REG
(
kX86RegTypeGpbLo
,
9
,
1
),
REG
(
kX86RegTypeGpbLo
,
10
,
1
),
REG
(
kX86RegTypeGpbLo
,
11
,
1
),
REG
(
kX86RegTypeGpbLo
,
12
,
1
),
REG
(
kX86RegTypeGpbLo
,
13
,
1
),
REG
(
kX86RegTypeGpbLo
,
14
,
1
),
REG
(
kX86RegTypeGpbLo
,
15
,
1
)
},
// GpbHi.
{
REG
(
kX86RegTypeGpbHi
,
0
,
1
),
REG
(
kX86RegTypeGpbHi
,
1
,
1
),
REG
(
kX86RegTypeGpbHi
,
2
,
1
),
REG
(
kX86RegTypeGpbHi
,
3
,
1
)
},
// Gpw.
{
REG
(
kX86RegTypeGpw
,
0
,
2
),
REG
(
kX86RegTypeGpw
,
1
,
2
),
REG
(
kX86RegTypeGpw
,
2
,
2
),
REG
(
kX86RegTypeGpw
,
3
,
2
),
REG
(
kX86RegTypeGpw
,
4
,
2
),
REG
(
kX86RegTypeGpw
,
5
,
2
),
REG
(
kX86RegTypeGpw
,
6
,
2
),
REG
(
kX86RegTypeGpw
,
7
,
2
),
REG
(
kX86RegTypeGpw
,
8
,
2
),
REG
(
kX86RegTypeGpw
,
9
,
2
),
REG
(
kX86RegTypeGpw
,
10
,
2
),
REG
(
kX86RegTypeGpw
,
11
,
2
),
REG
(
kX86RegTypeGpw
,
12
,
2
),
REG
(
kX86RegTypeGpw
,
13
,
2
),
REG
(
kX86RegTypeGpw
,
14
,
2
),
REG
(
kX86RegTypeGpw
,
15
,
2
)
},
// Gpd.
{
REG
(
kX86RegTypeGpd
,
0
,
4
),
REG
(
kX86RegTypeGpd
,
1
,
4
),
REG
(
kX86RegTypeGpd
,
2
,
4
),
REG
(
kX86RegTypeGpd
,
3
,
4
),
REG
(
kX86RegTypeGpd
,
4
,
4
),
REG
(
kX86RegTypeGpd
,
5
,
4
),
REG
(
kX86RegTypeGpd
,
6
,
4
),
REG
(
kX86RegTypeGpd
,
7
,
4
),
REG
(
kX86RegTypeGpd
,
8
,
4
),
REG
(
kX86RegTypeGpd
,
9
,
4
),
REG
(
kX86RegTypeGpd
,
10
,
4
),
REG
(
kX86RegTypeGpd
,
11
,
4
),
REG
(
kX86RegTypeGpd
,
12
,
4
),
REG
(
kX86RegTypeGpd
,
13
,
4
),
REG
(
kX86RegTypeGpd
,
14
,
4
),
REG
(
kX86RegTypeGpd
,
15
,
4
)
},
// Gpq.
{
REG
(
kX86RegTypeGpq
,
0
,
8
),
REG
(
kX86RegTypeGpq
,
1
,
8
),
REG
(
kX86RegTypeGpq
,
2
,
8
),
REG
(
kX86RegTypeGpq
,
3
,
8
),
REG
(
kX86RegTypeGpq
,
4
,
8
),
REG
(
kX86RegTypeGpq
,
5
,
8
),
REG
(
kX86RegTypeGpq
,
6
,
8
),
REG
(
kX86RegTypeGpq
,
7
,
8
),
REG
(
kX86RegTypeGpq
,
8
,
8
),
REG
(
kX86RegTypeGpq
,
9
,
8
),
REG
(
kX86RegTypeGpq
,
10
,
8
),
REG
(
kX86RegTypeGpq
,
11
,
8
),
REG
(
kX86RegTypeGpq
,
12
,
8
),
REG
(
kX86RegTypeGpq
,
13
,
8
),
REG
(
kX86RegTypeGpq
,
14
,
8
),
REG
(
kX86RegTypeGpq
,
15
,
8
)
},
// Fp.
{
REG
(
kX86RegTypeFp
,
0
,
10
),
REG
(
kX86RegTypeFp
,
1
,
10
),
REG
(
kX86RegTypeFp
,
2
,
10
),
REG
(
kX86RegTypeFp
,
3
,
10
),
REG
(
kX86RegTypeFp
,
4
,
10
),
REG
(
kX86RegTypeFp
,
5
,
10
),
REG
(
kX86RegTypeFp
,
6
,
10
),
REG
(
kX86RegTypeFp
,
7
,
10
)
},
// Mm.
{
REG
(
kX86RegTypeMm
,
0
,
8
),
REG
(
kX86RegTypeMm
,
1
,
8
),
REG
(
kX86RegTypeMm
,
2
,
8
),
REG
(
kX86RegTypeMm
,
3
,
8
),
REG
(
kX86RegTypeMm
,
4
,
8
),
REG
(
kX86RegTypeMm
,
5
,
8
),
REG
(
kX86RegTypeMm
,
6
,
8
),
REG
(
kX86RegTypeMm
,
7
,
8
)
},
// K.
{
REG
(
kX86RegTypeK
,
0
,
8
),
REG
(
kX86RegTypeK
,
1
,
8
),
REG
(
kX86RegTypeK
,
2
,
8
),
REG
(
kX86RegTypeK
,
3
,
8
),
REG
(
kX86RegTypeK
,
4
,
8
),
REG
(
kX86RegTypeK
,
5
,
8
),
REG
(
kX86RegTypeK
,
6
,
8
),
REG
(
kX86RegTypeK
,
7
,
8
)
},
// Xmm.
{
REG
(
kX86RegTypeXmm
,
0
,
16
),
REG
(
kX86RegTypeXmm
,
1
,
16
),
REG
(
kX86RegTypeXmm
,
2
,
16
),
REG
(
kX86RegTypeXmm
,
3
,
16
),
REG
(
kX86RegTypeXmm
,
4
,
16
),
REG
(
kX86RegTypeXmm
,
5
,
16
),
REG
(
kX86RegTypeXmm
,
6
,
16
),
REG
(
kX86RegTypeXmm
,
7
,
16
),
REG
(
kX86RegTypeXmm
,
8
,
16
),
REG
(
kX86RegTypeXmm
,
9
,
16
),
REG
(
kX86RegTypeXmm
,
10
,
16
),
REG
(
kX86RegTypeXmm
,
11
,
16
),
REG
(
kX86RegTypeXmm
,
12
,
16
),
REG
(
kX86RegTypeXmm
,
13
,
16
),
REG
(
kX86RegTypeXmm
,
14
,
16
),
REG
(
kX86RegTypeXmm
,
15
,
16
),
REG
(
kX86RegTypeXmm
,
16
,
16
),
REG
(
kX86RegTypeXmm
,
17
,
16
),
REG
(
kX86RegTypeXmm
,
18
,
16
),
REG
(
kX86RegTypeXmm
,
19
,
16
),
REG
(
kX86RegTypeXmm
,
20
,
16
),
REG
(
kX86RegTypeXmm
,
21
,
16
),
REG
(
kX86RegTypeXmm
,
22
,
16
),
REG
(
kX86RegTypeXmm
,
23
,
16
),
REG
(
kX86RegTypeXmm
,
24
,
16
),
REG
(
kX86RegTypeXmm
,
25
,
16
),
REG
(
kX86RegTypeXmm
,
26
,
16
),
REG
(
kX86RegTypeXmm
,
27
,
16
),
REG
(
kX86RegTypeXmm
,
28
,
16
),
REG
(
kX86RegTypeXmm
,
29
,
16
),
REG
(
kX86RegTypeXmm
,
30
,
16
),
REG
(
kX86RegTypeXmm
,
31
,
16
)
},
// Ymm.
{
REG
(
kX86RegTypeYmm
,
0
,
32
),
REG
(
kX86RegTypeYmm
,
1
,
32
),
REG
(
kX86RegTypeYmm
,
2
,
32
),
REG
(
kX86RegTypeYmm
,
3
,
32
),
REG
(
kX86RegTypeYmm
,
4
,
32
),
REG
(
kX86RegTypeYmm
,
5
,
32
),
REG
(
kX86RegTypeYmm
,
6
,
32
),
REG
(
kX86RegTypeYmm
,
7
,
32
),
REG
(
kX86RegTypeYmm
,
8
,
32
),
REG
(
kX86RegTypeYmm
,
9
,
32
),
REG
(
kX86RegTypeYmm
,
10
,
32
),
REG
(
kX86RegTypeYmm
,
11
,
32
),
REG
(
kX86RegTypeYmm
,
12
,
32
),
REG
(
kX86RegTypeYmm
,
13
,
32
),
REG
(
kX86RegTypeYmm
,
14
,
32
),
REG
(
kX86RegTypeYmm
,
15
,
32
),
REG
(
kX86RegTypeYmm
,
16
,
32
),
REG
(
kX86RegTypeYmm
,
17
,
32
),
REG
(
kX86RegTypeYmm
,
18
,
32
),
REG
(
kX86RegTypeYmm
,
19
,
32
),
REG
(
kX86RegTypeYmm
,
20
,
32
),
REG
(
kX86RegTypeYmm
,
21
,
32
),
REG
(
kX86RegTypeYmm
,
22
,
32
),
REG
(
kX86RegTypeYmm
,
23
,
32
),
REG
(
kX86RegTypeYmm
,
24
,
32
),
REG
(
kX86RegTypeYmm
,
25
,
32
),
REG
(
kX86RegTypeYmm
,
26
,
32
),
REG
(
kX86RegTypeYmm
,
27
,
32
),
REG
(
kX86RegTypeYmm
,
28
,
32
),
REG
(
kX86RegTypeYmm
,
29
,
32
),
REG
(
kX86RegTypeYmm
,
30
,
32
),
REG
(
kX86RegTypeYmm
,
31
,
32
)
},
// Zmm.
{
REG
(
kX86RegTypeZmm
,
0
,
64
),
REG
(
kX86RegTypeZmm
,
1
,
64
),
REG
(
kX86RegTypeZmm
,
2
,
64
),
REG
(
kX86RegTypeZmm
,
3
,
64
),
REG
(
kX86RegTypeZmm
,
4
,
64
),
REG
(
kX86RegTypeZmm
,
5
,
64
),
REG
(
kX86RegTypeZmm
,
6
,
64
),
REG
(
kX86RegTypeZmm
,
7
,
64
),
REG
(
kX86RegTypeZmm
,
8
,
64
),
REG
(
kX86RegTypeZmm
,
9
,
64
),
REG
(
kX86RegTypeZmm
,
10
,
64
),
REG
(
kX86RegTypeZmm
,
11
,
64
),
REG
(
kX86RegTypeZmm
,
12
,
64
),
REG
(
kX86RegTypeZmm
,
13
,
64
),
REG
(
kX86RegTypeZmm
,
14
,
64
),
REG
(
kX86RegTypeZmm
,
15
,
64
),
REG
(
kX86RegTypeZmm
,
16
,
64
),
REG
(
kX86RegTypeZmm
,
17
,
64
),
REG
(
kX86RegTypeZmm
,
18
,
64
),
REG
(
kX86RegTypeZmm
,
19
,
64
),
REG
(
kX86RegTypeZmm
,
20
,
64
),
REG
(
kX86RegTypeZmm
,
21
,
64
),
REG
(
kX86RegTypeZmm
,
22
,
64
),
REG
(
kX86RegTypeZmm
,
23
,
64
),
REG
(
kX86RegTypeZmm
,
24
,
64
),
REG
(
kX86RegTypeZmm
,
25
,
64
),
REG
(
kX86RegTypeZmm
,
26
,
64
),
REG
(
kX86RegTypeZmm
,
27
,
64
),
REG
(
kX86RegTypeZmm
,
28
,
64
),
REG
(
kX86RegTypeZmm
,
29
,
64
),
REG
(
kX86RegTypeZmm
,
30
,
64
),
REG
(
kX86RegTypeZmm
,
31
,
64
)
}
};
#undef REG
}
// x86 namespace
}
// asmjit namespace
// [Api-End]
...
...
libraries/asmjit/x86/x86scheduler.cpp
View file @
97ce448c
...
...
@@ -76,7 +76,7 @@ Error X86Scheduler::run(Node* start, Node* stop) {
Node* next = node_->getNext();
ASMJIT_ASSERT(node_->getType() == kNodeTypeInst);
printf(" %s\n", X86Util::getInstInfo(static_cast<InstNode*>(node_)->get
Code
()).getInstName());
printf(" %s\n", X86Util::getInstInfo(static_cast<InstNode*>(node_)->get
InstId
()).getInstName());
node_ = next;
}
...
...
serialization/src/XmlSerializer.cpp
View file @
97ce448c
...
...
@@ -90,7 +90,7 @@ static void encodeString(const string& str, string* outString) {
// Below 32 is symbolic.
char
buf
[
32
];
s
n
printf
(
buf
,
sizeof
(
buf
),
"&#x%02X;"
,
(
unsigned
)
(
c
&
0xff
));
sprintf
(
buf
,
"&#x%02X;"
,
(
unsigned
)
(
c
&
0xff
));
//*ME: warning C4267: convert 'size_t' to 'int'
//*ME: Int-Cast to make compiler happy ...
...
...
Prev
1
2
3
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment