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
20 changed files
with
413 additions
and
298 deletions
+413
-298
CMakeLists.txt
CMakeLists.txt
+6
-8
libraries/asmjit/apibegin.h
libraries/asmjit/apibegin.h
+40
-5
libraries/asmjit/apiend.h
libraries/asmjit/apiend.h
+45
-11
libraries/asmjit/asmjit.h
libraries/asmjit/asmjit.h
+11
-11
libraries/asmjit/base/assembler.cpp
libraries/asmjit/base/assembler.cpp
+15
-23
libraries/asmjit/base/assembler.h
libraries/asmjit/base/assembler.h
+20
-17
libraries/asmjit/base/codegen.h
libraries/asmjit/base/codegen.h
+6
-6
libraries/asmjit/base/compiler.cpp
libraries/asmjit/base/compiler.cpp
+2
-2
libraries/asmjit/base/compiler.h
libraries/asmjit/base/compiler.h
+167
-126
libraries/asmjit/base/constpool.cpp
libraries/asmjit/base/constpool.cpp
+1
-15
libraries/asmjit/base/constpool.h
libraries/asmjit/base/constpool.h
+4
-0
libraries/asmjit/base/context.cpp
libraries/asmjit/base/context.cpp
+5
-5
libraries/asmjit/base/cpuinfo.cpp
libraries/asmjit/base/cpuinfo.cpp
+6
-6
libraries/asmjit/base/cpuinfo.h
libraries/asmjit/base/cpuinfo.h
+4
-4
libraries/asmjit/base/cputicks.cpp
libraries/asmjit/base/cputicks.cpp
+1
-1
libraries/asmjit/base/error.cpp
libraries/asmjit/base/error.cpp
+2
-0
libraries/asmjit/base/error.h
libraries/asmjit/base/error.h
+6
-6
libraries/asmjit/base/globals.h
libraries/asmjit/base/globals.h
+11
-11
libraries/asmjit/base/intutil.h
libraries/asmjit/base/intutil.h
+57
-31
libraries/asmjit/base/logger.cpp
libraries/asmjit/base/logger.cpp
+4
-10
No files found.
CMakeLists.txt
View file @
97ce448c
...
...
@@ -274,14 +274,12 @@ ELSE (ANDROID OR PNACL)
SET_SOURCE_FILES_PROPERTIES
(
${
CMAKE_SOURCE_DIR
}
/libraries/sfmt/src/SFMT.cpp PROPERTIES COMPILE_FLAGS
"-DHAVE_SSE2=1"
)
ENDIF
(
ANDROID OR PNACL
)
IF
(
NOT
(
ANDROID OR PNACL
))
IF
(
CMAKE_SIZEOF_VOID_P EQUAL 8
)
FILE
(
GLOB src_files
${
CMAKE_CURRENT_SOURCE_DIR
}
/libraries/asmjit/*/*.cpp
)
FILE
(
GLOB incl_files
${
CMAKE_CURRENT_SOURCE_DIR
}
/libraries/asmjit/*.h
)
SET
(
SOURCE_FILES
${
SOURCE_FILES
}
${
src_files
}
)
SET
(
SOURCE_INCLUDE_FILES
${
SOURCE_INCLUDE_FILES
}
${
incl_files
}
)
INCLUDE_DIRECTORIES
(
BEFORE
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/libraries/asmjit"
)
SET
(
EXTRA_COMPILE_FLAGS
"
${
EXTRA_COMPILE_FLAGS
}
-DLEPTON_USE_JIT"
)
ENDIF
(
CMAKE_SIZEOF_VOID_P EQUAL 8
)
FILE
(
GLOB src_files
${
CMAKE_CURRENT_SOURCE_DIR
}
/libraries/asmjit/*/*.cpp
)
FILE
(
GLOB incl_files
${
CMAKE_CURRENT_SOURCE_DIR
}
/libraries/asmjit/*.h
)
SET
(
SOURCE_FILES
${
SOURCE_FILES
}
${
src_files
}
)
SET
(
SOURCE_INCLUDE_FILES
${
SOURCE_INCLUDE_FILES
}
${
incl_files
}
)
INCLUDE_DIRECTORIES
(
BEFORE
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/libraries/asmjit"
)
SET
(
EXTRA_COMPILE_FLAGS
"
${
EXTRA_COMPILE_FLAGS
}
-DLEPTON_USE_JIT"
)
ENDIF
(
NOT
(
ANDROID OR PNACL
))
# If API wrappers are being generated, and add them to the build.
...
...
libraries/asmjit/apibegin.h
View file @
97ce448c
...
...
@@ -4,12 +4,38 @@
// [License]
// Zlib - See LICENSE.md file in the package.
// [Dependencies - AsmJit]
#if !defined(_ASMJIT_BUILD_H)
#include "build.h"
#endif // !_ASMJIT_BUILD_H
// [Guard]
#if !defined(ASMJIT_API_SCOPE)
# define ASMJIT_API_SCOPE
#else
# error "AsmJit - Api-Scope is already active, previous scope not closed by apiend.h?"
#endif // ASMJIT_API_SCOPE
// ============================================================================
// [MSVC]
// [Override]
// ============================================================================
#if !defined(ASMJIT_CC_HAS_OVERRIDE) && !defined(override)
# define override
# define ASMJIT_UNDEF_OVERRIDE
#endif // !ASMJIT_CC_HAS_OVERRIDE && !override
// ============================================================================
// [NoExcept]
// ============================================================================
#if !defined(ASMJIT_CC_HAS_NOEXCEPT) && !defined(noexcept)
# define noexcept ASMJIT_NOEXCEPT
# define ASMJIT_UNDEF_NOEXCEPT
#endif // !ASMJIT_CC_HAS_NOEXCEPT && !noexcept
// ============================================================================
// [MSC]
// ============================================================================
#if defined(_MSC_VER)
...
...
@@ -29,21 +55,30 @@
// Rename symbols.
# if !defined(vsnprintf)
# define ASMJIT_DEF
INED
_VSNPRINTF
# define ASMJIT_
UN
DEF_VSNPRINTF
# define vsnprintf _vsnprintf
# endif // !vsnprintf
# if !defined(snprintf)
# define ASMJIT_DEF
INED
_SNPRINTF
# define ASMJIT_
UN
DEF_SNPRINTF
# define snprintf _snprintf
# endif // !snprintf
#endif // _MSC_VER
// ============================================================================
// [GNUC]
// [CLang]
// ============================================================================
#if defined(__clang__)
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wunnamed-type-template-args"
#endif // __clang__
// ============================================================================
// [GCC]
// ============================================================================
#if defined(__GNUC__) && !defined(__clang__)
# if __GNUC__ >= 4 && !defined(__MINGW32__)
# pragma GCC visibility push(hidden)
# endif //
__GNUC__ >=
4
# endif //
GCC
4
+
#endif // __GNUC__
libraries/asmjit/apiend.h
View file @
97ce448c
...
...
@@ -4,30 +4,64 @@
// [License]
// Zlib - See LICENSE.md file in the package.
// [Guard]
#if defined(ASMJIT_API_SCOPE)
# undef ASMJIT_API_SCOPE
#else
# error "AsmJit - Api-Scope not active, forgot to include apibegin.h?"
#endif // ASMJIT_API_SCOPE
// ============================================================================
// [Override]
// ============================================================================
#if defined(ASMJIT_UNDEF_OVERRIDE)
# undef override
# undef ASMJIT_UNDEF_OVERRIDE
#endif // ASMJIT_UNDEF_OVERRIDE
// ============================================================================
// [NoExcept]
// ============================================================================
#if defined(ASMJIT_UNDEF_NOEXCEPT)
# undef noexcept
# undef ASMJIT_UNDEF_NOEXCEPT
#endif // ASMJIT_UNDEF_NOEXCEPT
// ============================================================================
// [MS
V
C]
// [MSC]
// ============================================================================
#if defined(_MSC_VER)
// Pop disabled warnings by ApiBegin.h
# pragma warning(pop)
// Rename symbols back.
# if defined(ASMJIT_DEFINED_VSNPRINTF)
# undef ASMJIT_DEFINED_VSNPRINTF
# if defined(ASMJIT_UNDEF_VSNPRINTF)
# undef vsnprintf
# endif // ASMJIT_DEFINED_VSNPRINTF
# if defined(ASMJIT_DEFINED_SNPRINTF)
# undef ASMJIT_DEFINED_SNPRINTF
# undef ASMJIT_UNDEF_VSNPRINTF
# endif // ASMJIT_UNDEF_VSNPRINTF
# if defined(ASMJIT_UNDEF_SNPRINTF)
# undef snprintf
# endif // ASMJIT_DEFINED_SNPRINTF
# undef ASMJIT_UNDEF_SNPRINTF
# endif // ASMJIT_UNDEF_SNPRINTF
#endif // _MSC_VER
// ============================================================================
// [GNUC]
// [CLang]
// ============================================================================
#if defined(__clang__)
# pragma clang diagnostic pop
#endif // __clang__
// ============================================================================
// [GCC]
// ============================================================================
#if defined(__GNUC__) && !defined(__clang__)
# if __GNUC__ >= 4 && !defined(__MINGW32__)
# pragma GCC visibility pop
# endif //
__GNUC__ >=
4
# endif //
GCC
4
+
#endif // __GNUC__
libraries/asmjit/asmjit.h
View file @
97ce448c
...
...
@@ -235,15 +235,15 @@
//! `BaseMem` class. These functions are used to make operands that represents
//! memory addresses:
//!
//! - `asmjit::ptr()`
//! - `asmjit::byte_ptr()`
//! - `asmjit::word_ptr()`
//! - `asmjit::dword_ptr()`
//! - `asmjit::qword_ptr()`
//! - `asmjit::tword_ptr()`
//! - `asmjit::oword_ptr()`
//! - `asmjit::yword_ptr()`
//! - `asmjit::zword_ptr()`
//! - `asmjit::ptr()`
- Address size not specified.
//! - `asmjit::byte_ptr()`
- 1 byte.
//! - `asmjit::word_ptr()`
- 2 bytes (Gpw size).
//! - `asmjit::dword_ptr()`
- 4 bytes (Gpd size).
//! - `asmjit::qword_ptr()`
- 8 bytes (Gpq/Mm size).
//! - `asmjit::tword_ptr()`
- 10 bytes (FPU).
//! - `asmjit::oword_ptr()`
- 16 bytes (Xmm size).
//! - `asmjit::yword_ptr()`
- 32 bytes (Ymm size).
//! - `asmjit::zword_ptr()`
- 64 bytes (Zmm size).
//!
//! Most useful function to make pointer should be `asmjit::ptr()`. It creates
//! pointer to the target with unspecified size. Unspecified size works in all
...
...
@@ -298,10 +298,10 @@
//! // Get `X86CpuInfo` global instance.
//! const X86CpuInfo* cpuInfo = X86CpuInfo::getHost();
//!
//! if (cpuInfo->hasFeature(kX86CpuFeatureS
se
2)) {
//! if (cpuInfo->hasFeature(kX86CpuFeatureS
SE
2)) {
//! // Processor has SSE2.
//! }
//! else if (cpuInfo->hasFeature(kX86CpuFeatureM
mx
)) {
//! else if (cpuInfo->hasFeature(kX86CpuFeatureM
MX
)) {
//! // Processor doesn't have SSE2, but has MMX.
//! }
//! else {
...
...
libraries/asmjit/base/assembler.cpp
View file @
97ce448c
...
...
@@ -340,43 +340,35 @@ Error Assembler::emit(uint32_t code, const Operand& o0, const Operand& o1, const
}
Error
Assembler
::
emit
(
uint32_t
code
,
int
o0
)
{
Imm
imm
(
o0
);
return
_emit
(
code
,
imm
,
NA
,
NA
,
NA
);
return
_emit
(
code
,
Imm
(
o0
),
NA
,
NA
,
NA
);
}
Error
Assembler
::
emit
(
uint32_t
code
,
uint64_t
o0
)
{
Imm
imm
(
o0
);
return
_emit
(
code
,
imm
,
NA
,
NA
,
NA
);
Error
Assembler
::
emit
(
uint32_t
code
,
const
Operand
&
o0
,
int
o1
)
{
return
_emit
(
code
,
o0
,
Imm
(
o1
),
NA
,
NA
);
}
Error
Assembler
::
emit
(
uint32_t
code
,
const
Operand
&
o0
,
int
o1
)
{
Imm
imm
(
o1
);
return
_emit
(
code
,
o0
,
imm
,
NA
,
NA
);
Error
Assembler
::
emit
(
uint32_t
code
,
const
Operand
&
o0
,
const
Operand
&
o1
,
int
o2
)
{
return
_emit
(
code
,
o0
,
o1
,
Imm
(
o2
),
NA
);
}
Error
Assembler
::
emit
(
uint32_t
code
,
const
Operand
&
o0
,
uint64_t
o1
)
{
Imm
imm
(
o1
);
return
_emit
(
code
,
o0
,
imm
,
NA
,
NA
);
Error
Assembler
::
emit
(
uint32_t
code
,
const
Operand
&
o0
,
const
Operand
&
o1
,
const
Operand
&
o2
,
int
o3
)
{
return
_emit
(
code
,
o0
,
o1
,
o2
,
Imm
(
o3
));
}
Error
Assembler
::
emit
(
uint32_t
code
,
const
Operand
&
o0
,
const
Operand
&
o1
,
int
o2
)
{
Imm
imm
(
o2
);
return
_emit
(
code
,
o0
,
o1
,
imm
,
NA
);
Error
Assembler
::
emit
(
uint32_t
code
,
int64_t
o0
)
{
return
_emit
(
code
,
Imm
(
o0
),
NA
,
NA
,
NA
);
}
Error
Assembler
::
emit
(
uint32_t
code
,
const
Operand
&
o0
,
const
Operand
&
o1
,
uint64_t
o2
)
{
Imm
imm
(
o2
);
return
_emit
(
code
,
o0
,
o1
,
imm
,
NA
);
Error
Assembler
::
emit
(
uint32_t
code
,
const
Operand
&
o0
,
int64_t
o1
)
{
return
_emit
(
code
,
o0
,
Imm
(
o1
),
NA
,
NA
);
}
Error
Assembler
::
emit
(
uint32_t
code
,
const
Operand
&
o0
,
const
Operand
&
o1
,
const
Operand
&
o2
,
int
o3
)
{
Imm
imm
(
o3
);
return
_emit
(
code
,
o0
,
o1
,
o2
,
imm
);
Error
Assembler
::
emit
(
uint32_t
code
,
const
Operand
&
o0
,
const
Operand
&
o1
,
int64_t
o2
)
{
return
_emit
(
code
,
o0
,
o1
,
Imm
(
o2
),
NA
);
}
Error
Assembler
::
emit
(
uint32_t
code
,
const
Operand
&
o0
,
const
Operand
&
o1
,
const
Operand
&
o2
,
uint64_t
o3
)
{
Imm
imm
(
o3
);
return
_emit
(
code
,
o0
,
o1
,
o2
,
imm
);
Error
Assembler
::
emit
(
uint32_t
code
,
const
Operand
&
o0
,
const
Operand
&
o1
,
const
Operand
&
o2
,
int64_t
o3
)
{
return
_emit
(
code
,
o0
,
o1
,
o2
,
Imm
(
o3
));
}
#undef NA
...
...
libraries/asmjit/base/assembler.h
View file @
97ce448c
...
...
@@ -26,23 +26,23 @@ namespace asmjit {
//! \{
// ============================================================================
// [asmjit::
k
InstId]
// [asmjit::InstId]
// ============================================================================
//! Instruction codes (stub).
ASMJIT_ENUM
(
k
InstId
)
{
ASMJIT_ENUM
(
InstId
)
{
//! No instruction.
kInstIdNone
=
0
};
// ============================================================================
// [asmjit::
k
InstOptions]
// [asmjit::InstOptions]
// ============================================================================
//! Instruction options
(stub)
.
ASMJIT_ENUM
(
k
InstOptions
)
{
//! Instruction options.
ASMJIT_ENUM
(
InstOptions
)
{
//! No instruction options.
kInstOptionNone
=
0x00
,
kInstOptionNone
=
0x00
000000
,
//! Emit short form of the instruction.
//!
...
...
@@ -53,7 +53,8 @@ ASMJIT_ENUM(kInstOptions) {
//! can be dangerous if the short jmp/jcc is required, but not encodable due
//! to large displacement, in such case an error happens and the whole
//! assembler/compiler stream is unusable.
kInstOptionShortForm
=
0x01
,
kInstOptionShortForm
=
0x00000001
,
//! Emit long form of the instruction.
//!
//! X86/X64:
...
...
@@ -61,12 +62,13 @@ ASMJIT_ENUM(kInstOptions) {
//! Long form is mosrlt related to jmp and jcc instructions, but like the
//! `kInstOptionShortForm` option it can be used by other instructions
//! supporting both 8-bit and 32-bit immediates.
kInstOptionLongForm
=
0x02
,
kInstOptionLongForm
=
0x0
000000
2
,
//! Condition is likely to be taken.
kInstOptionTaken
=
0x04
,
kInstOptionTaken
=
0x00000004
,
//! Condition is unlikely to be taken.
kInstOptionNotTaken
=
0x08
kInstOptionNotTaken
=
0x0
000000
8
};
// ============================================================================
...
...
@@ -474,19 +476,20 @@ struct ASMJIT_VCLASS Assembler : public CodeGen {
//! Emit an instruction with integer immediate operand.
ASMJIT_API
Error
emit
(
uint32_t
code
,
int
o0
);
//! \overload
ASMJIT_API
Error
emit
(
uint32_t
code
,
uint64_t
o0
);
//! \overload
ASMJIT_API
Error
emit
(
uint32_t
code
,
const
Operand
&
o0
,
int
o1
);
//! \overload
ASMJIT_API
Error
emit
(
uint32_t
code
,
const
Operand
&
o0
,
uint64_t
o1
);
//! \overload
ASMJIT_API
Error
emit
(
uint32_t
code
,
const
Operand
&
o0
,
const
Operand
&
o1
,
int
o2
);
//! \overload
ASMJIT_API
Error
emit
(
uint32_t
code
,
const
Operand
&
o0
,
const
Operand
&
o1
,
uint64_t
o2
);
//! \overload
ASMJIT_API
Error
emit
(
uint32_t
code
,
const
Operand
&
o0
,
const
Operand
&
o1
,
const
Operand
&
o2
,
int
o3
);
//! \overload
ASMJIT_API
Error
emit
(
uint32_t
code
,
int64_t
o0
);
//! \overload
ASMJIT_API
Error
emit
(
uint32_t
code
,
const
Operand
&
o0
,
int64_t
o1
);
//! \overload
ASMJIT_API
Error
emit
(
uint32_t
code
,
const
Operand
&
o0
,
const
Operand
&
o1
,
int64_t
o2
);
//! \overload
ASMJIT_API
Error
emit
(
uint32_t
code
,
const
Operand
&
o0
,
const
Operand
&
o1
,
const
Operand
&
o2
,
u
int64_t
o3
);
ASMJIT_API
Error
emit
(
uint32_t
code
,
const
Operand
&
o0
,
const
Operand
&
o1
,
const
Operand
&
o2
,
int64_t
o3
);
//! Emit an instruction (virtual).
virtual
Error
_emit
(
uint32_t
code
,
const
Operand
&
o0
,
const
Operand
&
o1
,
const
Operand
&
o2
,
const
Operand
&
o3
)
=
0
;
...
...
libraries/asmjit/base/codegen.h
View file @
97ce448c
...
...
@@ -23,11 +23,11 @@ namespace asmjit {
//! \{
// ============================================================================
// [asmjit::
k
CodeGen]
// [asmjit::CodeGen
Features
]
// ============================================================================
//! Features of \ref CodeGen.
ASMJIT_ENUM
(
k
CodeGen
)
{
ASMJIT_ENUM
(
CodeGen
Features
)
{
//! Emit optimized code-alignment sequences (`Assembler` and `Compiler`).
//!
//! Default `true`.
...
...
@@ -80,11 +80,11 @@ ASMJIT_ENUM(kCodeGen) {
};
// ============================================================================
// [asmjit::
k
AlignMode]
// [asmjit::AlignMode]
// ============================================================================
//! Code aligning mode.
ASMJIT_ENUM
(
k
AlignMode
)
{
ASMJIT_ENUM
(
AlignMode
)
{
//! Align by emitting a sequence that can be executed (code).
kAlignCode
=
0
,
//! Align by emitting sequence that shouldn't be executed (data).
...
...
@@ -92,11 +92,11 @@ ASMJIT_ENUM(kAlignMode) {
};
// ============================================================================
// [asmjit::
k
RelocMode]
// [asmjit::RelocMode]
// ============================================================================
//! Relocation mode.
ASMJIT_ENUM
(
k
RelocMode
)
{
ASMJIT_ENUM
(
RelocMode
)
{
//! Relocate an absolute address to an absolute address.
kRelocAbsToAbs
=
0
,
//! Relocate a relative address to an absolute address.
...
...
libraries/asmjit/base/compiler.cpp
View file @
97ce448c
...
...
@@ -40,11 +40,11 @@ enum { kBaseCompilerDefaultLookAhead = 64 };
Compiler
::
Compiler
(
Runtime
*
runtime
)
:
CodeGen
(
runtime
),
_assembler
(
NULL
),
_nodeFlowId
(
0
),
_nodeFlags
(
0
),
_maxLookAhead
(
kBaseCompilerDefaultLookAhead
),
_targetVarMapping
(
NULL
),
_assembler
(
NULL
),
_firstNode
(
NULL
),
_lastNode
(
NULL
),
_cursor
(
NULL
),
...
...
@@ -482,7 +482,7 @@ VarData* Compiler::_newVd(uint32_t type, uint32_t size, uint32_t c, const char*
vd
->
_flags
=
0
;
vd
->
_priority
=
10
;
vd
->
_state
=
kVarState
Unused
;
vd
->
_state
=
kVarState
None
;
vd
->
_regIndex
=
kInvalidReg
;
vd
->
_isStack
=
false
;
vd
->
_isMemArg
=
false
;
...
...
libraries/asmjit/base/compiler.h
View file @
97ce448c
...
...
@@ -43,14 +43,14 @@ struct InstNode;
struct
JumpNode
;
// ============================================================================
// [asmjit::
k
ConstScope]
// [asmjit::ConstScope]
// ============================================================================
//! \addtogroup asmjit_base_compiler
//! \{
//! Scope of the constant.
ASMJIT_ENUM
(
k
ConstScope
)
{
ASMJIT_ENUM
(
ConstScope
)
{
//! Local constant, always embedded right after the current function.
kConstScopeLocal
=
0
,
//! Global constant, embedded at the end of the currently compiled code.
...
...
@@ -58,10 +58,10 @@ ASMJIT_ENUM(kConstScope) {
};
// ============================================================================
// [asmjit::
k
VarType]
// [asmjit::VarType]
// ============================================================================
ASMJIT_ENUM
(
k
VarType
)
{
ASMJIT_ENUM
(
VarType
)
{
//! Variable is 8-bit signed integer.
kVarTypeInt8
=
0
,
//! Variable is 8-bit unsigned integer.
...
...
@@ -101,13 +101,13 @@ ASMJIT_ENUM(kVarType) {
};
// ============================================================================
// [asmjit::
k
VarFlags]
// [asmjit::VarFlags]
// ============================================================================
//! \internal
//!
//! X86/X64 variable flags.
ASMJIT_ENUM
(
k
VarFlags
)
{
ASMJIT_ENUM
(
VarFlags
)
{
//! Variable contains single-precision floating-point(s).
kVarFlagSp
=
0x10
,
//! Variable contains double-precision floating-point(s).
...
...
@@ -117,11 +117,11 @@ ASMJIT_ENUM(kVarFlags) {
};
// ============================================================================
// [asmjit::
k
VarAttrFlags]
// [asmjit::VarAttrFlags]
// ============================================================================
//! Variable attribute flags.
ASMJIT_ENUM
(
k
VarAttrFlags
)
{
ASMJIT_ENUM
(
VarAttrFlags
)
{
//! Variable is accessed through register on input.
kVarAttrInReg
=
0x00000001
,
//! Variable is accessed through register on output.
...
...
@@ -188,13 +188,13 @@ ASMJIT_ENUM(kVarAttrFlags) {
};
// ============================================================================
// [asmjit::
k
VarHint]
// [asmjit::VarHint]
// ============================================================================
//! Variable hint (used by `Compiler)`.
//!
//! \sa Compiler.
ASMJIT_ENUM
(
k
VarHint
)
{
ASMJIT_ENUM
(
VarHint
)
{
//! Alloc variable.
kVarHintAlloc
=
0
,
//! Spill variable.
...
...
@@ -211,35 +211,29 @@ ASMJIT_ENUM(kVarHint) {
// [asmjit::kVarState]
// ============================================================================
// TODO: Rename `kVarState` or `VarState`.
//! State of variable.
//!
//! \note State of variable is used only during make process and it's not
//! visible to the developer.
//! \note Variable states are used only during register allocation.
ASMJIT_ENUM
(
kVarState
)
{
//! Variable is currently not used.
kVarStateUnused
=
0
,
//! Variable is in register.
//!
kVarStateNone
=
0
,
//! Variable is currently allocated in register.
kVarStateReg
=
1
,
//! Variable is in memory location or spilled.
//!
//! Variable was spilled from register to memory or variable is used for
//! memory only storage.
//! Variable is currently allocated in memory (or has been spilled).
kVarStateMem
=
2
};
// ============================================================================
// [asmjit::
k
FuncConv]
// [asmjit::FuncConv]
// ============================================================================
//! Function calling convention.
//!
//! For a platform specific calling conventions, see:
//! - `
k
X86FuncConv` - X86/X64 calling conventions.
ASMJIT_ENUM
(
k
FuncConv
)
{
//! - `X86FuncConv` - X86/X64 calling conventions.
ASMJIT_ENUM
(
FuncConv
)
{
//! Calling convention is invalid (can't be used).
kFuncConvNone
=
0
,
...
...
@@ -267,14 +261,14 @@ ASMJIT_ENUM(kFuncConv) {
};
// ============================================================================
// [asmjit::
k
FuncHint]
// [asmjit::FuncHint]
// ============================================================================
//! Function hints.
//!
//! For a platform specific calling conventions, see:
//! - `
k
X86FuncHint` - X86/X64 function hints.
ASMJIT_ENUM
(
k
FuncHint
)
{
//! - `X86FuncHint` - X86/X64 function hints.
ASMJIT_ENUM
(
FuncHint
)
{
//! Make a naked function (default true).
//!
//! Naked function is function without using standard prolog/epilog sequence).
...
...
@@ -325,14 +319,14 @@ ASMJIT_ENUM(kFuncHint) {
};
// ============================================================================
// [asmjit::
k
FuncFlags]
// [asmjit::FuncFlags]
// ============================================================================
//! Function flags.
//!
//! For a platform specific calling conventions, see:
//! - `
k
X86FuncFlags` - X86/X64 function flags.
ASMJIT_ENUM
(
k
FuncFlags
)
{
//! - `X86FuncFlags` - X86/X64 function flags.
ASMJIT_ENUM
(
FuncFlags
)
{
//! Whether the function is using naked (minimal) prolog / epilog.
kFuncFlagIsNaked
=
0x00000001
,
...
...
@@ -360,11 +354,11 @@ ASMJIT_ENUM(kFuncFlags) {
};
// ============================================================================
// [asmjit::
k
FuncDir]
// [asmjit::FuncDir]
// ============================================================================
//! Function arguments direction.
ASMJIT_ENUM
(
k
FuncDir
)
{
ASMJIT_ENUM
(
FuncDir
)
{
//! Arguments are passed left to right.
//!
//! This arguments direction is unusual in C, however it's used in Pascal.
...
...
@@ -377,11 +371,11 @@ ASMJIT_ENUM(kFuncDir) {
};
// ============================================================================
// [asmjit::
k
FuncArg]
// [asmjit::FuncArg
Index
]
// ============================================================================
//! Function argument (lo/hi)
specification
.
ASMJIT_ENUM
(
k
FuncArg
)
{
//! Function argument
index
(lo/hi).
ASMJIT_ENUM
(
FuncArg
Index
)
{
//! Maxumum number of function arguments supported by AsmJit.
kFuncArgCount
=
16
,
//! Extended maximum number of arguments (used internally).
...
...
@@ -401,11 +395,11 @@ ASMJIT_ENUM(kFuncArg) {
};
// ============================================================================
// [asmjit::
k
FuncRet]
// [asmjit::FuncRet]
// ============================================================================
//! Function return value (lo/hi) specification.
ASMJIT_ENUM
(
k
FuncRet
)
{
ASMJIT_ENUM
(
FuncRet
)
{
//! Index to the LO part of function return value.
kFuncRetLo
=
0
,
//! Index to the HI part of function return value.
...
...
@@ -416,17 +410,17 @@ ASMJIT_ENUM(kFuncRet) {
// [asmjit::kFuncStackInvalid]
// ============================================================================
enum
kFuncMisc
{
enum
{
//! Invalid stack offset in function or function parameter.
kFuncStackInvalid
=
-
1
};
// ============================================================================
// [asmjit::
k
NodeType]
// [asmjit::NodeType]
// ============================================================================
//! Type of node, see \ref Node.
ASMJIT_ENUM
(
k
NodeType
)
{
ASMJIT_ENUM
(
NodeType
)
{
//! Invalid node (internal, can't be used).
kNodeTypeNone
=
0
,
//! Node is an .align directive, see \ref AlignNode.
...
...
@@ -454,10 +448,10 @@ ASMJIT_ENUM(kNodeType) {
};
// ============================================================================
// [asmjit::
k
NodeFlags]
// [asmjit::NodeFlags]
// ============================================================================
ASMJIT_ENUM
(
k
NodeFlags
)
{
ASMJIT_ENUM
(
NodeFlags
)
{
//! Whether the node has been translated, thus contains only registers.
kNodeFlagIsTranslated
=
0x0001
,
...
...
@@ -558,6 +552,12 @@ struct Var : public Operand {
return
Var
(
*
this
);
}
//! Reset Var operand.
ASMJIT_INLINE
void
reset
()
{
_init_packed_op_sz_b0_b1_id
(
kOperandTypeVar
,
0
,
kInvalidReg
,
kInvalidReg
,
kInvalidValue
);
_init_packed_d2_d3
(
kInvalidValue
,
kInvalidValue
);
}
//! Get whether the variable has been initialized by `Compiler`.
ASMJIT_INLINE
bool
isInitialized
()
const
{
return
_vreg
.
id
!=
kInvalidValue
;
...
...
@@ -987,11 +987,11 @@ struct VarAttr {
//! Get whether `flag` is on.
ASMJIT_INLINE
bool
hasFlag
(
uint32_t
flag
)
{
return
(
_flags
&
flag
)
!=
0
;
}
//! Add `flags`.
ASMJIT_INLINE
void
add
Flags
(
uint32_t
flags
)
{
_flags
|=
flags
;
}
ASMJIT_INLINE
void
or
Flags
(
uint32_t
flags
)
{
_flags
|=
flags
;
}
//! Mask `flags`.
ASMJIT_INLINE
void
andFlags
(
uint32_t
flags
)
{
_flags
&=
flags
;
}
//! Clear `flags`.
ASMJIT_INLINE
void
del
Flags
(
uint32_t
flags
)
{
_flags
&=
~
flags
;
}
ASMJIT_INLINE
void
andNot
Flags
(
uint32_t
flags
)
{
_flags
&=
~
flags
;
}
//! Get how many times the variable is used by the instruction/node.
ASMJIT_INLINE
uint32_t
getVarCount
()
const
{
return
_varCount
;
}
...
...
@@ -1174,7 +1174,7 @@ struct DoubleType {};
#if !defined(ASMJIT_DOCGEN)
template
<
typename
T
>
struct
TypeId
{
enum
{
kId
=
static_cast
<
int
>
(
::
asmjit
::
kInvalidVar
)
};
// Left empty to report any type, which is not known to asmjit.
};
template
<
typename
T
>
...
...
@@ -1186,38 +1186,30 @@ struct TypeId<T*> {
template<> \
struct TypeId<_T_> { enum { kId = _Id_ }; }
ASMJIT_TYPE_ID
(
void
,
kInvalidVar
);
ASMJIT_TYPE_ID
(
Void
,
kInvalidVar
);
ASMJIT_TYPE_ID
(
int8_t
,
kVarTypeInt8
);
ASMJIT_TYPE_ID
(
Int8Type
,
kVarTypeInt8
);
ASMJIT_TYPE_ID
(
uint8_t
,
kVarTypeUInt8
);
ASMJIT_TYPE_ID
(
UInt8Type
,
kVarTypeUInt8
);
ASMJIT_TYPE_ID
(
int16_t
,
kVarTypeInt16
);
ASMJIT_TYPE_ID
(
Int16Type
,
kVarTypeInt16
);
ASMJIT_TYPE_ID
(
uint16_t
,
kVarTypeUInt8
);
ASMJIT_TYPE_ID
(
UInt16Type
,
kVarTypeUInt8
);
ASMJIT_TYPE_ID
(
int32_t
,
kVarTypeInt32
);
ASMJIT_TYPE_ID
(
Int32Type
,
kVarTypeUInt8
);
ASMJIT_TYPE_ID
(
uint32_t
,
kVarTypeUInt32
);
ASMJIT_TYPE_ID
(
UInt32Type
,
kVarTypeUInt8
);
ASMJIT_TYPE_ID
(
int64_t
,
kVarTypeInt64
);
ASMJIT_TYPE_ID
(
Int64Type
,
kVarTypeUInt8
);
ASMJIT_TYPE_ID
(
uint64_t
,
kVarTypeUInt64
);
ASMJIT_TYPE_ID
(
UInt64Type
,
kVarTypeUInt8
);
ASMJIT_TYPE_ID
(
float
,
kVarTypeFp32
);
ASMJIT_TYPE_ID
(
FloatType
,
kVarTypeFp32
);
ASMJIT_TYPE_ID
(
double
,
kVarTypeFp64
);
ASMJIT_TYPE_ID
(
DoubleType
,
kVarTypeFp64
);
ASMJIT_TYPE_ID
(
void
,
kInvalidVar
);
ASMJIT_TYPE_ID
(
char
,
IntTraits
<
char
>::
kIsSigned
?
kVarTypeInt8
:
kVarTypeUInt8
);
ASMJIT_TYPE_ID
(
signed
char
,
kVarTypeInt8
);
ASMJIT_TYPE_ID
(
unsigned
char
,
kVarTypeUInt8
);
ASMJIT_TYPE_ID
(
int16_t
,
kVarTypeInt16
);
ASMJIT_TYPE_ID
(
uint16_t
,
kVarTypeUInt16
);
ASMJIT_TYPE_ID
(
int32_t
,
kVarTypeInt32
);
ASMJIT_TYPE_ID
(
uint32_t
,
kVarTypeUInt32
);
ASMJIT_TYPE_ID
(
int64_t
,
kVarTypeInt64
);
ASMJIT_TYPE_ID
(
uint64_t
,
kVarTypeUInt64
);
ASMJIT_TYPE_ID
(
float
,
kVarTypeFp32
);
ASMJIT_TYPE_ID
(
double
,
kVarTypeFp64
);
ASMJIT_TYPE_ID
(
Void
,
kInvalidVar
);
ASMJIT_TYPE_ID
(
Int8Type
,
kVarTypeInt8
);
ASMJIT_TYPE_ID
(
UInt8Type
,
kVarTypeUInt8
);
ASMJIT_TYPE_ID
(
Int16Type
,
kVarTypeInt16
);
ASMJIT_TYPE_ID
(
UInt16Type
,
kVarTypeUInt16
);
ASMJIT_TYPE_ID
(
Int32Type
,
kVarTypeUInt32
);
ASMJIT_TYPE_ID
(
UInt32Type
,
kVarTypeUInt32
);
ASMJIT_TYPE_ID
(
Int64Type
,
kVarTypeUInt64
);
ASMJIT_TYPE_ID
(
UInt64Type
,
kVarTypeUInt64
);
ASMJIT_TYPE_ID
(
FloatType
,
kVarTypeFp32
);
ASMJIT_TYPE_ID
(
DoubleType
,
kVarTypeFp64
);
#endif // !ASMJIT_DOCGEN
// ============================================================================
...
...
@@ -1256,7 +1248,7 @@ struct FuncInOut {
union
{
struct
{
//! Variable type, see `
k
VarType`.
//! Variable type, see `VarType`.
uint8_t
_varType
;
//! Register index if argument / return value is a register.
uint8_t
_regIndex
;
...
...
@@ -1482,7 +1474,7 @@ struct FuncDecl {
// [Accessors - Calling Convention]
// --------------------------------------------------------------------------
//! Get function calling convention, see `
k
FuncConv`.
//! Get function calling convention, see `FuncConv`.
ASMJIT_INLINE
uint32_t
getConvention
()
const
{
return
_convention
;
}
//! Get whether the callee pops the stack.
...
...
@@ -1550,7 +1542,7 @@ struct FuncDecl {
uint8_t
_convention
;
//! Whether a callee pops stack.
uint8_t
_calleePopsStack
:
1
;
//! Direction for arguments passed on the stack, see `
k
FuncDir`.
//! Direction for arguments passed on the stack, see `FuncDir`.
uint8_t
_direction
:
1
;
//! Reserved #0 (alignment).
uint8_t
_reserved0
:
6
;
...
...
@@ -1636,7 +1628,7 @@ struct Node {
// [Accessors - Type and Flags]
// --------------------------------------------------------------------------
//! Get
type of nod
e, see `
k
NodeType`.
//! Get
node typ
e, see `NodeType`.
ASMJIT_INLINE
uint32_t
getType
()
const
{
return
_type
;
}
...
...
@@ -1646,24 +1638,29 @@ struct Node {
return
_flags
;
}
//! Set node flags to `flags`.
ASMJIT_INLINE
void
setFlags
(
uint32_t
flags
)
{
_flags
=
static_cast
<
uint16_t
>
(
flags
);
}
//! Get whether the instruction has flag `flag`.
ASMJIT_INLINE
bool
hasFlag
(
uint32_t
flag
)
const
{
return
(
static_cast
<
uint32_t
>
(
_flags
)
&
flag
)
!=
0
;
}
//! Set node flags to `flags`.
ASMJIT_INLINE
void
setFlags
(
uint32_t
flags
)
{
_flags
=
static_cast
<
uint16_t
>
(
flags
);
}
//! Add instruction `flags`.
ASMJIT_INLINE
void
add
Flags
(
uint32_t
flags
)
{
ASMJIT_INLINE
void
or
Flags
(
uint32_t
flags
)
{
_flags
|=
static_cast
<
uint16_t
>
(
flags
);
}
//! And instruction `flags`.
ASMJIT_INLINE
void
andFlags
(
uint32_t
flags
)
{
_flags
&=
static_cast
<
uint16_t
>
(
flags
);
}
//! Clear instruction `flags`.
ASMJIT_INLINE
void
del
Flags
(
uint32_t
flags
)
{
_flags
&=
static_cast
<
uint16_t
>
(
~
flags
);
ASMJIT_INLINE
void
andNot
Flags
(
uint32_t
flags
)
{
_flags
&=
~
static_cast
<
uint16_t
>
(
flags
);
}
//! Get whether the node has beed fetched.
...
...
@@ -1689,18 +1686,18 @@ struct Node {
return
hasFlag
(
kNodeFlagIsInformative
);
}
//! Whether the
instruction is
an unconditional jump.
//! Whether the
node is `InstNode`
an
d
unconditional jump.
ASMJIT_INLINE
bool
isJmp
()
const
{
return
hasFlag
(
kNodeFlagIsJmp
);
}
//! Whether the
instruction is a
conditional jump.
//! Whether the
node is `InstNode` and
conditional jump.
ASMJIT_INLINE
bool
isJcc
()
const
{
return
hasFlag
(
kNodeFlagIsJcc
);
}
//! Whether the
instruction is an un
conditional
or
conditional jump.
//! Whether the
node is `InstNode` and
conditional
/un
conditional jump.
ASMJIT_INLINE
bool
isJmpOrJcc
()
const
{
return
hasFlag
(
kNodeFlagIsJmp
|
kNodeFlagIsJcc
);
}
//! Whether the
instruction is a
return.
//! Whether the
node is `InstNode` and
return.
ASMJIT_INLINE
bool
isRet
()
const
{
return
hasFlag
(
kNodeFlagIsRet
);
}
//! Get whether the instruction is special.
//! Get whether the
node is `InstNode` and the
instruction is special.
ASMJIT_INLINE
bool
isSpecial
()
const
{
return
hasFlag
(
kNodeFlagIsSpecial
);
}
//! Get whether the instruction
accesses
FPU.
//! Get whether the
node is `InstNode` and the
instruction
uses x87-
FPU.
ASMJIT_INLINE
bool
isFp
()
const
{
return
hasFlag
(
kNodeFlagIsFp
);
}
// --------------------------------------------------------------------------
...
...
@@ -1785,7 +1782,7 @@ struct Node {
//! Next node.
Node
*
_next
;
//! Node type, see `
k
NodeType`.
//! Node type, see `NodeType`.
uint8_t
_type
;
//! Operands count (if the node has operands, otherwise zero).
uint8_t
_opCount
;
...
...
@@ -1863,7 +1860,7 @@ struct AlignNode : public Node {
// [Members]
// --------------------------------------------------------------------------
//! Alignment mode, see \ref
k
AlignMode.
//! Alignment mode, see \ref AlignMode.
uint32_t
_mode
;
//! Alignment offset in bytes.
uint32_t
_offset
;
...
...
@@ -1891,7 +1888,9 @@ struct EmbedNode : public Node {
// --------------------------------------------------------------------------
//! Create a new `EmbedNode` instance.
ASMJIT_INLINE
EmbedNode
(
Compiler
*
compiler
,
void
*
data
,
uint32_t
size
)
:
Node
(
compiler
,
kNodeTypeEmbed
)
{
ASMJIT_INLINE
EmbedNode
(
Compiler
*
compiler
,
void
*
data
,
uint32_t
size
)
:
Node
(
compiler
,
kNodeTypeEmbed
)
{
_size
=
size
;
if
(
size
<=
kInlineBufferSize
)
{
if
(
data
!=
NULL
)
...
...
@@ -1947,7 +1946,7 @@ struct CommentNode : public Node {
//! Create a new `CommentNode` instance.
ASMJIT_INLINE
CommentNode
(
Compiler
*
compiler
,
const
char
*
comment
)
:
Node
(
compiler
,
kNodeTypeComment
)
{
add
Flags
(
kNodeFlagIsInformative
);
or
Flags
(
kNodeFlagIsInformative
);
_comment
=
comment
;
}
...
...
@@ -1968,8 +1967,10 @@ struct HintNode : public Node {
// --------------------------------------------------------------------------
//! Create a new `HintNode` instance.
ASMJIT_INLINE
HintNode
(
Compiler
*
compiler
,
VarData
*
vd
,
uint32_t
hint
,
uint32_t
value
)
:
Node
(
compiler
,
kNodeTypeHint
)
{
addFlags
(
kNodeFlagIsInformative
);
ASMJIT_INLINE
HintNode
(
Compiler
*
compiler
,
VarData
*
vd
,
uint32_t
hint
,
uint32_t
value
)
:
Node
(
compiler
,
kNodeTypeHint
)
{
orFlags
(
kNodeFlagIsInformative
);
_vd
=
vd
;
_hint
=
hint
;
_value
=
value
;
...
...
@@ -2095,9 +2096,12 @@ struct InstNode : public Node {
// --------------------------------------------------------------------------
//! Create a new `InstNode` instance.
ASMJIT_INLINE
InstNode
(
Compiler
*
compiler
,
uint32_t
code
,
uint32_t
options
,
Operand
*
opList
,
uint32_t
opCount
)
:
Node
(
compiler
,
kNodeTypeInst
)
{
_code
=
static_cast
<
uint16_t
>
(
code
);
_options
=
static_cast
<
uint8_t
>
(
options
);
ASMJIT_INLINE
InstNode
(
Compiler
*
compiler
,
uint32_t
instId
,
uint32_t
instOptions
,
Operand
*
opList
,
uint32_t
opCount
)
:
Node
(
compiler
,
kNodeTypeInst
)
{
_instId
=
static_cast
<
uint16_t
>
(
instId
);
_reserved
=
0
;
_instOptions
=
instOptions
;
_opCount
=
static_cast
<
uint8_t
>
(
opCount
);
_opList
=
opList
;
...
...
@@ -2112,18 +2116,17 @@ struct InstNode : public Node {
// [Accessors]
// --------------------------------------------------------------------------
//! Get instruction
code
, see `
k
X86InstId`.
ASMJIT_INLINE
uint32_t
get
Code
()
const
{
return
_
code
;
//! Get instruction
ID
, see `X86InstId`.
ASMJIT_INLINE
uint32_t
get
InstId
()
const
{
return
_
instId
;
}
//! Set instruction
code
to `
code
`.
//! Set instruction
ID
to `
instId
`.
//!
//! Please do not modify instruction code if you are not know what you are
//! doing. Incorrect instruction code or operands can raise assertion() at
//! runtime.
ASMJIT_INLINE
void
setCode
(
uint32_t
code
)
{
_code
=
static_cast
<
uint16_t
>
(
code
);
//! Please do not modify instruction code if you don't know what are you
//! doing. Incorrect instruction code or operands can cause assertion failure.
ASMJIT_INLINE
void
setInstId
(
uint32_t
instId
)
{
_instId
=
static_cast
<
uint16_t
>
(
instId
);
}
//! Whether the instruction is an unconditional jump or whether the
...
...
@@ -2134,23 +2137,23 @@ struct InstNode : public Node {
//! Get emit options.
ASMJIT_INLINE
uint32_t
getOptions
()
const
{
return
_
o
ptions
;
return
_
instO
ptions
;
}
//! Set emit options.
ASMJIT_INLINE
void
setOptions
(
uint32_t
options
)
{
_
o
ptions
=
static_cast
<
uint8_t
>
(
options
)
;
_
instO
ptions
=
options
;
}
//! Add emit options.
ASMJIT_INLINE
void
addOptions
(
uint32_t
options
)
{
_
o
ptions
|=
static_cast
<
uint8_t
>
(
options
)
;
_
instO
ptions
|=
options
;
}
//! Mask emit options.
ASMJIT_INLINE
void
andOptions
(
uint32_t
options
)
{
_
o
ptions
&=
static_cast
<
uint8_t
>
(
options
)
;
_
instO
ptions
&=
options
;
}
//! Clear emit options.
ASMJIT_INLINE
void
delOptions
(
uint32_t
options
)
{
_
o
ptions
&=
static_cast
<
uint8_t
>
(
~
options
)
;
_
instO
ptions
&=
~
options
;
}
//! Get operands list.
...
...
@@ -2219,12 +2222,14 @@ _Update:
// [Members]
// --------------------------------------------------------------------------
//! Instruction code, see `kInstId`.
uint16_t
_code
;
//! Instruction options, see `kInstOptions`.
uint8_t
_options
;
//! Instruction ID, see `InstId`.
uint16_t
_instId
;
//! \internal
uint8_t
_memOpIndex
;
//! \internal
uint8_t
_reserved
;
//! Instruction options, see `InstOptions`.
uint32_t
_instOptions
;
//! Operands list.
Operand
*
_opList
;
...
...
@@ -2468,7 +2473,7 @@ struct FuncNode : public Node {
//! The "Red Zone" size - count of bytes which might be accessed without
//! adjusting the stack pointer.
uint16_t
_redZoneSize
;
//! Spill zone size (
zone
used by WIN64ABI).
//! Spill zone size (used by WIN64
ABI).
uint16_t
_spillZoneSize
;
//! Stack size needed for function arguments.
...
...
@@ -2954,15 +2959,51 @@ struct ASMJIT_VCLASS Compiler : public CodeGen {
ASMJIT_API
void
alloc
(
Var
&
var
);
//! Alloc variable `var` using `regIndex` as a register index.
ASMJIT_API
void
alloc
(
Var
&
var
,
uint32_t
regIndex
);
//! Alloc variable `var` using `reg` as a
demanded
register.
//! Alloc variable `var` using `reg` as a register
operand
.
ASMJIT_API
void
alloc
(
Var
&
var
,
const
Reg
&
reg
);
//! Spill variable `var`.
ASMJIT_API
void
spill
(
Var
&
var
);
//! Save variable `var` if
modified
.
//! Save variable `var` if
the status is `modified` at this point
.
ASMJIT_API
void
save
(
Var
&
var
);
//! Unuse variable `var`.
ASMJIT_API
void
unuse
(
Var
&
var
);
//! Alloc variable `var` (if initialized), but only if it's initialized.
ASMJIT_INLINE
void
allocUnsafe
(
Var
&
var
)
{
if
(
var
.
isInitialized
())
alloc
(
var
);
}
//! Alloc variable `var` (if initialized) using `regIndex` as a register index
ASMJIT_INLINE
void
allocUnsafe
(
Var
&
var
,
uint32_t
regIndex
)
{
if
(
var
.
isInitialized
())
alloc
(
var
,
regIndex
);
}
//! Alloc variable `var` (if initialized) using `reg` as a register operand.
ASMJIT_INLINE
void
allocUnsafe
(
Var
&
var
,
const
Reg
&
reg
)
{
if
(
var
.
isInitialized
())
alloc
(
var
,
reg
);
}
//! Spill variable `var` (if initialized).
ASMJIT_INLINE
void
spillUnsafe
(
Var
&
var
)
{
if
(
var
.
isInitialized
())
spill
(
var
);
}
//! Save variable `var` (if initialized) if the status is `modified` at this point.
ASMJIT_INLINE
void
saveUnsafe
(
Var
&
var
)
{
if
(
var
.
isInitialized
())
save
(
var
);
}
//! Unuse variable `var` (if initialized).
ASMJIT_INLINE
void
unuseUnsafe
(
Var
&
var
)
{
if
(
var
.
isInitialized
())
unuse
(
var
);
}
//! Get priority of variable `var`.
ASMJIT_API
uint32_t
getPriority
(
Var
&
var
)
const
;
//! Set priority of variable `var` to `priority`.
...
...
@@ -3035,7 +3076,7 @@ struct ASMJIT_VCLASS Compiler : public CodeGen {
//! registers.
uint32_t
_maxLookAhead
;
//! Variable mapping (translates incoming
k
VarType into target).
//! Variable mapping (translates incoming VarType into target).
const
uint8_t
*
_targetVarMapping
;
//! First node.
...
...
libraries/asmjit/base/constpool.cpp
View file @
97ce448c
...
...
@@ -162,19 +162,6 @@ void ConstPool::reset() {
// [asmjit::ConstPool - Ops]
// ============================================================================
static
ASMJIT_INLINE
size_t
ConstPool_getGapIndex
(
size_t
size
)
{
if
(
size
<=
1
)
return
ConstPool
::
kIndex1
;
else
if
(
size
<=
3
)
return
ConstPool
::
kIndex2
;
else
if
(
size
<=
7
)
return
ConstPool
::
kIndex4
;
else
if
(
size
<=
15
)
return
ConstPool
::
kIndex8
;
else
return
ConstPool
::
kIndex16
;
}
static
ASMJIT_INLINE
ConstPoolGap
*
ConstPool_allocGap
(
ConstPool
*
self
)
{
ConstPoolGap
*
gap
=
self
->
_gapPool
;
if
(
gap
==
NULL
)
...
...
@@ -396,7 +383,7 @@ UNIT(base_constpool) {
EXPECT
(
prevOffset
+
8
==
curOffset
,
"pool.add() - Returned incorrect curOffset."
);
EXPECT
(
pool
.
getSize
()
==
(
i
+
1
)
*
8
,
"pool.getSize() - Report
s
incorrect size."
);
"pool.getSize() - Report
ed
incorrect size."
);
prevOffset
=
curOffset
;
}
...
...
@@ -481,7 +468,6 @@ UNIT(base_constpool) {
INFO
(
"Checking pool alignment when combined constants are added."
);
{
uint8_t
bytes
[
32
]
=
{
0
};
uint64_t
c
=
0
;
size_t
offset
;
pool
.
add
(
bytes
,
1
,
offset
);
...
...
libraries/asmjit/base/constpool.h
View file @
97ce448c
...
...
@@ -128,9 +128,12 @@ struct ConstPoolTree {
if
(
link
!=
NULL
)
{
ASMJIT_ASSERT
(
top
!=
kHeightLimit
);
stack
[
top
++
]
=
node
;
node
=
link
;
continue
;
}
_Visit:
visitor
.
visit
(
node
);
link
=
node
->
_link
[
1
];
...
...
@@ -143,6 +146,7 @@ struct ConstPoolTree {
break
;
node
=
stack
[
--
top
];
goto
_Visit
;
}
}
...
...
libraries/asmjit/base/context.cpp
View file @
97ce448c
...
...
@@ -26,8 +26,8 @@ namespace asmjit {
Context
::
Context
(
Compiler
*
compiler
)
:
_compiler
(
compiler
),
_
varMapToVaListOffset
(
0
),
_
baseZone
(
8192
-
kZoneOverhead
)
{
_
baseZone
(
8192
-
kZoneOverhead
),
_
varMapToVaListOffset
(
0
)
{
Context
::
reset
();
}
...
...
@@ -217,7 +217,7 @@ Error Context::resolveCellOffsets() {
// Vars - Allocated according to alignment/width.
while
(
varCell
!=
NULL
)
{
uint32_t
size
=
varCell
->
getSize
();
uint32_t
offset
;
uint32_t
offset
=
0
;
switch
(
size
)
{
case
1
:
offset
=
pos1
;
pos1
+=
1
;
break
;
...
...
@@ -234,13 +234,13 @@ Error Context::resolveCellOffsets() {
varCell
=
varCell
->
_next
;
}
// Stack - Allocated according to alignment
and
width.
// Stack - Allocated according to alignment
/
width.
while
(
stackCell
!=
NULL
)
{
uint32_t
size
=
stackCell
->
getSize
();
uint32_t
alignment
=
stackCell
->
getAlignment
();
uint32_t
offset
;
// Try to fill the gap between variables
/
stack first.
// Try to fill the gap between variables
/
stack first.
if
(
size
<=
gapSize
&&
alignment
<=
gapAlignment
)
{
offset
=
gapPos
;
...
...
libraries/asmjit/base/cpuinfo.cpp
View file @
97ce448c
...
...
@@ -10,11 +10,11 @@
// [Dependencies - AsmJit]
#include "../base/cpuinfo.h"
#if defined(ASMJIT_
HOST
_X86) || defined(ASMJIT_
HOST
_X64)
#if defined(ASMJIT_
ARCH
_X86) || defined(ASMJIT_
ARCH
_X64)
#include "../x86/x86cpuinfo.h"
#else
// ?
#endif
// ASMJIT_HOST || ASMJIT_HOST_X64
#endif
// [Dependencies - Posix]
#if defined(ASMJIT_OS_POSIX)
...
...
@@ -54,7 +54,7 @@ uint32_t CpuInfo::detectHwThreadsCount() {
// [asmjit::CpuInfo - GetHost]
// ============================================================================
#if defined(ASMJIT_
HOST
_X86) || defined(ASMJIT_
HOST
_X64)
#if defined(ASMJIT_
ARCH
_X86) || defined(ASMJIT_
ARCH
_X64)
struct
AutoX86CpuInfo
:
public
X86CpuInfo
{
ASMJIT_INLINE
AutoX86CpuInfo
()
:
X86CpuInfo
()
{
X86CpuUtil
::
detect
(
this
);
...
...
@@ -62,14 +62,14 @@ struct AutoX86CpuInfo : public X86CpuInfo {
};
#else
#error "AsmJit - Unsupported CPU."
#endif
// ASMJIT_HOST || ASMJIT_HOST_X64
#endif
const
CpuInfo
*
CpuInfo
::
getHost
()
{
#if defined(ASMJIT_
HOST
_X86) || defined(ASMJIT_
HOST
_X64)
#if defined(ASMJIT_
ARCH
_X86) || defined(ASMJIT_
ARCH
_X64)
static
AutoX86CpuInfo
cpuInfo
;
#else
#error "AsmJit - Unsupported CPU."
#endif
// ASMJIT_HOST || ASMJIT_HOST_X64
#endif
return
&
cpuInfo
;
}
...
...
libraries/asmjit/base/cpuinfo.h
View file @
97ce448c
...
...
@@ -20,7 +20,7 @@ namespace asmjit {
//! \{
// ============================================================================
// [asmjit::
k
CpuVendor]
// [asmjit::CpuVendor]
// ============================================================================
//! Cpu vendor ID.
...
...
@@ -30,7 +30,7 @@ namespace asmjit {
//! calls. Some manufacturers changed their vendor strings and AsmJit is aware
//! of that - it checks multiple combinations and decides which vendor ID should
//! be used.
ASMJIT_ENUM
(
k
CpuVendor
)
{
ASMJIT_ENUM
(
CpuVendor
)
{
//! No/Unknown vendor.
kCpuVendorNone
=
0
,
...
...
@@ -59,7 +59,7 @@ struct CpuInfo {
// [Construction / Destruction]
// --------------------------------------------------------------------------
ASMJIT_INLINE
CpuInfo
(
uint32_t
size
=
sizeof
(
CpuInfo
)
)
:
_size
(
size
)
{}
ASMJIT_INLINE
CpuInfo
(
uint32_t
size
)
:
_size
(
size
)
{}
// --------------------------------------------------------------------------
// [Accessors]
...
...
@@ -120,7 +120,7 @@ struct CpuInfo {
//! Cpu long vendor string (brand).
char
_brandString
[
64
];
//! Cpu vendor id, see
`asmjit::k
CpuVendor
`
.
//! Cpu vendor id, see
\ref
CpuVendor.
uint32_t
_vendorId
;
//! Cpu family ID.
uint32_t
_family
;
...
...
libraries/asmjit/base/cputicks.cpp
View file @
97ce448c
...
...
@@ -24,7 +24,7 @@
// [Dependencies - Windows]
#if defined(ASMJIT_OS_WINDOWS)
// `_InterlockedCompareExchange` is only available as intrinsic (MS Compiler).
# if defined(_MSC_VER)
# if defined(_MSC_VER)
&& _MSC_VER >= 1400
# include <intrin.h>
# pragma intrinsic(_InterlockedCompareExchange)
# else
...
...
libraries/asmjit/base/error.cpp
View file @
97ce448c
...
...
@@ -64,7 +64,9 @@ static const char* findPackedString(const char* p, uint32_t id, uint32_t maxId)
while
(
i
<
id
)
{
while
(
p
[
0
])
p
++
;
p
++
;
i
++
;
}
return
p
;
...
...
libraries/asmjit/base/error.h
View file @
97ce448c
...
...
@@ -8,23 +8,23 @@
#ifndef _ASMJIT_BASE_ERROR_H
#define _ASMJIT_BASE_ERROR_H
// [Api-Begin]
#include "../apibegin.h"
// [Dependencies - AsmJit]
#include "../base/globals.h"
// [Api-Begin]
#include "../apibegin.h"
namespace
asmjit
{
//! \addtogroup asmjit_base_general
//! \{
// ============================================================================
// [asmjit::
k
Error]
// [asmjit::Error
Code
]
// ============================================================================
//! AsmJit error codes.
ASMJIT_ENUM
(
k
Error
)
{
ASMJIT_ENUM
(
Error
Code
)
{
//! No error (success).
//!
//! This is default state and state you want.
...
...
@@ -188,7 +188,7 @@ struct ASMJIT_VCLASS ErrorHandler {
//! Error utilities.
struct
ErrorUtil
{
#if !defined(ASMJIT_DISABLE_NAMES)
//! Get printable version of AsmJit `
k
Error` code.
//! Get
a
printable version of AsmJit `Error` code.
static
ASMJIT_API
const
char
*
asString
(
Error
code
);
#endif // ASMJIT_DISABLE_NAMES
};
...
...
libraries/asmjit/base/globals.h
View file @
97ce448c
...
...
@@ -34,7 +34,7 @@ typedef uint64_t Ptr;
typedef
int64_t
SignedPtr
;
// ============================================================================
// [asmjit::
k
Globals]
// [asmjit::Global
Def
s]
// ============================================================================
//! Invalid index
...
...
@@ -48,7 +48,7 @@ static const size_t kInvalidIndex = ~static_cast<size_t>(0);
static
const
Ptr
kNoBaseAddress
=
static_cast
<
Ptr
>
(
static_cast
<
SignedPtr
>
(
-
1
));
//! Global constants.
ASMJIT_ENUM
(
k
Globals
)
{
ASMJIT_ENUM
(
Global
Def
s
)
{
//! Invalid value or operand id.
kInvalidValue
=
0xFFFFFFFF
,
...
...
@@ -74,11 +74,11 @@ ASMJIT_ENUM(kGlobals) {
};
// ============================================================================
// [asmjit::
k
Arch]
// [asmjit::Arch
Id
]
// ============================================================================
//!
A
rchitecture.
ASMJIT_ENUM
(
k
Arch
)
{
//!
CPU a
rchitecture
identifier
.
ASMJIT_ENUM
(
Arch
Id
)
{
//! No/Unknown architecture.
kArchNone
=
0
,
...
...
@@ -90,17 +90,17 @@ ASMJIT_ENUM(kArch) {
//! Arm architecture.
kArchArm
=
4
,
#if defined(ASMJIT_
HOST
_X86)
#if defined(ASMJIT_
ARCH
_X86)
kArchHost
=
kArchX86
,
#endif // ASMJIT_
HOST
_X86
#endif // ASMJIT_
ARCH
_X86
#if defined(ASMJIT_
HOST
_X64)
#if defined(ASMJIT_
ARCH
_X64)
kArchHost
=
kArchX64
,
#endif // ASMJIT_
HOST
_X64
#endif // ASMJIT_
ARCH
_X64
#if defined(ASMJIT_
HOST
_ARM)
#if defined(ASMJIT_
ARCH
_ARM)
kArchHost
=
kArchArm
,
#endif // ASMJIT_
HOST
_ARM
#endif // ASMJIT_
ARCH
_ARM
//! Whether the host is 64-bit.
kArchHost64Bit
=
sizeof
(
intptr_t
)
>=
8
...
...
libraries/asmjit/base/intutil.h
View file @
97ce448c
...
...
@@ -11,8 +11,9 @@
// [Dependencies - AsmJit]
#include "../base/globals.h"
#if defined(_MSC_VER)
#pragma intrinsic(_BitScanForward)
#if defined(_MSC_VER) && _MSC_VER >= 1400
# include <intrin.h>
# pragma intrinsic(_BitScanForward)
#endif // ASMJIT_OS_WINDOWS
// [Api-Begin]
...
...
@@ -43,6 +44,31 @@ struct IntTraits {
};
};
// \internal
template
<
size_t
Size
,
int
IsSigned
>
struct
AsInt_
{
typedef
int64_t
Int
;
};
template
<
>
struct
AsInt_
<
1
,
0
>
{
typedef
int
Int
;
};
template
<
>
struct
AsInt_
<
1
,
1
>
{
typedef
int
Int
;
};
template
<
>
struct
AsInt_
<
2
,
0
>
{
typedef
int
Int
;
};
template
<
>
struct
AsInt_
<
2
,
1
>
{
typedef
int
Int
;
};
template
<
>
struct
AsInt_
<
4
,
1
>
{
typedef
int
Int
;
};
// \internal
//
// Map an integer `T` to an `int` or `int64_t`, depending on the type. Used
// internally by AsmJit to dispatch an argument of arbitrary integer type into
// a function that accepts either `int` or `int64_t`.
template
<
typename
T
>
struct
AsInt
{
typedef
typename
AsInt_
<
sizeof
(
T
),
IntTraits
<
T
>::
kIsSigned
>::
Int
Int
;
};
template
<
typename
T
>
ASMJIT_INLINE
typename
AsInt
<
T
>::
Int
asInt
(
T
value
)
{
return
static_cast
<
typename
AsInt
<
T
>::
Int
>
(
value
);
}
// ============================================================================
// [asmjit::IntUtil]
// ============================================================================
...
...
@@ -82,29 +108,29 @@ struct IntUtil {
//! Pack two 8-bit integer and one 16-bit integer into a 32-bit integer as it
//! is an array of `{u0,u1,w2}`.
static
ASMJIT_INLINE
uint32_t
pack32_2x8_1x16
(
uint32_t
u0
,
uint32_t
u1
,
uint32_t
w2
)
{
#if defined(ASMJIT_
HOST
_LE)
#if defined(ASMJIT_
ARCH
_LE)
return
u0
+
(
u1
<<
8
)
+
(
w2
<<
16
);
#else
return
(
u0
<<
24
)
+
(
u1
<<
16
)
+
(
w2
);
#endif
// ASMJIT_HOST
#endif
}
//! Pack four 8-bit integer into a 32-bit integer as it is an array of `{u0,u1,u2,u3}`.
static
ASMJIT_INLINE
uint32_t
pack32_4x8
(
uint32_t
u0
,
uint32_t
u1
,
uint32_t
u2
,
uint32_t
u3
)
{
#if defined(ASMJIT_
HOST
_LE)
#if defined(ASMJIT_
ARCH
_LE)
return
u0
+
(
u1
<<
8
)
+
(
u2
<<
16
)
+
(
u3
<<
24
);
#else
return
(
u0
<<
24
)
+
(
u1
<<
16
)
+
(
u2
<<
8
)
+
u3
;
#endif
// ASMJIT_HOST
#endif
}
//! Pack two 32-bit integer into a 64-bit integer as it is an array of `{u0,u1}`.
static
ASMJIT_INLINE
uint64_t
pack64_2x32
(
uint32_t
u0
,
uint32_t
u1
)
{
#if defined(ASMJIT_
HOST
_LE)
#if defined(ASMJIT_
ARCH
_LE)
return
(
static_cast
<
uint64_t
>
(
u1
)
<<
32
)
+
u0
;
#else
return
(
static_cast
<
uint64_t
>
(
u0
)
<<
32
)
+
u1
;
#endif
// ASMJIT_HOST
#endif
}
// --------------------------------------------------------------------------
...
...
@@ -336,7 +362,7 @@ struct IntUtil {
//! Find a first bit in `mask`.
static
ASMJIT_INLINE
uint32_t
findFirstBit
(
uint32_t
mask
)
{
#if defined(_MSC_VER)
#if defined(_MSC_VER)
&& _MSC_VER >= 1400
DWORD
i
;
if
(
_BitScanForward
(
&
i
,
mask
))
{
ASMJIT_ASSERT
(
findFirstBitSlow
(
mask
)
==
i
);
...
...
@@ -566,6 +592,26 @@ union UInt64 {
return
*
this
;
}
// --------------------------------------------------------------------------
// [AndNot]
// --------------------------------------------------------------------------
ASMJIT_INLINE
UInt64
&
andNot
(
uint64_t
val
)
{
u64
&=
~
val
;
return
*
this
;
}
ASMJIT_INLINE
UInt64
&
andNot
(
const
UInt64
&
val
)
{
if
(
kArchHost64Bit
)
{
u64
&=
~
val
.
u64
;
}
else
{
u32
[
0
]
&=
~
val
.
u32
[
0
];
u32
[
1
]
&=
~
val
.
u32
[
1
];
}
return
*
this
;
}
// --------------------------------------------------------------------------
// [Or]
// --------------------------------------------------------------------------
...
...
@@ -606,26 +652,6 @@ union UInt64 {
return
*
this
;
}
// --------------------------------------------------------------------------
// [Del]
// --------------------------------------------------------------------------
ASMJIT_INLINE
UInt64
&
del
(
uint64_t
val
)
{
u64
&=
~
val
;
return
*
this
;
}
ASMJIT_INLINE
UInt64
&
del
(
const
UInt64
&
val
)
{
if
(
kArchHost64Bit
)
{
u64
&=
~
val
.
u64
;
}
else
{
u32
[
0
]
&=
~
val
.
u32
[
0
];
u32
[
1
]
&=
~
val
.
u32
[
1
];
}
return
*
this
;
}
// --------------------------------------------------------------------------
// [Eq]
// --------------------------------------------------------------------------
...
...
@@ -694,11 +720,11 @@ union UInt64 {
uint8_t
u8
[
8
];
struct
{
#if defined(ASMJIT_
HOST
_LE)
#if defined(ASMJIT_
ARCH
_LE)
uint32_t
lo
,
hi
;
#else
uint32_t
hi
,
lo
;
#endif // ASMJIT_
HOST
_LE
#endif // ASMJIT_
ARCH
_LE
};
};
...
...
libraries/asmjit/base/logger.cpp
View file @
97ce448c
...
...
@@ -45,9 +45,12 @@ void Logger::logFormat(uint32_t style, const char* fmt, ...) {
va_list
ap
;
va_start
(
ap
,
fmt
);
len
=
vsnprintf
(
buf
,
1023
,
fmt
,
ap
);
len
=
vsnprintf
(
buf
,
sizeof
(
buf
)
,
fmt
,
ap
);
va_end
(
ap
);
if
(
len
>=
sizeof
(
buf
))
len
=
sizeof
(
buf
)
-
1
;
logString
(
style
,
buf
,
len
);
}
...
...
@@ -120,15 +123,6 @@ FileLogger::FileLogger(FILE* stream) : _stream(NULL) {
FileLogger
::~
FileLogger
()
{}
// ============================================================================
// [asmjit::FileLogger - Accessors]
// ============================================================================
//! Set file stream.
void
FileLogger
::
setStream
(
FILE
*
stream
)
{
_stream
=
stream
;
}
// ============================================================================
// [asmjit::FileLogger - Logging]
// ============================================================================
...
...
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