asmjit 0.2.0 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/Rakefile +5 -3
- data/asmjit.gemspec +1 -3
- data/ext/asmjit/asmjit/.editorconfig +10 -0
- data/ext/asmjit/asmjit/.github/FUNDING.yml +1 -0
- data/ext/asmjit/asmjit/.github/workflows/build-config.json +47 -0
- data/ext/asmjit/asmjit/.github/workflows/build.yml +156 -0
- data/ext/asmjit/asmjit/.gitignore +6 -0
- data/ext/asmjit/asmjit/CMakeLists.txt +611 -0
- data/ext/asmjit/asmjit/LICENSE.md +17 -0
- data/ext/asmjit/asmjit/README.md +69 -0
- data/ext/asmjit/asmjit/src/asmjit/a64.h +62 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64archtraits_p.h +81 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64assembler.cpp +5115 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64assembler.h +72 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64builder.cpp +51 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64builder.h +57 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64compiler.cpp +60 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64compiler.h +247 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64emithelper.cpp +464 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64emithelper_p.h +50 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64emitter.h +1228 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64formatter.cpp +298 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64formatter_p.h +59 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64func.cpp +189 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64func_p.h +33 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64globals.h +1894 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64instapi.cpp +278 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64instapi_p.h +41 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64instdb.cpp +1957 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64instdb.h +74 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64instdb_p.h +876 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64operand.cpp +85 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64operand.h +312 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64rapass.cpp +852 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64rapass_p.h +105 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/a64utils.h +179 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/armformatter.cpp +143 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/armformatter_p.h +44 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/armglobals.h +21 -0
- data/ext/asmjit/asmjit/src/asmjit/arm/armoperand.h +621 -0
- data/ext/asmjit/asmjit/src/asmjit/arm.h +62 -0
- data/ext/asmjit/asmjit/src/asmjit/asmjit-scope-begin.h +17 -0
- data/ext/asmjit/asmjit/src/asmjit/asmjit-scope-end.h +9 -0
- data/ext/asmjit/asmjit/src/asmjit/asmjit.h +33 -0
- data/ext/asmjit/asmjit/src/asmjit/core/api-build_p.h +55 -0
- data/ext/asmjit/asmjit/src/asmjit/core/api-config.h +613 -0
- data/ext/asmjit/asmjit/src/asmjit/core/archcommons.h +229 -0
- data/ext/asmjit/asmjit/src/asmjit/core/archtraits.cpp +160 -0
- data/ext/asmjit/asmjit/src/asmjit/core/archtraits.h +290 -0
- data/ext/asmjit/asmjit/src/asmjit/core/assembler.cpp +406 -0
- data/ext/asmjit/asmjit/src/asmjit/core/assembler.h +129 -0
- data/ext/asmjit/asmjit/src/asmjit/core/builder.cpp +889 -0
- data/ext/asmjit/asmjit/src/asmjit/core/builder.h +1391 -0
- data/ext/asmjit/asmjit/src/asmjit/core/codebuffer.h +113 -0
- data/ext/asmjit/asmjit/src/asmjit/core/codeholder.cpp +1149 -0
- data/ext/asmjit/asmjit/src/asmjit/core/codeholder.h +1035 -0
- data/ext/asmjit/asmjit/src/asmjit/core/codewriter.cpp +175 -0
- data/ext/asmjit/asmjit/src/asmjit/core/codewriter_p.h +179 -0
- data/ext/asmjit/asmjit/src/asmjit/core/compiler.cpp +582 -0
- data/ext/asmjit/asmjit/src/asmjit/core/compiler.h +737 -0
- data/ext/asmjit/asmjit/src/asmjit/core/compilerdefs.h +173 -0
- data/ext/asmjit/asmjit/src/asmjit/core/constpool.cpp +363 -0
- data/ext/asmjit/asmjit/src/asmjit/core/constpool.h +250 -0
- data/ext/asmjit/asmjit/src/asmjit/core/cpuinfo.cpp +1162 -0
- data/ext/asmjit/asmjit/src/asmjit/core/cpuinfo.h +813 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emithelper.cpp +323 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emithelper_p.h +58 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emitter.cpp +333 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emitter.h +741 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emitterutils.cpp +129 -0
- data/ext/asmjit/asmjit/src/asmjit/core/emitterutils_p.h +89 -0
- data/ext/asmjit/asmjit/src/asmjit/core/environment.cpp +46 -0
- data/ext/asmjit/asmjit/src/asmjit/core/environment.h +508 -0
- data/ext/asmjit/asmjit/src/asmjit/core/errorhandler.cpp +14 -0
- data/ext/asmjit/asmjit/src/asmjit/core/errorhandler.h +228 -0
- data/ext/asmjit/asmjit/src/asmjit/core/formatter.cpp +584 -0
- data/ext/asmjit/asmjit/src/asmjit/core/formatter.h +247 -0
- data/ext/asmjit/asmjit/src/asmjit/core/formatter_p.h +34 -0
- data/ext/asmjit/asmjit/src/asmjit/core/func.cpp +286 -0
- data/ext/asmjit/asmjit/src/asmjit/core/func.h +1445 -0
- data/ext/asmjit/asmjit/src/asmjit/core/funcargscontext.cpp +293 -0
- data/ext/asmjit/asmjit/src/asmjit/core/funcargscontext_p.h +199 -0
- data/ext/asmjit/asmjit/src/asmjit/core/globals.cpp +133 -0
- data/ext/asmjit/asmjit/src/asmjit/core/globals.h +393 -0
- data/ext/asmjit/asmjit/src/asmjit/core/inst.cpp +113 -0
- data/ext/asmjit/asmjit/src/asmjit/core/inst.h +772 -0
- data/ext/asmjit/asmjit/src/asmjit/core/jitallocator.cpp +1242 -0
- data/ext/asmjit/asmjit/src/asmjit/core/jitallocator.h +261 -0
- data/ext/asmjit/asmjit/src/asmjit/core/jitruntime.cpp +80 -0
- data/ext/asmjit/asmjit/src/asmjit/core/jitruntime.h +89 -0
- data/ext/asmjit/asmjit/src/asmjit/core/logger.cpp +69 -0
- data/ext/asmjit/asmjit/src/asmjit/core/logger.h +198 -0
- data/ext/asmjit/asmjit/src/asmjit/core/misc_p.h +33 -0
- data/ext/asmjit/asmjit/src/asmjit/core/operand.cpp +132 -0
- data/ext/asmjit/asmjit/src/asmjit/core/operand.h +1611 -0
- data/ext/asmjit/asmjit/src/asmjit/core/osutils.cpp +84 -0
- data/ext/asmjit/asmjit/src/asmjit/core/osutils.h +61 -0
- data/ext/asmjit/asmjit/src/asmjit/core/osutils_p.h +68 -0
- data/ext/asmjit/asmjit/src/asmjit/core/raassignment_p.h +418 -0
- data/ext/asmjit/asmjit/src/asmjit/core/rabuilders_p.h +612 -0
- data/ext/asmjit/asmjit/src/asmjit/core/radefs_p.h +1204 -0
- data/ext/asmjit/asmjit/src/asmjit/core/ralocal.cpp +1166 -0
- data/ext/asmjit/asmjit/src/asmjit/core/ralocal_p.h +254 -0
- data/ext/asmjit/asmjit/src/asmjit/core/rapass.cpp +1969 -0
- data/ext/asmjit/asmjit/src/asmjit/core/rapass_p.h +1183 -0
- data/ext/asmjit/asmjit/src/asmjit/core/rastack.cpp +184 -0
- data/ext/asmjit/asmjit/src/asmjit/core/rastack_p.h +171 -0
- data/ext/asmjit/asmjit/src/asmjit/core/string.cpp +559 -0
- data/ext/asmjit/asmjit/src/asmjit/core/string.h +372 -0
- data/ext/asmjit/asmjit/src/asmjit/core/support.cpp +494 -0
- data/ext/asmjit/asmjit/src/asmjit/core/support.h +1773 -0
- data/ext/asmjit/asmjit/src/asmjit/core/target.cpp +14 -0
- data/ext/asmjit/asmjit/src/asmjit/core/target.h +53 -0
- data/ext/asmjit/asmjit/src/asmjit/core/type.cpp +74 -0
- data/ext/asmjit/asmjit/src/asmjit/core/type.h +419 -0
- data/ext/asmjit/asmjit/src/asmjit/core/virtmem.cpp +722 -0
- data/ext/asmjit/asmjit/src/asmjit/core/virtmem.h +242 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zone.cpp +353 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zone.h +615 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonehash.cpp +309 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonehash.h +186 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonelist.cpp +163 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonelist.h +209 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonestack.cpp +176 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonestack.h +239 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonestring.h +120 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonetree.cpp +99 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonetree.h +380 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonevector.cpp +356 -0
- data/ext/asmjit/asmjit/src/asmjit/core/zonevector.h +690 -0
- data/ext/asmjit/asmjit/src/asmjit/core.h +1861 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86archtraits_p.h +148 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86assembler.cpp +5110 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86assembler.h +685 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86builder.cpp +52 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86builder.h +351 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86compiler.cpp +61 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86compiler.h +721 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86emithelper.cpp +619 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86emithelper_p.h +60 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86emitter.h +4315 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86formatter.cpp +944 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86formatter_p.h +58 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86func.cpp +503 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86func_p.h +33 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86globals.h +2169 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86instapi.cpp +1732 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86instapi_p.h +41 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86instdb.cpp +4427 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86instdb.h +563 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86instdb_p.h +311 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86opcode_p.h +436 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86operand.cpp +231 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86operand.h +1085 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86rapass.cpp +1509 -0
- data/ext/asmjit/asmjit/src/asmjit/x86/x86rapass_p.h +94 -0
- data/ext/asmjit/asmjit/src/asmjit/x86.h +93 -0
- data/ext/asmjit/asmjit/src/asmjit.natvis +245 -0
- data/ext/asmjit/asmjit/test/asmjit_test_assembler.cpp +84 -0
- data/ext/asmjit/asmjit/test/asmjit_test_assembler.h +85 -0
- data/ext/asmjit/asmjit/test/asmjit_test_assembler_a64.cpp +4006 -0
- data/ext/asmjit/asmjit/test/asmjit_test_assembler_x64.cpp +17833 -0
- data/ext/asmjit/asmjit/test/asmjit_test_assembler_x86.cpp +8300 -0
- data/ext/asmjit/asmjit/test/asmjit_test_compiler.cpp +253 -0
- data/ext/asmjit/asmjit/test/asmjit_test_compiler.h +73 -0
- data/ext/asmjit/asmjit/test/asmjit_test_compiler_a64.cpp +690 -0
- data/ext/asmjit/asmjit/test/asmjit_test_compiler_x86.cpp +4317 -0
- data/ext/asmjit/asmjit/test/asmjit_test_emitters.cpp +197 -0
- data/ext/asmjit/asmjit/test/asmjit_test_instinfo.cpp +181 -0
- data/ext/asmjit/asmjit/test/asmjit_test_misc.h +257 -0
- data/ext/asmjit/asmjit/test/asmjit_test_perf.cpp +62 -0
- data/ext/asmjit/asmjit/test/asmjit_test_perf.h +61 -0
- data/ext/asmjit/asmjit/test/asmjit_test_perf_a64.cpp +699 -0
- data/ext/asmjit/asmjit/test/asmjit_test_perf_x86.cpp +5032 -0
- data/ext/asmjit/asmjit/test/asmjit_test_unit.cpp +172 -0
- data/ext/asmjit/asmjit/test/asmjit_test_x86_sections.cpp +172 -0
- data/ext/asmjit/asmjit/test/asmjitutils.h +38 -0
- data/ext/asmjit/asmjit/test/broken.cpp +312 -0
- data/ext/asmjit/asmjit/test/broken.h +148 -0
- data/ext/asmjit/asmjit/test/cmdline.h +61 -0
- data/ext/asmjit/asmjit/test/performancetimer.h +41 -0
- data/ext/asmjit/asmjit/tools/configure-makefiles.sh +13 -0
- data/ext/asmjit/asmjit/tools/configure-ninja.sh +13 -0
- data/ext/asmjit/asmjit/tools/configure-sanitizers.sh +13 -0
- data/ext/asmjit/asmjit/tools/configure-vs2019-x64.bat +2 -0
- data/ext/asmjit/asmjit/tools/configure-vs2019-x86.bat +2 -0
- data/ext/asmjit/asmjit/tools/configure-vs2022-x64.bat +2 -0
- data/ext/asmjit/asmjit/tools/configure-vs2022-x86.bat +2 -0
- data/ext/asmjit/asmjit/tools/configure-xcode.sh +8 -0
- data/ext/asmjit/asmjit/tools/enumgen.js +417 -0
- data/ext/asmjit/asmjit/tools/enumgen.sh +3 -0
- data/ext/asmjit/asmjit/tools/tablegen-arm.js +365 -0
- data/ext/asmjit/asmjit/tools/tablegen-arm.sh +3 -0
- data/ext/asmjit/asmjit/tools/tablegen-x86.js +2638 -0
- data/ext/asmjit/asmjit/tools/tablegen-x86.sh +3 -0
- data/ext/asmjit/asmjit/tools/tablegen.js +947 -0
- data/ext/asmjit/asmjit/tools/tablegen.sh +4 -0
- data/ext/asmjit/asmjit.cc +167 -30
- data/ext/asmjit/extconf.rb +9 -9
- data/lib/asmjit/version.rb +1 -1
- data/lib/asmjit.rb +14 -4
- metadata +198 -17
@@ -0,0 +1,94 @@
|
|
1
|
+
// This file is part of AsmJit project <https://asmjit.com>
|
2
|
+
//
|
3
|
+
// See asmjit.h or LICENSE.md for license and copyright information
|
4
|
+
// SPDX-License-Identifier: Zlib
|
5
|
+
|
6
|
+
#ifndef ASMJIT_X86_X86RAPASS_P_H_INCLUDED
|
7
|
+
#define ASMJIT_X86_X86RAPASS_P_H_INCLUDED
|
8
|
+
|
9
|
+
#include "../core/api-config.h"
|
10
|
+
#ifndef ASMJIT_NO_COMPILER
|
11
|
+
|
12
|
+
#include "../core/compiler.h"
|
13
|
+
#include "../core/rabuilders_p.h"
|
14
|
+
#include "../core/rapass_p.h"
|
15
|
+
#include "../x86/x86assembler.h"
|
16
|
+
#include "../x86/x86compiler.h"
|
17
|
+
#include "../x86/x86emithelper_p.h"
|
18
|
+
|
19
|
+
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
|
20
|
+
|
21
|
+
//! \cond INTERNAL
|
22
|
+
//! \addtogroup asmjit_x86
|
23
|
+
//! \{
|
24
|
+
|
25
|
+
//! X86 register allocation pass.
|
26
|
+
//!
|
27
|
+
//! Takes care of generating function prologs and epilogs, and also performs register allocation.
|
28
|
+
class X86RAPass : public BaseRAPass {
|
29
|
+
public:
|
30
|
+
ASMJIT_NONCOPYABLE(X86RAPass)
|
31
|
+
typedef BaseRAPass Base;
|
32
|
+
|
33
|
+
EmitHelper _emitHelper;
|
34
|
+
|
35
|
+
//! \name Construction & Destruction
|
36
|
+
//! \{
|
37
|
+
|
38
|
+
X86RAPass() noexcept;
|
39
|
+
virtual ~X86RAPass() noexcept;
|
40
|
+
|
41
|
+
//! \}
|
42
|
+
|
43
|
+
//! \name Accessors
|
44
|
+
//! \{
|
45
|
+
|
46
|
+
//! Returns the compiler casted to `x86::Compiler`.
|
47
|
+
inline Compiler* cc() const noexcept { return static_cast<Compiler*>(_cb); }
|
48
|
+
|
49
|
+
//! Returns emit helper.
|
50
|
+
inline EmitHelper* emitHelper() noexcept { return &_emitHelper; }
|
51
|
+
|
52
|
+
inline bool avxEnabled() const noexcept { return _emitHelper._avxEnabled; }
|
53
|
+
inline bool avx512Enabled() const noexcept { return _emitHelper._avx512Enabled; }
|
54
|
+
|
55
|
+
//! \}
|
56
|
+
|
57
|
+
//! \name Utilities
|
58
|
+
//! \{
|
59
|
+
|
60
|
+
inline uint32_t choose(uint32_t sseInstId, uint32_t avxInstId) noexcept {
|
61
|
+
return avxEnabled() ? avxInstId : sseInstId;
|
62
|
+
}
|
63
|
+
|
64
|
+
//! \}
|
65
|
+
|
66
|
+
//! \name Interface
|
67
|
+
//! \{
|
68
|
+
|
69
|
+
void onInit() noexcept override;
|
70
|
+
void onDone() noexcept override;
|
71
|
+
|
72
|
+
Error buildCFG() noexcept override;
|
73
|
+
|
74
|
+
Error _rewrite(BaseNode* first, BaseNode* stop) noexcept override;
|
75
|
+
|
76
|
+
Error emitMove(uint32_t workId, uint32_t dstPhysId, uint32_t srcPhysId) noexcept override;
|
77
|
+
Error emitSwap(uint32_t aWorkId, uint32_t aPhysId, uint32_t bWorkId, uint32_t bPhysId) noexcept override;
|
78
|
+
|
79
|
+
Error emitLoad(uint32_t workId, uint32_t dstPhysId) noexcept override;
|
80
|
+
Error emitSave(uint32_t workId, uint32_t srcPhysId) noexcept override;
|
81
|
+
|
82
|
+
Error emitJump(const Label& label) noexcept override;
|
83
|
+
Error emitPreCall(InvokeNode* invokeNode) noexcept override;
|
84
|
+
|
85
|
+
//! \}
|
86
|
+
};
|
87
|
+
|
88
|
+
//! \}
|
89
|
+
//! \endcond
|
90
|
+
|
91
|
+
ASMJIT_END_SUB_NAMESPACE
|
92
|
+
|
93
|
+
#endif // !ASMJIT_NO_COMPILER
|
94
|
+
#endif // ASMJIT_X86_X86RAPASS_P_H_INCLUDED
|
@@ -0,0 +1,93 @@
|
|
1
|
+
// This file is part of AsmJit project <https://asmjit.com>
|
2
|
+
//
|
3
|
+
// See asmjit.h or LICENSE.md for license and copyright information
|
4
|
+
// SPDX-License-Identifier: Zlib
|
5
|
+
|
6
|
+
#ifndef ASMJIT_X86_H_INCLUDED
|
7
|
+
#define ASMJIT_X86_H_INCLUDED
|
8
|
+
|
9
|
+
//! \addtogroup asmjit_x86
|
10
|
+
//!
|
11
|
+
//! ### Namespace
|
12
|
+
//!
|
13
|
+
//! - \ref x86 - x86 namespace provides support for X86/X64 code generation.
|
14
|
+
//!
|
15
|
+
//! ### Emitters
|
16
|
+
//!
|
17
|
+
//! - \ref x86::Assembler - X86/X64 assembler (must read, provides examples).
|
18
|
+
//! - \ref x86::Builder - X86/X64 builder.
|
19
|
+
//! - \ref x86::Compiler - X86/X64 compiler.
|
20
|
+
//! - \ref x86::Emitter - X86/X64 emitter (abstract).
|
21
|
+
//!
|
22
|
+
//! ### Supported Instructions
|
23
|
+
//!
|
24
|
+
//! - Emitters:
|
25
|
+
//! - \ref x86::EmitterExplicitT - Provides all instructions that use explicit operands, provides also utility
|
26
|
+
//! functions. The member functions provided are part of all X86 emitters.
|
27
|
+
//! - \ref x86::EmitterImplicitT - Provides all instructions that use implicit operands, these cannot be used
|
28
|
+
//! with \ref x86::Compiler.
|
29
|
+
//!
|
30
|
+
//! - Instruction representation:
|
31
|
+
//! - \ref x86::Inst::Id - Provides instruction identifiers for both X86/X86_64 architectures.
|
32
|
+
//! - \ref InstOptions - Provides generic and X86/X86_64 specific options.
|
33
|
+
//!
|
34
|
+
//! ### Register Operands
|
35
|
+
//!
|
36
|
+
//! - \ref x86::Reg - Base class for any X86 register.
|
37
|
+
//! - \ref x86::Gp - General purpose register:
|
38
|
+
//! - \ref x86::GpbLo - 8-bit low register.
|
39
|
+
//! - \ref x86::GpbHi - 8-bit high register.
|
40
|
+
//! - \ref x86::Gpw - 16-bit register.
|
41
|
+
//! - \ref x86::Gpd - 32-bit register.
|
42
|
+
//! - \ref x86::Gpq - 64-bit register (X64 only).
|
43
|
+
//! - \ref x86::Vec - Vector (SIMD) register:
|
44
|
+
//! - \ref x86::Xmm - 128-bit SIMD register (SSE+).
|
45
|
+
//! - \ref x86::Ymm - 256-bit SIMD register (AVX+).
|
46
|
+
//! - \ref x86::Zmm - 512-bit SIMD register (AVX512+).
|
47
|
+
//! - \ref x86::Mm - 64-bit MMX register.
|
48
|
+
//! - \ref x86::St - 80-bit FPU register.
|
49
|
+
//! - \ref x86::KReg - opmask registers (AVX512+).
|
50
|
+
//! - \ref x86::SReg - segment register.
|
51
|
+
//! - \ref x86::CReg - control register.
|
52
|
+
//! - \ref x86::DReg - debug register.
|
53
|
+
//! - \ref x86::Bnd - bound register (discontinued).
|
54
|
+
//! - \ref x86::Rip - relative instruction pointer.
|
55
|
+
//!
|
56
|
+
//! ### Memory Operands
|
57
|
+
//!
|
58
|
+
//! - \ref x86::Mem - X86/X64 memory operand that provides support for all X86 and X64 addressing features
|
59
|
+
//! including absolute addresses, index scales, and segment override prefixes.
|
60
|
+
//!
|
61
|
+
//! ### Status and Control Words
|
62
|
+
//!
|
63
|
+
//! - \ref x86::FpuStatusWord - FPU status word bits / decomposition.
|
64
|
+
//! - \ref x86::FpuControlWord - FPU control word bits / decomposition.
|
65
|
+
//!
|
66
|
+
//! ### Predicates (immediate values)
|
67
|
+
//!
|
68
|
+
//! - \ref x86::CmpImm - `CMP[PD|PS|SD|SS]` predicate (SSE+).
|
69
|
+
//! - \ref x86::PCmpStrImm - `[V]PCMP[I|E]STR[I|M]` predicate (SSE4.1+, AVX+).
|
70
|
+
//! - \ref x86::RoundImm - `[V]ROUND[PD|PS|SD|SS]` predicate (SSE+, AVX+).
|
71
|
+
//! - \ref x86::VCmpImm - `VCMP[PD|PS|SD|SS]` predicate (AVX+).
|
72
|
+
//! - \ref x86::VFixupImm - `VFIXUPIMM[PD|PS|SD|SS]` predicate (AVX512+).
|
73
|
+
//! - \ref x86::VFPClassImm - `VFPCLASS[PD|PS|SD|SS]` predicate (AVX512+).
|
74
|
+
//! - \ref x86::VGetMantImm - `VGETMANT[PD|PS|SD|SS]` predicate (AVX512+).
|
75
|
+
//! - \ref x86::VPCmpImm - `VPCMP[U][B|W|D|Q]` predicate (AVX512+).
|
76
|
+
//! - \ref x86::VPComImm - `VPCOM[U][B|W|D|Q]` predicate (XOP).
|
77
|
+
//! - \ref x86::VRangeImm - `VRANGE[PD|PS|SD|SS]` predicate (AVX512+).
|
78
|
+
//! - \ref x86::VReduceImm - `REDUCE[PD|PS|SD|SS]` predicate (AVX512+).
|
79
|
+
//! - \ref x86::TLogImm - `VPTERNLOG[D|Q]` predicate and operations (AVX512+).
|
80
|
+
|
81
|
+
#include "core.h"
|
82
|
+
|
83
|
+
#include "asmjit-scope-begin.h"
|
84
|
+
#include "x86/x86assembler.h"
|
85
|
+
#include "x86/x86builder.h"
|
86
|
+
#include "x86/x86compiler.h"
|
87
|
+
#include "x86/x86emitter.h"
|
88
|
+
#include "x86/x86globals.h"
|
89
|
+
#include "x86/x86instdb.h"
|
90
|
+
#include "x86/x86operand.h"
|
91
|
+
#include "asmjit-scope-end.h"
|
92
|
+
|
93
|
+
#endif // ASMJIT_X86_H_INCLUDED
|
@@ -0,0 +1,245 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
|
3
|
+
<!-- asmjit visualizer for Visual Studio (natvis) -->
|
4
|
+
|
5
|
+
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
|
6
|
+
<Type Name="asmjit::String">
|
7
|
+
<Intrinsic Name="isSmall" Expression="(_type < 0x1F)"/>
|
8
|
+
<DisplayString Condition="isSmall()">{_small.data, s8}</DisplayString>
|
9
|
+
<DisplayString Condition="!isSmall()">{_large.data, s8}</DisplayString>
|
10
|
+
<Expand HideRawView="true">
|
11
|
+
<Synthetic Name="_type">
|
12
|
+
<DisplayString Condition="(_type < 0x1F)">Small</DisplayString>
|
13
|
+
<DisplayString Condition="(_type == 0x1F)">Large</DisplayString>
|
14
|
+
<DisplayString Condition="(_type > 0x1F)">External</DisplayString>
|
15
|
+
</Synthetic>
|
16
|
+
<Item Name="_size" Condition="isSmall()" ExcludeView="simple">(int)_small.type, d</Item>
|
17
|
+
<Item Name="_size" Condition="!isSmall()" ExcludeView="simple">_large.size, d</Item>
|
18
|
+
<Item Name="_capacity" Condition="isSmall()" ExcludeView="simple">asmjit::String::kSSOCapacity, d</Item>
|
19
|
+
<Item Name="_capacity" Condition="!isSmall()" ExcludeView="simple">_large.capacity, d</Item>
|
20
|
+
<Item Name="_data" Condition="isSmall()" ExcludeView="simple">_small.data, s8</Item>
|
21
|
+
<Item Name="_data" Condition="!isSmall()" ExcludeView="simple">_large.data, s8</Item>
|
22
|
+
</Expand>
|
23
|
+
</Type>
|
24
|
+
|
25
|
+
<Type Name="asmjit::ZoneVector<*>">
|
26
|
+
<DisplayString>{{ [size={_size, d} capacity={_capacity, d}] }}</DisplayString>
|
27
|
+
<Expand>
|
28
|
+
<Item Name="_size" ExcludeView="simple">_size, d</Item>
|
29
|
+
<Item Name="_capacity" ExcludeView="simple">_capacity, d</Item>
|
30
|
+
<ArrayItems>
|
31
|
+
<Size>_size</Size>
|
32
|
+
<ValuePointer>(($T1*)_data)</ValuePointer>
|
33
|
+
</ArrayItems>
|
34
|
+
</Expand>
|
35
|
+
</Type>
|
36
|
+
|
37
|
+
<Type Name="asmjit::OperandSignature">
|
38
|
+
<Intrinsic Name="opType" Expression="(asmjit::OperandType)(_bits & 0x7)" />
|
39
|
+
<Intrinsic Name="opSize" Expression="(_bits >> 24) & 0xFF" />
|
40
|
+
<Intrinsic Name="regType" Expression="(asmjit::RegType)((_bits >> 3) & 0x1F)" />
|
41
|
+
<Intrinsic Name="regGroup" Expression="(asmjit::RegGroup)((_bits >> 8) & 0xF)" />
|
42
|
+
<Intrinsic Name="memBaseType" Expression="(asmjit::RegType)((_bits >> 3) & 0x1F)" />
|
43
|
+
<Intrinsic Name="memIndexType" Expression="(asmjit::RegType)((_bits >> 8) & 0x1F)" />
|
44
|
+
<Intrinsic Name="memRegHome" Expression="(bool)((_bits >> 13) & 0x1)" />
|
45
|
+
<Intrinsic Name="memX86Segment" Expression="(asmjit::x86::SReg::Id)((_bits >> 18) & 0x7)" />
|
46
|
+
<Intrinsic Name="memX86AddrType" Expression="(asmjit::x86::Mem::AddrType)((_bits >> 14) & 0x3)" />
|
47
|
+
<Intrinsic Name="memX86ShiftValue" Expression="((_bits >> 16) & 0x3)" />
|
48
|
+
<Intrinsic Name="memX86Broadcast" Expression="(asmjit::x86::Mem::Broadcast)((_bits >> 21) & 0x7)" />
|
49
|
+
<Intrinsic Name="immType" Expression="(asmjit::ImmType)((_bits >> 3) & 0x1)" />
|
50
|
+
|
51
|
+
<DisplayString Condition="opType() == asmjit::OperandType::kNone">[None]</DisplayString>
|
52
|
+
<DisplayString Condition="opType() == asmjit::OperandType::kReg">[Reg] {{ type={regType()} group={regGroup()} size={opSize(), d} }}</DisplayString>
|
53
|
+
<DisplayString Condition="opType() == asmjit::OperandType::kMem">[Mem] {{ base={memBaseType()} index={memIndexType()} }}</DisplayString>
|
54
|
+
<DisplayString Condition="opType() == asmjit::OperandType::kImm">[Imm] {{ type={immType()} }}</DisplayString>
|
55
|
+
<DisplayString Condition="opType() == asmjit::OperandType::kLabel">[Label]</DisplayString>
|
56
|
+
<DisplayString Condition="opType() > asmjit::OperandType::kMaxValue">[Unknown]</DisplayString>
|
57
|
+
|
58
|
+
<Expand HideRawView="true">
|
59
|
+
<Item Name="bits">_bits, X</Item>
|
60
|
+
<Item Name="op.type">opType()</Item>
|
61
|
+
<Item Name="reg.type" Condition="opType() == asmjit::OperandType::kReg">regType()</Item>
|
62
|
+
<Item Name="reg.group" Condition="opType() == asmjit::OperandType::kReg">regGroup()</Item>
|
63
|
+
<Item Name="reg.size" Condition="opType() == asmjit::OperandType::kReg">opSize(), d</Item>
|
64
|
+
<Item Name="mem.baseType" Condition="opType() == asmjit::OperandType::kMem">memBaseType()</Item>
|
65
|
+
<Item Name="mem.indexType" Condition="opType() == asmjit::OperandType::kMem">memIndexType()</Item>
|
66
|
+
<Item Name="mem.regHome" Condition="opType() == asmjit::OperandType::kMem">memRegHome()</Item>
|
67
|
+
<Item Name="mem.size" Condition="opType() == asmjit::OperandType::kMem">opSize(), d</Item>
|
68
|
+
<Item Name="mem.x86.segment" Condition="opType() == asmjit::OperandType::kMem">memX86Segment()</Item>
|
69
|
+
<Item Name="mem.x86.addrType" Condition="opType() == asmjit::OperandType::kMem">memX86AddrType()</Item>
|
70
|
+
<Item Name="mem.x86.shift" Condition="opType() == asmjit::OperandType::kMem">memX86ShiftValue()</Item>
|
71
|
+
<Item Name="mem.x86.broadcast" Condition="opType() == asmjit::OperandType::kMem">memX86Broadcast()</Item>
|
72
|
+
<Item Name="imm.type" Condition="opType() == asmjit::OperandType::kImm">immType()</Item>
|
73
|
+
</Expand>
|
74
|
+
</Type>
|
75
|
+
|
76
|
+
<Type Name="asmjit::Operand_">
|
77
|
+
<Intrinsic Name="opType" Expression="(asmjit::OperandType)(_signature._bits & 0x7)" />
|
78
|
+
<Intrinsic Name="opSize" Expression="(_signature._bits >> 24) & 0xFF" />
|
79
|
+
<Intrinsic Name="regType" Expression="(asmjit::RegType)((_signature._bits >> 3) & 0x1F)" />
|
80
|
+
<Intrinsic Name="regGroup" Expression="(asmjit::RegGroup)((_signature._bits >> 8) & 0xF)" />
|
81
|
+
<Intrinsic Name="memBaseType" Expression="(asmjit::RegType)((_signature._bits >> 3) & 0x1F)" />
|
82
|
+
<Intrinsic Name="memIndexType" Expression="(asmjit::RegType)((_signature._bits >> 8) & 0x1F)" />
|
83
|
+
<Intrinsic Name="memRegHome" Expression="(bool)((_signature._bits >> 13) & 0x1)" />
|
84
|
+
<Intrinsic Name="memX86Segment" Expression="(asmjit::x86::SReg::Id)((_signature._bits >> 18) & 0x7)" />
|
85
|
+
<Intrinsic Name="memX86AddrType" Expression="(asmjit::x86::Mem::AddrType)((_signature._bits >> 14) & 0x3)" />
|
86
|
+
<Intrinsic Name="memX86ShiftValue" Expression="((_signature._bits >> 16) & 0x3)" />
|
87
|
+
<Intrinsic Name="memX86Broadcast" Expression="(asmjit::x86::Mem::Broadcast)((_signature._bits >> 21) & 0x7)" />
|
88
|
+
<Intrinsic Name="memBaseId" Expression="_baseId" />
|
89
|
+
<Intrinsic Name="memIndexId" Expression="_data[0]" />
|
90
|
+
<Intrinsic Name="memOffset32b" Expression="(__int64)int(_data[1])" />
|
91
|
+
<Intrinsic Name="memOffset64b" Expression="(__int64) ((unsigned __int64)_baseId << 32) | ((unsigned __int64)_data[1])" />
|
92
|
+
<Intrinsic Name="memOffset" Expression="memBaseType() != asmjit::RegType::kNone ? memOffset32b() : memOffset64b()" />
|
93
|
+
<Intrinsic Name="immType" Expression="(asmjit::ImmType)((_signature._bits >> 3) & 0x1)" />
|
94
|
+
<Intrinsic Name="immValue" Expression="((__int64)_data[1] << 32) | (__int64)_data[0]" />
|
95
|
+
|
96
|
+
<DisplayString Condition="opType() == asmjit::OperandType::kNone">[None]</DisplayString>
|
97
|
+
<DisplayString Condition="opType() == asmjit::OperandType::kReg">[Reg] {{ id={_baseId, d} group={regGroup(), d} type={regType(), d} size={opSize(), d} }}</DisplayString>
|
98
|
+
<DisplayString Condition="opType() == asmjit::OperandType::kMem">[Mem] {{ baseId={memBaseId(), d} indexId={memIndexId(), d} offset={(__int64)memOffset(), d} }}</DisplayString>
|
99
|
+
<DisplayString Condition="opType() == asmjit::OperandType::kImm">[Imm] {{ val={immValue(), d} hex={immValue(), X} }}</DisplayString>
|
100
|
+
<DisplayString Condition="opType() == asmjit::OperandType::kLabel">[Label] {{ id={_baseId} }}</DisplayString>
|
101
|
+
<DisplayString Condition="opType() > 4">[Unknown]</DisplayString>
|
102
|
+
<Expand HideRawView="true">
|
103
|
+
<Item Name="_signature">_signature._bits, X</Item>
|
104
|
+
<Item Name="op.type">opType()</Item>
|
105
|
+
<Item Name="op.size">opSize(), d</Item>
|
106
|
+
<Item Name="reg.type" Condition="opType() == asmjit::OperandType::kReg">regType()</Item>
|
107
|
+
<Item Name="reg.group" Condition="opType() == asmjit::OperandType::kReg">regGroup()</Item>
|
108
|
+
<Item Name="reg.id" Condition="opType() == asmjit::OperandType::kReg">_baseId, d</Item>
|
109
|
+
<Item Name="mem.baseType" Condition="opType() == asmjit::OperandType::kMem">memBaseType()</Item>
|
110
|
+
<Item Name="mem.baseId" Condition="opType() == asmjit::OperandType::kMem && memBaseType() != asmjit::RegType::kNone">memBaseId()</Item>
|
111
|
+
<Item Name="mem.indexType" Condition="opType() == asmjit::OperandType::kMem">memIndexType()</Item>
|
112
|
+
<Item Name="mem.indexId" Condition="opType() == asmjit::OperandType::kMem && memIndexType() != asmjit::RegType::kNone">memIndexId()</Item>
|
113
|
+
<Item Name="mem.regHome" Condition="opType() == asmjit::OperandType::kMem">memRegHome()</Item>
|
114
|
+
<Item Name="mem.offset" Condition="opType() == asmjit::OperandType::kMem">memOffset(), d</Item>
|
115
|
+
<Item Name="mem.x86.segment" Condition="opType() == asmjit::OperandType::kMem">memX86Segment()</Item>
|
116
|
+
<Item Name="mem.x86.addrType" Condition="opType() == asmjit::OperandType::kMem">memX86AddrType()</Item>
|
117
|
+
<Item Name="mem.x86.shift" Condition="opType() == asmjit::OperandType::kMem">memX86ShiftValue()</Item>
|
118
|
+
<Item Name="mem.x86.broadcast" Condition="opType() == asmjit::OperandType::kMem">memX86Broadcast()</Item>
|
119
|
+
<Item Name="imm.type" Condition="opType() == asmjit::OperandType::kImm">immType()</Item>
|
120
|
+
<Item Name="imm.value" Condition="opType() == asmjit::OperandType::kImm">immValue(), X</Item>
|
121
|
+
<Item Name="label.id" Condition="opType() == asmjit::OperandType::kLabel">_baseId, d</Item>
|
122
|
+
<Item Name="raw.baseId">_baseId</Item>
|
123
|
+
<Item Name="raw.data[0]">_data[0]</Item>
|
124
|
+
<Item Name="raw.data[1]">_data[1]</Item>
|
125
|
+
</Expand>
|
126
|
+
</Type>
|
127
|
+
|
128
|
+
<Type Name="asmjit::FuncValue">
|
129
|
+
<Intrinsic Name="isReg" Expression="(_data & asmjit::FuncValue::kFlagIsReg) != 0" />
|
130
|
+
<Intrinsic Name="isStack" Expression="(_data & asmjit::FuncValue::kFlagIsStack) != 0" />
|
131
|
+
<Intrinsic Name="isIndirect" Expression="(_data & asmjit::FuncValue::kFlagIsIndirect) != 0" />
|
132
|
+
<Intrinsic Name="isDone" Expression="(_data & asmjit::FuncValue::kFlagIsDone) != 0" />
|
133
|
+
|
134
|
+
<Intrinsic Name="typeId" Expression="((_data & asmjit::FuncValue::kTypeIdMask) >> asmjit::FuncValue::kTypeIdShift)" />
|
135
|
+
<Intrinsic Name="regId" Expression="((_data & asmjit::FuncValue::kRegIdMask) >> asmjit::FuncValue::kRegIdShift)" />
|
136
|
+
<Intrinsic Name="regType" Expression="((_data & asmjit::FuncValue::kRegTypeMask) >> asmjit::FuncValue::kRegTypeShift)" />
|
137
|
+
<Intrinsic Name="stackOffset" Expression="((_data & asmjit::FuncValue::kStackOffsetMask) >> asmjit::FuncValue::kStackOffsetShift)" />
|
138
|
+
|
139
|
+
<DisplayString Condition="isReg()">[RegValue {{ regType={regType()} indirect={isIndirect()} done={isDone()} }}]</DisplayString>
|
140
|
+
<DisplayString Condition="isStack()">[StackValue {{ indirect={isIndirect()} done={isDone()} }}]</DisplayString>
|
141
|
+
<DisplayString Condition="!isReg() && !isStack()">[Unknown]</DisplayString>
|
142
|
+
|
143
|
+
<Expand HideRawView="true">
|
144
|
+
<Item Name="data">_data</Item>
|
145
|
+
<Item Name="typeId">(asmjit::TypeId)(typeId())</Item>
|
146
|
+
<Item Name="regType" Condition="isReg()">(asmjit::BaseReg::RegType)regType()</Item>
|
147
|
+
<Item Name="regId" Condition="isReg()">regId()</Item>
|
148
|
+
<Item Name="stackOffset" Condition="isStack()">stackOffset()</Item>
|
149
|
+
</Expand>
|
150
|
+
</Type>
|
151
|
+
|
152
|
+
<Type Name="asmjit::BaseNode">
|
153
|
+
<Intrinsic Name="nodeType" Expression="_any._nodeType" />
|
154
|
+
|
155
|
+
<Intrinsic Name="isInst" Expression="nodeType() == asmjit::NodeType::kInst"></Intrinsic>
|
156
|
+
<Intrinsic Name="isSection" Expression="nodeType() == asmjit::NodeType::kSection"></Intrinsic>
|
157
|
+
<Intrinsic Name="isLabel" Expression="nodeType() == asmjit::NodeType::kLabel"></Intrinsic>
|
158
|
+
<Intrinsic Name="isAlign" Expression="nodeType() == asmjit::NodeType::kAlign"></Intrinsic>
|
159
|
+
<Intrinsic Name="isEmbedData" Expression="nodeType() == asmjit::NodeType::kEmbedData"></Intrinsic>
|
160
|
+
<Intrinsic Name="isEmbedLabel" Expression="nodeType() == asmjit::NodeType::kEmbedLabel"></Intrinsic>
|
161
|
+
<Intrinsic Name="isEmbedLabelDelta" Expression="nodeType() == asmjit::NodeType::kEmbedLabelDelta"></Intrinsic>
|
162
|
+
<Intrinsic Name="isConstPool" Expression="nodeType() == asmjit::NodeType::kConstPool"></Intrinsic>
|
163
|
+
<Intrinsic Name="isComment" Expression="nodeType() == asmjit::NodeType::kComment"></Intrinsic>
|
164
|
+
<Intrinsic Name="isSentinel" Expression="nodeType() == asmjit::NodeType::kSentinel"></Intrinsic>
|
165
|
+
<Intrinsic Name="isJump" Expression="nodeType() == asmjit::NodeType::kJump"></Intrinsic>
|
166
|
+
<Intrinsic Name="isFunc" Expression="nodeType() == asmjit::NodeType::kFunc"></Intrinsic>
|
167
|
+
<Intrinsic Name="isFuncRet" Expression="nodeType() == asmjit::NodeType::kFuncRet"></Intrinsic>
|
168
|
+
<Intrinsic Name="isInvoke" Expression="nodeType() == asmjit::NodeType::kInvoke"></Intrinsic>
|
169
|
+
|
170
|
+
<Intrinsic Name="actsAsInst" Expression="isInst() || isJump() || isFunc() || isFuncRet() || isInvoke()" />
|
171
|
+
<Intrinsic Name="actsAsLabel" Expression="isLabel() || isFunc()" />
|
172
|
+
|
173
|
+
<DisplayString Condition="isInst()">[InstNode]</DisplayString>
|
174
|
+
<DisplayString Condition="isSection()">[SectionNode]</DisplayString>
|
175
|
+
<DisplayString Condition="isLabel()">[LabelNode]</DisplayString>
|
176
|
+
<DisplayString Condition="isAlign()">[AlignNode]</DisplayString>
|
177
|
+
<DisplayString Condition="isEmbedData()">[EmbedDataNode]</DisplayString>
|
178
|
+
<DisplayString Condition="isEmbedLabel()">[EmbedLabelNode]</DisplayString>
|
179
|
+
<DisplayString Condition="isEmbedLabelDelta()">[EmbedLabelDeltaNode]</DisplayString>
|
180
|
+
<DisplayString Condition="isConstPool()">[ConstPoolNode]</DisplayString>
|
181
|
+
<DisplayString Condition="isComment()">[CommentNode]</DisplayString>
|
182
|
+
<DisplayString Condition="isSentinel()">[SentinelNode]</DisplayString>
|
183
|
+
<DisplayString Condition="isJump()">[JumpNode]</DisplayString>
|
184
|
+
<DisplayString Condition="isFunc()">[FuncNode]</DisplayString>
|
185
|
+
<DisplayString Condition="isFuncRet()">[FuncRetNode]</DisplayString>
|
186
|
+
<DisplayString Condition="isInvoke()">[InvokeNode]</DisplayString>
|
187
|
+
<DisplayString Condition="nodeType() == asmjit::NodeType::kNone || nodeType() > 18">[UnknownNode {nodeType(), d}]</DisplayString>
|
188
|
+
|
189
|
+
<Expand HideRawView="true">
|
190
|
+
<Item Name="prev">_prev</Item>
|
191
|
+
<Item Name="next">_next</Item>
|
192
|
+
|
193
|
+
<Item Name="nodeType">_any._nodeType</Item>
|
194
|
+
<Item Name="nodeFlags">_any._nodeFlags</Item>
|
195
|
+
|
196
|
+
<Item Name="position">_position</Item>
|
197
|
+
<Item Name="userData.u64">_userDataU64</Item>
|
198
|
+
<Item Name="userData.ptr">_userDataPtr</Item>
|
199
|
+
<Item Name="passData">_passData</Item>
|
200
|
+
<Item Name="inlineComment">_inlineComment, s8</Item>
|
201
|
+
|
202
|
+
<Item Name="baseInst" Condition="actsAsInst()">((asmjit::InstNode*)this)->_baseInst</Item>
|
203
|
+
<Item Name="opCount" Condition="actsAsInst()">_inst._opCount</Item>
|
204
|
+
<Item Name="opCapacity" Condition="actsAsInst()">_inst._opCapacity</Item>
|
205
|
+
<Item Name="opArray" Condition="actsAsInst()">((asmjit::InstNode*)this)->_opArray, [_inst._opCount]</Item>
|
206
|
+
|
207
|
+
<Item Name="sectionId" Condition="isSection()">((asmjit::SectionNode*)this)->_id</Item>
|
208
|
+
<Item Name="nextSection" Condition="isSection()">((asmjit::SectionNode*)this)->_nextSection</Item>
|
209
|
+
|
210
|
+
<Item Name="labelId" Condition="isLabel()">((asmjit::LabelNode*)this)->_labelId</Item>
|
211
|
+
|
212
|
+
<Item Name="alignMode" Condition="isAlign()">((asmjit::AlignNode*)this)->_alignData._alignMode</Item>
|
213
|
+
<Item Name="alignment" Condition="isAlign()">((asmjit::AlignNode*)this)->_alignment</Item>
|
214
|
+
|
215
|
+
<Item Name="typeId" Condition="isEmbedData()">_embed._typeId, d</Item>
|
216
|
+
<Item Name="typeSize" Condition="isEmbedData()">_embed._typeSize, d</Item>
|
217
|
+
<Item Name="itemCount" Condition="isEmbedData()">((asmjit::EmbedDataNode*)this)->_itemCount</Item>
|
218
|
+
<Item Name="repeatCount" Condition="isEmbedData()">((asmjit::EmbedDataNode*)this)->_repeatCount</Item>
|
219
|
+
<Item Name="inlineData" Condition="isEmbedData()">((asmjit::EmbedDataNode*)this)->_inlineData</Item>
|
220
|
+
<Item Name="externalData" Condition="isEmbedData()">((asmjit::EmbedDataNode*)this)->_externalData</Item>
|
221
|
+
|
222
|
+
<Item Name="labelId" Condition="isEmbedLabel()">((asmjit::EmbedLabelNode*)this)->_labelId</Item>
|
223
|
+
|
224
|
+
<Item Name="labelId" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)->_labelId</Item>
|
225
|
+
<Item Name="baseLabelId" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)->_baseLabelId</Item>
|
226
|
+
<Item Name="dataSize" Condition="isEmbedLabelDelta()">((asmjit::EmbedLabelDeltaNode*)this)->_dataSize</Item>
|
227
|
+
|
228
|
+
<Item Name="constPool" Condition="isConstPool()">((asmjit::ConstPoolNode*)this)->_constPool</Item>
|
229
|
+
|
230
|
+
<Item Name="sentinel.sentinelType" Condition="isSentinel()">_sentinel._sentinelType</Item>
|
231
|
+
|
232
|
+
<Item Name="annotation" Condition="isJump()">((asmjit::JumpNode*)this)->_annotation</Item>
|
233
|
+
|
234
|
+
<Item Name="funcDetail" Condition="isFunc()">((asmjit::FuncNode*)this)->_funcDetail</Item>
|
235
|
+
<Item Name="frame" Condition="isFunc()">((asmjit::FuncNode*)this)->_frame</Item>
|
236
|
+
<Item Name="exitNode" Condition="isFunc()">((asmjit::FuncNode*)this)->_exitNode</Item>
|
237
|
+
<Item Name="end" Condition="isFunc()">((asmjit::FuncNode*)this)->_end</Item>
|
238
|
+
<Item Name="args" Condition="isFunc()">((asmjit::FuncNode*)this)->_args, [((asmjit::FuncNode*)this)->_funcDetail._argCount]</Item>
|
239
|
+
|
240
|
+
<Item Name="funcDetail" Condition="isInvoke()">((asmjit::InvokeNode*)this)->_funcDetail</Item>
|
241
|
+
<Item Name="rets" Condition="isInvoke()">((asmjit::InvokeNode*)this)->_rets</Item>
|
242
|
+
<Item Name="args" Condition="isInvoke()">((asmjit::InvokeNode*)this)->_args, [((asmjit::InvokeNode*)this)->_funcDetail._argCount]</Item>
|
243
|
+
</Expand>
|
244
|
+
</Type>
|
245
|
+
</AutoVisualizer>
|
@@ -0,0 +1,84 @@
|
|
1
|
+
// This file is part of AsmJit project <https://asmjit.com>
|
2
|
+
//
|
3
|
+
// See asmjit.h or LICENSE.md for license and copyright information
|
4
|
+
// SPDX-License-Identifier: Zlib
|
5
|
+
|
6
|
+
#include <asmjit/core.h>
|
7
|
+
#include <stdio.h>
|
8
|
+
#include <stdlib.h>
|
9
|
+
#include <string.h>
|
10
|
+
|
11
|
+
#include "asmjit_test_assembler.h"
|
12
|
+
#include "cmdline.h"
|
13
|
+
|
14
|
+
using namespace asmjit;
|
15
|
+
|
16
|
+
#if !defined(ASMJIT_NO_X86)
|
17
|
+
bool testX86Assembler(const TestSettings& settings) noexcept;
|
18
|
+
bool testX64Assembler(const TestSettings& settings) noexcept;
|
19
|
+
#endif
|
20
|
+
|
21
|
+
#if !defined(ASMJIT_NO_AARCH64)
|
22
|
+
bool testA64Assembler(const TestSettings& settings) noexcept;
|
23
|
+
#endif
|
24
|
+
|
25
|
+
int main(int argc, char* argv[]) {
|
26
|
+
CmdLine cmdLine(argc, argv);
|
27
|
+
|
28
|
+
TestSettings settings {};
|
29
|
+
settings.quiet = cmdLine.hasArg("--quiet");
|
30
|
+
settings.validate = cmdLine.hasArg("--validate");
|
31
|
+
|
32
|
+
printf("AsmJit Assembler Test-Suite v%u.%u.%u:\n\n",
|
33
|
+
unsigned((ASMJIT_LIBRARY_VERSION >> 16) ),
|
34
|
+
unsigned((ASMJIT_LIBRARY_VERSION >> 8) & 0xFF),
|
35
|
+
unsigned((ASMJIT_LIBRARY_VERSION ) & 0xFF));
|
36
|
+
|
37
|
+
printf("Usage:\n");
|
38
|
+
printf(" --help Show usage only\n");
|
39
|
+
printf(" --arch=<ARCH> Select architecture to run ('all' by default)\n");
|
40
|
+
printf(" --quiet Show only assembling errors [%s]\n", settings.quiet ? "x" : " ");
|
41
|
+
printf(" --validate Use instruction validation [%s]\n", settings.validate ? "x" : " ");
|
42
|
+
printf("\n");
|
43
|
+
|
44
|
+
if (cmdLine.hasArg("--help"))
|
45
|
+
return 0;
|
46
|
+
|
47
|
+
const char* arch = cmdLine.valueOf("--arch", "all");
|
48
|
+
bool x86Failed = false;
|
49
|
+
bool x64Failed = false;
|
50
|
+
bool aarch64Failed = false;
|
51
|
+
|
52
|
+
#if !defined(ASMJIT_NO_X86)
|
53
|
+
if ((strcmp(arch, "all") == 0 || strcmp(arch, "x86") == 0))
|
54
|
+
x86Failed = !testX86Assembler(settings);
|
55
|
+
|
56
|
+
if ((strcmp(arch, "all") == 0 || strcmp(arch, "x64") == 0))
|
57
|
+
x64Failed = !testX64Assembler(settings);
|
58
|
+
#endif
|
59
|
+
|
60
|
+
#if !defined(ASMJIT_NO_AARCH64)
|
61
|
+
if ((strcmp(arch, "all") == 0 || strcmp(arch, "aarch64") == 0))
|
62
|
+
aarch64Failed = !testA64Assembler(settings);
|
63
|
+
#endif
|
64
|
+
|
65
|
+
bool failed = x86Failed || x64Failed || aarch64Failed;
|
66
|
+
|
67
|
+
if (failed) {
|
68
|
+
if (x86Failed)
|
69
|
+
printf("** X86 test suite failed **\n");
|
70
|
+
|
71
|
+
if (x64Failed)
|
72
|
+
printf("** X64 test suite failed **\n");
|
73
|
+
|
74
|
+
if (aarch64Failed)
|
75
|
+
printf("** AArch64 test suite failed **\n");
|
76
|
+
|
77
|
+
printf("** FAILURE **\n");
|
78
|
+
}
|
79
|
+
else {
|
80
|
+
printf("** SUCCESS **\n");
|
81
|
+
}
|
82
|
+
|
83
|
+
return failed ? 1 : 0;
|
84
|
+
}
|
@@ -0,0 +1,85 @@
|
|
1
|
+
// This file is part of AsmJit project <https://asmjit.com>
|
2
|
+
//
|
3
|
+
// See asmjit.h or LICENSE.md for license and copyright information
|
4
|
+
// SPDX-License-Identifier: Zlib
|
5
|
+
|
6
|
+
#ifndef ASMJIT_TEST_ASSEMBLER_H_INCLUDED
|
7
|
+
#define ASMJIT_TEST_ASSEMBLER_H_INCLUDED
|
8
|
+
|
9
|
+
#include <asmjit/core.h>
|
10
|
+
#include <stdio.h>
|
11
|
+
|
12
|
+
struct TestSettings {
|
13
|
+
bool quiet;
|
14
|
+
bool validate;
|
15
|
+
};
|
16
|
+
|
17
|
+
template<typename AssemblerType>
|
18
|
+
class AssemblerTester {
|
19
|
+
public:
|
20
|
+
asmjit::Environment env {};
|
21
|
+
asmjit::CodeHolder code {};
|
22
|
+
AssemblerType assembler {};
|
23
|
+
asmjit::Label L0 {};
|
24
|
+
const TestSettings& settings;
|
25
|
+
|
26
|
+
size_t passed {};
|
27
|
+
size_t count {};
|
28
|
+
|
29
|
+
AssemblerTester(asmjit::Arch arch, const TestSettings& settings) noexcept
|
30
|
+
: env(arch),
|
31
|
+
settings(settings) {
|
32
|
+
prepare();
|
33
|
+
}
|
34
|
+
|
35
|
+
void printHeader(const char* archName) noexcept {
|
36
|
+
printf("%s assembler tests:\n", archName);
|
37
|
+
}
|
38
|
+
|
39
|
+
void printSummary() noexcept {
|
40
|
+
printf(" Passed: %zu / %zu tests\n\n", passed, count);
|
41
|
+
}
|
42
|
+
|
43
|
+
bool didPass() const noexcept { return passed == count; }
|
44
|
+
|
45
|
+
void prepare() noexcept {
|
46
|
+
code.reset();
|
47
|
+
code.init(env, 0);
|
48
|
+
code.attach(&assembler);
|
49
|
+
L0 = assembler.newLabel();
|
50
|
+
|
51
|
+
if (settings.validate)
|
52
|
+
assembler.addDiagnosticOptions(asmjit::DiagnosticOptions::kValidateAssembler);
|
53
|
+
}
|
54
|
+
|
55
|
+
ASMJIT_NOINLINE bool testInstruction(const char* expectedOpcode, const char* s, uint32_t err) noexcept {
|
56
|
+
count++;
|
57
|
+
|
58
|
+
if (err) {
|
59
|
+
printf(" !! %s\n"
|
60
|
+
" <%s>\n", s, asmjit::DebugUtils::errorAsString(err));
|
61
|
+
prepare();
|
62
|
+
return false;
|
63
|
+
}
|
64
|
+
|
65
|
+
asmjit::String encodedOpcode;
|
66
|
+
asmjit::Section* text = code.textSection();
|
67
|
+
|
68
|
+
encodedOpcode.appendHex(text->data(), text->bufferSize());
|
69
|
+
if (encodedOpcode != expectedOpcode) {
|
70
|
+
printf(" !! [%s] <- %s\n"
|
71
|
+
" [%s] (Expected)\n", encodedOpcode.data(), s, expectedOpcode);
|
72
|
+
prepare();
|
73
|
+
return false;
|
74
|
+
}
|
75
|
+
|
76
|
+
if (!settings.quiet)
|
77
|
+
printf(" OK [%s] <- %s\n", encodedOpcode.data(), s);
|
78
|
+
|
79
|
+
passed++;
|
80
|
+
prepare();
|
81
|
+
return true;
|
82
|
+
}
|
83
|
+
};
|
84
|
+
|
85
|
+
#endif // ASMJIT_TEST_ASSEMBLER_H_INCLUDED
|